rsyslog简介
rsyslog
是一个高度可配置的、功能强大的系统日志守护进程,广泛用于 UNIX 和 Linux 系统中。它是 syslog
的一个扩展版本,提供了许多额外的功能和改进。能够收集、过滤、存储和转发日志数据。它的灵活性和扩展性使其成为现代 Linux 系统中日志管理的重要组成部分。
主要功能
-
日志收集:
rsyslog
能够收集来自系统、应用程序和网络设备的日志信息。- 支持多种输入来源,包括本地文件、网络套接字和远程日志传输。
-
日志过滤:
- 通过配置文件中的规则,可以对日志进行过滤、分类和处理。
- 支持按设施、严重性、内容等条件进行日志选择和处理。
-
日志转发:
- 支持将日志转发到其他
rsyslog
实例或日志管理系统。 - 可以通过 UDP、TCP 或 RELP 协议进行远程日志传输。
- 支持将日志转发到其他
-
日志存储:
- 可以将日志消息存储到文件、数据库或其他存储后端。
- 支持日志轮转和归档功能,以管理日志文件的大小和存储期限。
-
日志格式化:
- 支持自定义日志格式,通过模板将日志消息格式化为所需的结构。
-
模块化设计:
rsyslog
采用模块化架构,支持加载和卸载各种插件和模块。- 常用模块包括输入模块(imfile、imudp、imtcp)、输出模块(omfile、omrelp、ommysql)等。
主要组件
-
输入模块(Input Modules):
用于接收日志数据。包括从文件、网络、系统日志等来源接收日志。 -
过滤器(Filters):
用于根据规则筛选和处理日志消息。例如,过滤掉不需要的日志、将日志重定向到特定文件等。 -
输出模块(Output Modules):
用于将日志数据输出到目标位置,如文件、数据库或远程服务器。 -
模板(Templates):
用于自定义日志消息的格式。可以定义消息的结构、内容和格式,以满足特定的需求。
使用场景
- 系统监控:监控系统运行状况、错误和警告信息。
- 安全审计:记录和分析安全事件,如登录尝试和系统访问。
- 集中日志管理:将日志从多个系统集中到一个位置,以便于管理和分析。
- 故障排除:分析和排查系统和应用程序故障的根本原因。
配置方法
比如有个场景,需要把服务器A上的某个app的日志转发到服务器B上,这里的A和B上默认都安装了rsyslog。那么,我们可以称A为客户端,B为服务端。
配置服务端
rsyslog的配置文件默认在/etc/下,名为rsyslog.conf。除了rsyslog.conf,还有一个rsyslog.d目录,这个目录下保存的是自定义文件。
1. 编辑配置文件 /etc/rsyslog.conf
-
启用 UDP 或 TCP 监听:
# 监听 UDP 514 端口:
$ModLoad imudp
$UDPServerRun 514
# 或者监听 TCP 514 端口:
$ModLoad imtcp
$InputTCPServerRun 514
-
设置日志接收规则
指定如何处理接收到的日志,例如,将接收到的日志写入指定的文件夹:
if $fromhost-ip == 'client-ip' then /var/log/remote_logs.log
& stop
将 client-ip
替换为客户端机器的 IP 地址,注意 & stop
单独放在一行。
2. 校验rsyslog
配置
为了确保配置文件语法正确,可以使用以下命令检查 rsyslog
配置文件:
rsyslogd -N1
参数说明:
-N
: 表示进行配置文件的语法检查。-1
: 表示验证级别为 1,进行基本的语法检查,不包括更详细的错误检查。
3. 重启 rsyslog
服务
systemctl restart rsyslog
4. 检查防火墙设置
检查防火墙或者iptables的配置,确保开放了 514
端口,并且注意是使用的 UDP 还是 TCP 协议。
配置客户端
因为我们想要实现的是转发指定app的日志,假设我们的app日志文件存储在 /var/log/myapp.log
中。
1. 编辑 rsyslog
配置文件
既然是自定义app日志,所以建议在/etc/rsyslog.d下创建一个名为myapp.conf的文件配置文件。当然,你也可以直接使用/etc/rsyslog.conf
。好了,现在打开 /etc/rsyslog.conf
或 /etc/rsyslog.d/myapp.conf。
a.添加imfile模块的
配置:
# 读取自定义日志文件
$InputFileName /var/log/myapp.log
$InputFileTag myapp-log:
$InputFileStateFile stat-myapp
$InputFileSeverity info
$InputFileFacility local0
$InputRunFileMonitor
这些参数是 rsyslog
的文件输入模块 imfile
的配置,用于监控自定义日志文件,并将日志内容转发或处理。以下是每个参数的详细解释:
$InputFileName
- 作用:指定需要监控的自定义日志文件的路径。
- 示例:
$InputFileName /var/log/myapp.log
- 这意味着
rsyslog
将监控/var/log/myapp.log
文件,捕获该文件中的日志条目。
- 这意味着
$InputFileTag
- 作用:为监控的日志文件生成一个标识标签,标识日志的来源。
- 示例:
$InputFileTag myapp-log:
- 这为从
/var/log/myapp.log
文件中读取的每条日志记录添加了myapp-log:
这个标签。这个标签可以在rsyslog
规则中用来匹配、过滤或转发特定日志。
- 这为从
$InputFileStateFile
- 作用:指定一个状态文件,用来保存文件的读取状态(例如文件上次读取到的位置)。它用于在
rsyslog
重启后,继续从上次中断的地方读取日志。 - 示例:
$InputFileStateFile stat-myapp
-
这个状态文件
stat-myapp
会保存在/var/spool/rsyslog/
目录下,记录了/var/log/myapp.log
文件的读取进度。 -
如果不指定状态文件,
rsyslog
默认会自动生成一个基于文件名的状态文件。
-
$InputFileSeverity
- 作用:指定从该日志文件读取的日志的严重性级别(Severity)。严重性级别用于对日志进行分类,比如
info
、error
、warning
等。 - 示例:
$InputFileSeverity info
- 这表示将日志的严重性设置为
info
级别,意味着这些日志信息通常是常规操作信息。
emerg
: 系统不可用alert
: 必须立即采取行动crit
: 严重情况err
: 错误warning
: 警告notice
: 正常但重要的信息info
: 信息性消息debug
: 调试消息
- 这表示将日志的严重性设置为
$InputFileFacility
-
作用:指定日志的设施(Facility)。设施定义了日志消息的来源类别,用于将不同来源的日志分开。
-
示例:
$InputFileFacility local0
- 这意味着日志来源类别为
local0
,这是可供用户自定义的日志设施之一。local0
到local7
是为用户定义的日志设施,常用于自定义应用程序日志。
常见设施:
auth
: 认证系统使用cron
: 定时任务使用daemon
: 后台服务使用kern
: 内核日志local0
到local7
: 用户自定义使用syslog
:syslog
自身日志
- 这意味着日志来源类别为
$InputRunFileMonitor
- 作用:启动对指定文件的监控。
- 示例:
$InputRunFileMonitor
- 这行指令告诉
rsyslog
开始监控你通过$InputFileName
指定的文件。一旦文件有新日志生成,rsyslog
就会立即读取并处理这些日志。
- 这行指令告诉
b. 配置转发规则
在同一个配置文件中,添加规则将这些自定义日志转发到服务端。可以根据需要选择 UDP 或 TCP 进行转发:
-
使用 UDP 转发:
if $syslogtag == 'myapp-log:' then @remote-host:514
-
使用 TCP 转发:
if $syslogtag == 'myapp-log:' then @@remote-host:514
将remote-host
替换为服务端的 IP 地址或主机名,514
是syslog 的默认端口。
2. 校验rsyslog
配置
同前面一样,为了确保配置文件语法正确,执行以下命令:
rsyslogd -N1
这不,刚好发现了错误:
[root@localhost /etc]$ rsyslogd -N1
rsyslogd: version 7.4.7, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: invalid or yet-unknown config file command 'inputFileName' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputFileTag' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputFileStateFile' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputFileSeverity' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputFileFacility' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'InputRunFileMonitor' - have you forgotten to load a module? [try http://www.rsyslog.com/e/3003 ]
rsyslogd: End of config validation run. Bye.
上面日志表示rsyslog的版本是7.4.7, 无法识别配置中的那些命令。看到这个,那说明是版本的问题了。
从错误信息来看,当前的 rsyslog
版本7.4.7,InputFileName
、InputFileTag
等指令在该版本中无效或未知。
这种情况,要么升级rsyslog,要么修改配置的命令为当前版本。为了省事,我选择后者,修改配置:
# /etc/rsyslog.conf 或 /etc/rsyslog.d/ 文件
# 加载 imfile 模块
module(load="imfile")
# 配置文件监控
input(type="imfile"
File="/var/log/myapp.log"
Tag="myapp-log:"
StateFile="stat-myapp"
Severity="info"
Facility="local0")
# 转发日志到服务端
if $programname == 'myapp-log' then @logserver.example.com:514
在修改配置后,重新使用rsyslogd -N1命令检查配置是否正确。
3. 重启 rsyslog
服务
配置完成后,重启 rsyslog
服务以使新配置生效:
systemctl restart rsyslog
4. 检查防火墙设置
检查防火墙或者iptables的配置,确保能ping通服务端及其 514
端口。
5. 验证日志传输
客户端和服务端配置都修改完成了,现在验证日志是否能正确转发和接收。
- 在客户端查看
/var/log/myapp.log
中的日志是否有新生成的日志。 - 在服务端查看
/var/log/remote_myapp.log
文件,是否正确记录了从客户端转发过来的自定义日志。
如果没有日志,可以使用工具如 nc
(netcat)进行测试:
echo "test log" | nc -u logserver.example.com 514
正常情况下, 服务端查看 /var/log/remote_myapp.log
文件中会出现"test log"的日志。如果没有,则需要检查下检查网络连接和防火墙设置,确保没有阻止日志转发。