Syslog

Posted binarylei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Syslog相关的知识,希望对你有一定的参考价值。

Syslog

syslog 服务器可以用作一个网络中的日志监控中心,rsyslog 是一个开源工具,被广泛用于 Linux 系统以通过 TCP/UDP 协议转发或接收日志消息。

rsyslog 作为标准的 syslog 守护进程,预装在了大多数的 Linux 发行版中。在客户端/服务器架构的配置下,rsyslog 同时扮演了两种角色:

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

一、什么是 syslog

技术分享图片

这里的 facility 为模块,serverity 为等级,由这两个信息共同计算出一个 PRI 头部。HEADER 部分包含了时间和主机名。在 HEADER 和 MSG 之间有一个空格,MSG 是需要记录的日志部分(日志消息体)。

这里也就是说,理论上使用这种格式构造的字符串发送,接收方就能解析出来。实际上根据实验,我使用了 UDP 发送,接收方 syslog 日志服务器能正确解析。

这里需要注意的是,如果使用了程序的库,比如:python 的 syslog 库(同样 c++ 也有相似的库),那么就不再需要关注 PRI 和 HEADER 部分,只要将相关的参数(facility,severity,time,ip)传入函数,调用发送就可以,不必自己构造字符串。对服务端来说,接收到的是整个消息,但通常来讲,比如使用 linux 默认的 rsyslog 作为接收服务端的话,是不能看到除 MSG 之外的部分。所看到的消息跟接收端配置有关,这个在下面有具体的讲。

表1 Facility: 有 0-23 种设备可选

名称 说明 编号
auth 身份验证相关的消息(登录时)
cron 进程或应用调度相关的消息
daemon 守护进程相关的消息(内部服务器)
kernel 内核相关的消息
mail 内部邮件服务器相关的消息
syslog syslog 守护进程本身相关的消息
lpr 打印服务相关的消息
local0 - local7: 用户自定义的消息(local7 通常被 CentOS 和 Windows 服务器使用)

表2 Severity: 日志等级

名称 说明 编号
emerg Emergency(紧急) 0
alert Alerts (报警) 1
crit Critical (关键) 2
err Errors (错误) 3
warn Warnings (警告) 4
notice Notification (通知) 5
info Information (消息) 6
debug Debugging (调试) 7

在 rsyslog 里, syslog 的配置是基于以下模式进行结构化的。

[facility-level].[severity-level] [destination]

二、rsyslog

2.1 rsyslog 安装及启动

yum install -y rsyslog      # 一般默认已经安装
service rsyslog restart

2.2 rsyslog 配置文件(/etc/rsyslog.conf)

配置文件 /etc/rsyslog.conf 大概分为三个部分:MODULES、GLOBAL DIRECTIVES、RULES

(1) MODULES

这个部分主要用来配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。

(2) GLOBAL DIRECTIVES

这个部分主要用来配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。

默认配置为:

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

这里列举一个模板,将所有信息保存:

# 这里第一行(为了方便显示,参数写成了一列)是模板,即日志服务器记录到日志文件的格式
# 第二行是指定需要使用的模板 myFormat,这个名字可以自己定义
$template myFormat,"%TIMESTAMP% host=%HOSTNAME%,
                                relayHost=%FROMHOST%,
                                tag=%syslogtag%,
                                programName=%programname%,
                                procid=%PROCID%,
                                facility=%syslogfacility-text%,
                                sev=%syslogseverity-text%,
                                appName=%APP-NAME%,
                                msg=%msg%
"
$ActionFileDefaultTemplate myFormat

(3) RULES

这个模块主要讲一下转发规则。

*.* @@remote-host:514

根据这个实例可以看出,分为 4 个部分 [模块.等级] [转发协议][日志服务器地址]:[日志服务器端口]。其中转发协议的参数 @@ 为 TC P协议,对应的接收端也需要配置接受 TCP 协议;@ 为 UDP 协议。

三、syslog 接收日志

在 GLOBAL DIRECTIVES 之前追加如下配置:

$template IpTemplate,"/var/log/%FROMHOST-IP%.log"
*.* ?IpTemplate
& ~

说明:

  1. $template IpTemplate(“IpTemplate” 可自定义)指令使 rsyslog 后台进程将日志消息写到 /var/log 下的单独的本地日志文件中,其中日志文件的名称是基于远程日志发送机器的主机名以及生成该日志的应用程序名进行定义的。

  2. *.* ?IpTemplate 将 IpTemplate 模板应用到所有接收到的日志上。

  3. & ~ 表示了一个重定向规则,被用来告知 rsyslog 守护进程停止对日志消息的进一步处理,并且不要在本地写入。如果没有使用该重定向规则,那么所有的远程消息都会在写入上述描述的日志文件之外同时被写入到本地日志文件,这就意味着日志消息实际上被写了两次。使用该规则的另外一个结果就是 syslog 服务器本身的日志消息只会被以该机器主机名命名的专有文件中。

rsyslog 接收远程日志且去掉日志头配置如下:

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
 
# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
 
$template myformat,"%msg%
"
#$template myformat,"%$NOW% %TIMESTAMP:8:15% %hostname% %syslogtag% %msg%
"
$ActionFileDefaultTemplate myformat
 
$template IpTemplate,"/var/log/%FROMHOST-IP%.log"
*.*  ?IpTemplate
& ~

四、syslog 发送日志

发送日志的配置很简单,只需要配置要发送的地址就 ok

*.* @@192.168.1.25:514              # tcp 协议
local7.info @192.168.1.25:514       # udp 协议,只发送用户的 info 级别日志

参考:

  1. 《Linux 配置 syslog 服务》:https://blog.csdn.net/senlin1202/article/details/50800385
  2. 《Linux 下 rsyslog 日志收集服务环境部署记录》:https://www.cnblogs.com/kevingrace/p/5570411.html

每天用心记录一点点。内容也许不重要,但习惯很重要!

以上是关于Syslog的主要内容,如果未能解决你的问题,请参考以下文章

从 Android 将 syslog 消息发布到 syslog 服务器

Logback 只会将消息记录到 syslog 一次

将 C++ std::clog 重定向到 Unix 上的 syslog

Python SysLogHandler -> syslog:logstash。设施未变

如何在 python 中将日志发送到 syslog?

如何在 C 中将 linux syslog 映射到 printf