使用rsyslog集中管理日志
关于syslog
Syslog是linux上传统的日志管理工具,而rsyslog是其改进版。很多系统都已将syslog替换为rsyslog进行日志管理了。
Syslog相关知识
- Facility设施
代码 | 名称 | 描述 |
---|---|---|
0 | kern | 内核 |
1 | user | 用户级 |
2 | 邮件 | |
3 | daemon | 系统 |
4 | auth | 安全与授权 |
5 | syslog | 守护进程 |
6 | lpr | 打印相关 |
7 | news | 网络消息 |
8 | uucp | uucp子系统 |
9 | 时钟 | |
10 | authpriv | 安全与授权 |
11 | ftp | FTP |
12 | - | NTP |
13 | - | 日志审计 |
14 | - | 日志报警 |
15 | cron | 定时器 |
16 | local0 | 用户自定义 |
17 | local1 | 用户自定义 |
18 | local2 | 用户自定义 |
19 | local3 | 用户自定义 |
20 | local4 | 用户自定义 |
21 | local5 | 用户自定义 |
22 | local6 | 用户自定义 |
23 | local7 | 用户自定义 |
- Level级别(重要性从高到低)
代码 | 级别 | 名称 | 描述 |
---|---|---|---|
0 | Emergency | emerg | 紧急 |
1 | Alert | alert | 报警 |
2 | Critical | crit | 关键 |
3 | Error | err | 错误 |
4 | Warning | warn | 警告 |
5 | Notice | notice | 通知 |
6 | Informational | info | 消息 |
7 | Debug | debug | 调试 |
使用rsyslog记录日志
当前很多应用都已支持syslog进行日志记录
docker
docker run --log-driver=syslog --log-opt syslog-facility=local0 --log-opt tag=logTag
systemd
# example.service [service] StandardOutput=syslog StandardError=syslog SyslogIdentifier=example SyslogFacility=local0
启动一个rsyslog服务端
一般linux服务器上已包含的rsyslog包都具有服务功能,但是默认没有启用。
如果要启用日志服务器功能,则需要修改/etc/rsyslog.conf
这个文件。
更改如下:
# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
# 取消上面两行的注释,如下所示,即可开启UDP端口514进行日志收集
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")
# 取消上面两行的注释,如下所示,即可开启TCP端口514进行日志收集
module(load="imtcp")
input(type="imtcp" port="514")
如果只需要UDP或者TCP方式,只需要取消注释对应的两行即可。
客户端日志发送到远程服务端
假如需要将A服务器上日志发送到B服务器,需要B服务器上rsyslog接收日志功能开启。
同时,修改A服务器上/etc/rsyslog.conf
文件。
更改示例如下:
# 正常日志保存如下所示
# [facility].[level] [destination]
# 示例: mail.warn /var/log/mail.warn
# 三种发送方式
# UDP 前缀为@ @192.168.1.2:514
# TCP 前缀为@@ @@192.168.1.2:514
# RELP 前缀为:omrelp: :omrelp:192.168.1.2:514
# 将local0的所有日志以UDP都发送到192.168.1.2这如机器上(默认端口号是514)
local0.* @192.168.1.2
# 将user类应用产生的info级别日志以TCP方式发送到192.168.1.2这台机器上,端口号是514
user.info @@192.168.1.2:514
# 通过syslog的tag进行区分,将以myapp-为前缀的日志发送到远程服务器上
:syslogtag, startswith, "myapp-" @@192.168.1.2
# 通过消息内容过滤,包含sns_log的发送到远程服务器上
:rawmsg, contains, "sns_log" @@192.168.1.2
# 丢弃含有sns_debug的消息
:rawmsg, contains, "sns_debug" ~
注意此文件是顺序相关的。
此处的rawmsg
是消息字段,详见rsyslog消息字段
除了startswith
与contains
外,还有其它比较关键词:isequal
, regex
, contains_i
, ereregex
, isempty
服务端接收远程日志
服务端也需要对/etc/rsyslog.conf
进行相应修改,以接收远程日志。
更改示例:
# 定义一个名为customformat模板, 为信息加上日志时间
$template customformat, "%TIMESTAMP:::date-mysql% %FROMHOST-IP%%msg%n"
# 定义日志文件的名称,按照年月日
$template DynFile, "/var/log/%$programname%%$year%%$month%%$day%.log"
# 把rawmsg(也可以使用msg)日志中包含sns_log标志的信息写到DynFile定义的日志文件里
:rawmsg, contains, "sns_log" ?DynFile;customformat
# 这个表示丢弃包含sns_debug标志的信息, 一般都加上它, 以免多个日志文件记录重复的日志
:rawmsg, contains, "sns_debug" ~
将非syslog日志转发到远程服务端
这里假设有一个helloworld
的应用,产生的日志记录到了/var/log/helloworld.log
这个文件中。
首先,在应用所有机器上,修改/etc/rsyslog.conf
配置文件。
# 加载imfile这个模块
module(load="imfile" PollingInterval="5")
# 指定日志文件路径以及tag, severity, facility这些参数
input(type="imfile" File="/var/log/helloworld.log" Tag="helloworld" Severity="error" Facility="local0")
# 将helloworld的应用日志发送到远程服务器
:programname, contains, "helloworld" @192.168.1.2
Nginx日志发送到rsyslog
Nginx(1.7.1+)可以直接发送日志到rsyslog,如下所示:
# nginx.conf
# server {
error_log syslog:server=192.168.1.1 debug; # 将debug类型日志发送到192.168.1.1这台机器上
access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;
# }