本文将介绍如何搭建syslog服务器,并使用Apache Log4j2
将日志数据输出到syslog服务器,同时验证syslog的转发功能。
在Linux系统中使用rsyslog服务进行日志服务器的搭建,通常在Linux系统中已经安装了该服务但未启动。
首先通过查看服务状态确认是否已经安装该服务,以及服务是否为运行状态。
root@westone:~# systemctl status rsyslog.service
● rsyslog.service - System Logging Service
Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-01-10 01:39:29 UTC; 3 days ago
TriggeredBy: ● syslog.socket
Docs: man:rsyslogd(8)
man:rsyslog.conf(5)
https://www.rsyslog.com/doc/
Main PID: 921 (rsyslogd)
Tasks: 10 (limit: 2196)
Memory: 4.7M
CPU: 401ms
CGroup: /system.slice/rsyslog.service
└─921 /usr/sbin/rsyslogd -n -iNONE
syslog服务支持TCP
和UDP
两种通讯协议,通过修改配置可以同时启用,服务的配置文件路径为/etc/rsyslog.conf
,删除module和input前的注释。
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")
重启服务使配置生效。
systemctl restart rsyslog.service
此时可以看到rsyslogd进程已经监听了514
端口。
配置文件中默认配置了IncludeConfig
目录,我们可以将自定义的配置放在/etc/rsyslog.d/
目录下。
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
在/etc/rsyslog.d
目录下创建配置文件local0.conf
,文件内容如下:
# 配置可以接收日志的网段
$AllowedSender TCP, 127.0.0.1, 192.168.137.0/24
$AllowedSender UDP, 127.0.0.1, 192.168.137.0/24
# 配置日志模板
# remote-incoming-logs为自定义的日志模板名称
# 该配置表示将在`/var/log/rsyslog/`目录下按照主机名称,每天创建一个日志文件
$template remote-incoming-logs,"/var/log/rsyslog/%HOSTNAME%/%PROGRAMNAME%_%$YEAR%-%$MONTH%-%$DAY%.log"
# 过滤facility为local0的日志使用该模板
local0.* ?remote-incoming-logs
# 配置远程转发
local0.* @@192.168.137.100
完成自定义配置后,可以通过命令检查配置语法是否正确。
root@westone:/etc/rsyslog.d# rsyslogd /etc/rsyslog.d/local0.conf
usage: rsyslogd [options]
use "man rsyslogd" for details. To run rsyslog interactively, use "rsyslogd -n"
to run it in debug mode use "rsyslogd -dn"
For further information see https://www.rsyslog.com/doc/
修改配置的目标日志文件路径的用户和分组,否则在记录日志时将会出现没有权限的错误。
chown syslog:adm /var/log/rsyslog/
重启rsyslog服务使配置生效。
systemctl restart rsyslog.service
同时可以查看rsyslog服务启动时是否有错误。
journalctl -xfu rsyslog
基于Spring Boot
开发时,需要在引入依赖时排除对默认的logback
日志组件的依赖,并加入spring-boot-starter-log4j2
的依赖。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.7.5version>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-log4j2artifactId>
<version>2.7.5version>
dependency>
在log4j2.xml
配置Syslog
的appender,日志格式遵从RFC5424
规范,并设置日志服务器的地址和端口,将facility设置为与上位
<configuration status="WARN">
<appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>
Console>
<Syslog name="SYSLOG" format="RFC5424" host="192.168.137.218" port="514" protocol="UDP" appName="test-app"
facility="LOCAL0"/>
appenders>
<loggers>
<root level="info">
<appender-ref ref="SYSLOG"/>
<appender-ref ref="CONSOLE"/>
root>
loggers>
configuration>
编写一个简单的测试接口类,输出当前的系统时间,日志组件将会把内容输出到syslog服务器上。
@RestController
@Slf4j
public class HelloController {
@GetMapping("/now")
public String now() {
String now = "Now: " + LocalDateTime.now();
log.info(now);
return now;
}
}
启动测试服务,调用测试接口,可以看到除了在控制台会输出信息,在日志服务器的/var/log/rsyslog/WST-20220825QHX
目录下会生成当前日志的日志文件,其中WST-20220825QHX
是测试服务所在机器的主机名。
root@westone:/var/log/rsyslog/WST-20220825QHX# ls
test-app_2023-01-13.log
日志内容与控制台输出的内容一致。
由于我们在rsyslog配置文件中增加了转发的规则,该日志同时会以UDP协议转发到指定的服务器上,该服务器的rsyslog配置可参考上文的内容。
# 配置远程转发
local0.* @@192.168.137.100