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