使用rsyslog集中管理日志

· Read in about 2 min · (304 Words)
dev work

关于syslog

Syslog是linux上传统的日志管理工具,而rsyslog是其改进版。很多系统都已将syslog替换为rsyslog进行日志管理了。

Syslog相关知识

  • Facility设施
代码 名称 描述
0 kern 内核
1 user 用户级
2 mail 邮件
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消息字段

除了startswithcontains外,还有其它比较关键词: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;
# }

相关资料

Comments