syslog 学习笔记

syslog 服务器可以用作日志监控中心,这样更容易地查看和获取重要的日志消息。rsyslog 是 syslog 的守护进程,预装在了大多数的Linux发行版中,扮演了两种角色:

  1. 作为服务器收集来自其他设施的日志信息;
  2. 作为客户端将其内部的日志信息传输到远程的 syslog 服务器。

相关文件的位置如下:

  • 执行文件: /sbin/rsyslogd
  • 主配置文件: /etc/rsyslog.conf
  • 自定义配置文件: /etc/rsyslog.d/*.conf

通过下面的命令可查看状态和重启服务:

1
2
service rsyslog status # 查看状态
/etc/init.d/rsyslog restart # 重启服务

日志文件中定义了严重程度:

字符 说明
debug 有调式信息的,日志信息最多
info 一般信息的日志,最常用
notice 最具有重要性的普通条件的信息
warning/warn 警告级别
err/error 错误级别,阻止某个功能或者模块不能正常工作的信息
crit 严重级别,阻止整个系统或者整个软件不能正常工作的信息
alert 需要立刻修改的信息
emerg/panic 内核崩溃等严重信息

发送消息给 syslog 服务器时可以用 TCP 协议,也可以用 UDP 协议,一般选择 TCP ,除非在意性能,且能忍受部分丢失,可以改用 UDP。但是注意:如果消息每行大小超过了4k,只能用 TCP。这是因为 UDP 栈大小限制的。

启动 syslog 的 docker 服务:

1
2
3
4
docker run --name syslog \
-p 514:514 -d \
-v /ali/docker/devops/syslog/api.conf:/etc/rsyslog.conf.d/api.conf \
rsyslog/syslog_appliance_alpine

从命令行生成一条消息,并通过 TCP 协议发送到 syslog 服务器:

1
2
echo "message" | nc 127.0.0.1 514
echo "我不信" | nc 192.168.120.7:514

也可以使用 UDP 协议:

1
2
echo "UDP包" | nc -u localhost 514
echo "测试" | nc -u 192.168.120.7:514

或者把文件 file.log 逐行发送:

1
nc 127.0.0.1 514 < file.log

我们查看 /etc/rsyslog.conf 文件的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
global(processInternalMessages="on")

#module(load="imtcp" StreamDriver.AuthMode="anon" StreamDriver.Mode="1")
module(load="impstats") # config.enabled=`echo $ENABLE_STATISTICS`)
module(load="imrelp")
module(load="imptcp")
module(load="imudp" TimeRequery="500")

module(load="omstdout")
module(load="omelasticsearch")

module(load="mmjsonparse")
module(load="mmutf8fix")


input(type="imptcp" port="514")
input(type="imudp" port="514")
input(type="imrelp" port="1601")

# includes done explicitely
include(file="/etc/rsyslog.conf.d/log_to_logsene.conf" config.enabled=`echo $ENABLE_LOGSENE`)
include(file="/etc/rsyslog.conf.d/log_to_files.conf" config.enabled=`echo $ENABLE_LOGFILES`)

监听端口是 514,不过你可以改成任意想要的值。文件中最后一行通过 include 指令,加载了 /etc/ryslog.d 下的所有配置。我们可以通过编程的方式把日志分发到不同的文件中:

  1. 根据来源 IP 分发

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ModLoad imtcp
    $InputTCPServerRun 10514
    # do this in FRONT of the local/regular rules
    if $fromhost-ip startswith '192.0.1.' then /var/log/network1.log
    & ~
    if $fromhost-ip startswith '192.0.2.' then /var/log/network2.log
    & ~
    # local/regular rules, like
    *.* /var/log/syslog.log
  2. 根据 tag 分发

    1
    2
    3
    4
    5
    :syslogtag, isequal, "giomanager:" /var/log/giomanager.log
    & stop

    if $syslogtag startswith 'api_' then /log/api.log
    & ~