利用nxlog的syslog推送能力,实现Windows和Linux的日志互通

需要发送日志,使用nxlog社区版即可。

下载nxlog社区版 https://nxlog.co/downloads/nxlog-ce#nxlog-community-edition


当然,最终的处理我们还是使用Linux,按照以下配置,添加在配置文件末尾,注意路径,需要转意。


Windows配置方法

C:\Program Files\nxlog\conf\nxlog.conf

# 定义输入源1
<Input in1>
    Module  im_file
    File    "F:\\SteamLibrary\\steamapps\\common\\SquadDedicatedServer\\SquadGame\\Saved\\Logs\\SquadGame.log" 
    SavePos TRUE
    Exec    $Message = $raw_event; # 获取原始日志
    Exec    $Message = $Message + " 标记1"; # 添加标记
</Input>

# 定义输入源2
<Input in2>
    Module  im_file
    File    "path_to_your_second_log_file"
    SavePos TRUE
    Exec    $Message = $raw_event; # 获取原始日志
    Exec    $Message = $Message + " 标记2"; # 添加标记
</Input>

# 定义输出到第一个服务器
<Output out1>
    Module      om_tcp
    Host        first_linux_server_ip
    Port        514
    Exec        to_syslog_bsd(); # 转换为BSD syslog格式
</Output>

# 定义输出到第二个服务器
<Output out2>
    Module      om_tcp
    Host        second_linux_server_ip
    Port        514
    Exec        to_syslog_bsd(); # 转换为BSD syslog格式
</Output>

# 路由规则1 - 从每个输入到第一个输出
<Route r1>
    Path        in1, in2 => out1
</Route>

# 路由规则2 - 从每个输入到第二个输出
<Route r2>
    Path        in1, in2 => out2
</Route>

根据需求,选择是否添加标记,选择是否输出到第二个服务器。

注意修改其中的路径和目标地址。


Windows在以管理员启动的CMD重启此程序:

C:\Windows\System32>net stop nxlog
The nxlog service was stopped successfully.
C:\Windows\System32>net start nxlog
The nxlog service is starting.
The nxlog service was started successfully.


Linux的配置方法

这里使用两个方法进行配置,rsyslog和syslog-ng

首先是rsyslog

/etc/rsyslog.conf

module(load="imfile" PollingInterval="1") # 加载 imfile 模块

input(type="imfile"
      File="/home/steam/squad_server/SquadGame/Saved/Logs/SquadGame.log"
      Tag="Soi_BCTC#0"
      StateFile="statefile-name"
      Severity="info"
      Facility="BCTC0")

*.* @@42.193.48.240:514 # 使用 TCP 发送


重启rsyslog

systemctl restart rsyslog.service


此方法方法会连同系统日志一并发送。

这里记录一种syslog-ng的。

/etc/syslog-ng/syslog-ng.conf

# 定义第一个文件的源
source s_file1 {
    file("/home/steam/squad_server/SquadGame/Saved/Logs/SquadGame.log" follow-freq(1) flags(no-parse));
};

# 定义第一个文件的目的地(可替换为不同的远程地址)
destination d_remote_syslog1 {
    syslog("42.193.48.240" transport("tcp") port(514));
};

# 为第一个文件添加标记
rewrite r_tag1 {
    set("Soi_BCTC#0", value("PROGRAM"));
};

# 定义日志路径
log { source(s_file1); rewrite(r_tag1); destination(d_remote_syslog1); };


#第二份日志,不同标记发往不同目标 ,注意修改 s_file2 d_remote_syslog2 r_tag2
source s_file2 {
    file("/home/steam/squad_server1/SquadGame/Saved/Logs/SquadGame.log" follow-freq(1) flags(no-parse));
};
destination d_remote_syslog2 {
    syslog("42.193.48.240" transport("tcp") port(514)); # 若发送到不同地址,更改 IP
};
rewrite r_tag2 {
    set("Soi_BCTC#1", value("PROGRAM"));
};
log { source(s_file2); rewrite(r_tag2); destination(d_remote_syslog2); };


重启syslog-ng

systemctl restart syslog-ng



至于Linux服务器接收,应该是这样的:

/etc/rsyslog.conf

# 示例:将包含 "标记2" 的日志存储到特定文件
if $msg contains '标记2' then /path/to/specific/file.log


更全面的接收规则:

# 加载TCP模块并监听514端口
module(load="imtcp")
input(type="imtcp" port="514" Ruleset="remote")

# 定义规则集
ruleset(name="remote") {
    # 仅接受来自特定IP的日志
    if $fromhost-ip == '172.16.0.1' then {
        # 根据标记将日志重定向到不同的文件
        if $msg contains '标记1' then /SquadRemoteLog/OriginalLog/qingya1.log
        & stop

        if $msg contains '标记2' then /SquadRemoteLog/OriginalLog/qita
        & stop
    }
}


#或者只用标记区分
if $msg contains 'Sot_BCTC#0' then /SquadRemoteLog/OriginalLog/Soi_0.log

#或以IP区分
if $fromhost-ip == '162.14.120.120' then /SquadRemoteLog/OriginalLog/Soi_0.log
& stop


重启,使其生效:

systemctl restart rsyslog


如果想整理格式,可以参考以下脚本:

#!/bin/bash

# 获取传入的参数
OrgName=$1        #文件名 - syslog-ng
HOSTNAME=$2       #标记名 - syslog-ng

LOG_FILE="/SquadRemoteLog/OriginalLog/${OrgName}.log"
PUT_FILE="/SquadRemoteLog/PutLog/${OrgName}.log"

# 检查日志文件是否存在
if [ ! -f "$LOG_FILE" ]; then
    echo "错误:日志文件 $LOG_FILE 不存在。"
    touch $LOG_FILE
    touch $PUT_FILE
fi

# 使用tail持续读取新的日志条目 - Linux下的syslog-ng发来
tail -f "$LOG_FILE" | while read LINE; do
    echo "$LINE" | awk -F"$HOSTNAME - - - " '{print $2}' >> $PUT_FILE
done

# Windows下的nxlog发来
# 使用tail持续读取新的日志条目
tail -f "$LOG_FILE" | while read LINE; do
    echo "$LINE" | sed -e "s/^.*$HOSTNAME //" -e "s/$OrgName$//" >> $PUT_FILE
done


利用syslog-ng进行接收

/etc/syslog-ng/syslog-ng.conf

source s_network {
    network(
        transport("tcp")
        port(514)
    );
    # 对于 UDP, 使用: transport("udp")
};

filter f_bctc1 { match("qingya1" value("MESSAGE")); };
filter f_soi_bctc_0 { match("Soi_BCTC#0" value("MESSAGE")); };

destination d_soi_0 { file("/SquadRemoteLog/OriginalLog/Soi_0.log"); };
destination d_bctc1 { file("/SquadRemoteLog/OriginalLog/qingya1.log"); };

log { source(s_network); filter(f_bctc1); destination(d_bctc1); flags(final); };
log { source(s_network); filter(f_soi_bctc_0); destination(d_soi_0); flags(final); };

重启syslog-ng

systemctl restart syslog-ng



.


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。