利用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
.
发表评论