引言、SYSLOG协议与rsyslog
syslog常被称为系统日志或系统记录,是一种用来在互联网协议(TCP/IP)的网上中传递记录日志消息的标准。syslog标准协议如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/5bc6612a95e46ebfe6b6a2e32be090af.png)
Syslog消息并没有对最小长度有所定义,但报文的总长度必须在1024字节之内。其中PRI部分必须有3个字符,以‘<’为起始符,然后紧跟一个数字,最后以‘>’结尾。在括号内的数字被称为Priority(优先级),priority值由Facility和severity两个值计算得出,下面是一个例子:
<30>Oct 10 20:30:10 fedora auditd [1780]: The audit daemon is exiting
▶“<30>”是PRI部分,即Priority(优先级),取值范围0~191。
▶“Oct 10 20:30:10 fedora”是HEADER(报头部分)。
▶“auditd [1780]: The audit daemon is exiting”是MSG(信息)部分。
在PRI部分,该数值和Facility和Level有关,Facility是创建日志的实体,比如由Kernel产生,还是由User产生,或者是Mail产生.....而level可以看成是日志级别。他们的关系可以利用公式推导:
Priority=Facility * 8 + Level
后台监控程序会被分配一个facility值,而没有分配到facility值的进程则会使用“local user”的facility值,比如很多网络设备都会默认使用facility值“local user 7”来发送信息。
rsyslog是syslog 的升级版,一个快速处理收集系统日志的开源工具,提供了高性能、安全功能和模块化设计,将多种来源输入输出转换结果到目的地。rsyslog被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息,syslog和rsyslog是久经考验、值得信赖的linux/unix程序。其特点是:多线程高性能;可以通过许多协议进行传输UDP,TCP,SSL,TLS,RELP;支持直接将日志写入到MySQL,PostgreSQL,MongoDB,ElasticSearch等数据管理系统; 支持加密协议:ssl,tls,relp;精细的 自定义输出格式控制以及对消息的强大过滤能力,实现过滤日志信息中任何部分的内容;高精度时间戳;队列操作(内存,磁盘以及混合模式等); 支持数据的加密和压缩传输等。
rsyslog守护进程可以被配置成两种环境:一种是配置成日志收集服务器,rsyslog进程可以从网络中收集其它主机上的日志数据,这些主机会将日志配置为发送到另外的远程服务器;另外一个用法是配置为客户端,用来过滤和发送内部日志消息到本地文件夹(如/var/log)或一台可以路由到的远程rsyslog服务器上。
大多数日志文件都位于 /var/log/ 目录中。在该目录中,你可能注意到很多日志文件末尾包含一串数字(如 maillog-20150301 ),这说明这些日志文件经过了日志转储,这样可以避免日志文件过大。软件包logrotate中包含了一个定时任务,根据/etc/logrotate.conf文件和/etc/logrotate.d/目录中的的配置定期的转储日志文件。
windows世界有微软出的免费工具Log Parser日志分析工具(命令行工具),可以分析基于文本的日志文件、XML 文件、CSV(逗号分隔符)文件,以及操作系统的事件日志、注册表、文件系统、Active Directory。使用 SQL 语句一样查询分析这些数据,甚至可以把分析结果以各种图表的形式展现出来。《LogParser从入门到实战》《使用方法总结》,也有在这个命令行工具上开发的GUI程序,如logparserlizard,有商业版本和免费版本。
本文主要基于rsyslog在CentOS下配置,实际上RHEL的文档比rsyslog官方的更准确一些
Chapter 23. Viewing and Managing Log Files Red Hat Enterprise Linux 7 | Red Hat Customer Portalhttps://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-viewing_and_managing_log_fileshttps://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/ch-viewing_and_managing_log_files#sec-Installing_rsyslog
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/ch-viewing_and_managing_log_files#sec-Installing_rsyslog
一、快速配置
网上大量文章都不是很靠谱,本文测试平台CentOS7和loongxin系统,服务端为192.168.10.58(centos),客户端为192.168.14.211(loongson),rsyslog版本是V8.*系列。
系统都已经默认安装了rsyslog,没有如下操作:
# yum install rsyslog --安装rsyslog软件包
# rsyslogd -v --查看rsyslog版本
# systemctl enable rsyslog.service --开机自动启动rsyslog服务
1. 客户端配置:客户端修改 /etc/rsyslog.conf
把尾部#*.* @@remote-host:514删除注释,将remote-host替换为日志服务器主机IP即可,根据UDP/TCP设置@或@@前缀;
*.* @192.168.10.58:514 #UDP
#和/或
*.* @@192.168.10.58:514 #TCP
注:日志默认使用udp协议,使用@@则使用tcp协议。
2. 服务器配置:服务器端修改修改/etc/rsyslog.conf文件以及/etc/sysconfig/rsyslog文件
配置文件/etc/rsyslog.conf,打开日志服务监听
#Provides UDPsyslog reception
$ModLoad imudp
$UDPServerRun 514
#TCP syslog
$ModLoad imtcp
$InputTCPServerRun 514
输入netstat -lunp 或者-ntlp检查rsyslog监听于514端口(默认端口)
较新的rsyslog版本可能是下面这种格式,看配置文件中的整体风格:
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")
注1:可能由于防火墙导致日志发送失败,可于客户端及服务器端查看514端口是否能正常使用,Centos7中使用如下命令:
firewall-cmd –-query-port=514/udp,tcp类似
输出no,表示没有启用,则添加514端口于防火墙,tcp类似
firewall-cmd –add-port=514/udp
注2:如: rsyslog 监听UDP 514端口,还需要设置 SELinux,否则该端口无法使用。
/etc/sysconfig/rsyslog文件中,修改
SYSLOGD_OPTIONS="-m240 -r"
其中-r表示接受外部日志的写入。
每次配置修改都需要重启服务,centos7中:systemctl restart rsyslog.service 重启日志服务;
3、测试
在客户端和服务端都可以使用logger命令发送日志进行测试,
logger –p user.info “test myself” #服务端192.168.10.58上执行
logger -p user.info "test from loongson" #客户端192.168.14.211上执行
在服务端/var/log/messages中查看发送的日志,tail -n 100 /var/log/messages,其中有:
......
Nov 25 11:17:17 localhost root: test myself
Nov 25 11:17:30 localhost root: test from loongson
注:tail是测试日志的重要工具,tail也可以一直查看文件结尾,用tail -f 用于实时查询linux下的日志文件,类似于top命令!
- 要想暂停刷新,使用【Ctrl】+【S】暂停终端。
- 若想继续终端,使用【Ctrl】+【Q】。
- 若想退出tail命令,直接使用【Ctrl】+【C】
二、详细配置说明
1. rsyslog基本概念
参考《Linux 日志管理 Rsyslog Loganalyzer》,概念参考《Rsyslog日志系统-Linux就该这么学》。
![](https://i-blog.csdnimg.cn/blog_migrate/495eea775a31824fb5650048ed1ac1cc.png)
rsyslog的消息流是从输入模块->预处理模块->主队列->过滤模块->执行队列->输出模块。
- Input输入模块有imklg、imsock、imfile、imtcp等,是消息来源。
- Output输出模块有omudp、omtcp、omfile、omprog、ommysql、omruleset等,是消息的目的地。
- Filter过滤模块处理消息的分析和过滤,rsyslog可以根据消息的任何部分进行过滤,如mmnormalize。
- 预处理模块主要解决各种syslog协议实现间的差异,例如日志系统client端使用rsyslog、server端使用syslog-ng,不做处理syslog-ng是无法识别的(但是反过来,rsyslog的server端就可以识别syslog-ng发过来的消息)。
- Queue模块,负责消息的存储,从Input传入的未经过滤的消息放在主队列中,过滤后的消息放入到不同action queue中,再由action queue送到各个输出模块。
rsyslog是插件式的开放结构,除了内建模块,也有很多扩展模块,常见的输入模块和输出模块如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/f1698e14cff0d6e45abdc4b2d391cb5e.jpeg)
rsyslog主配置文件是/etc/rsyslog.conf,和其它经典Linux程序一样,syslog配置功能非常强大。配置基本是手工完成,Rsyslog官网提供“在线的配置文件辅助生成器”。
rsyslog.conf 的配置主要有三个部分:
(1)modules:模块,配置加载的模块,如:ModLoad imrelp 配置加载RELP传输模块,基本的modules有:
- imudp,传统方式的UDP传输,有损耗
- imtcp,基于TCP明文的传输,只在特定情况下丢失信息,并被广泛使用
- imrelp,RELP传输,不会丢失信息
(2)global directives:全局配置,配置ryslog守护进程的全局属性,全局指令必须以$开始,每行只能有一个指令,例如:比如主信息队列大小$MainMsgQueueSize 50000。在V6版本以后配置格式已经不在使用这种方式的指令,但是它们仍然是可用的。
(3)rules:规则(选择器+动作),规则是配置中最核心的部分,rsyslog的规则引擎依次处理配置文件中的规则,rsyslog定义规则格式如下:
filter action
每个规则由两部分组成,filter(selector)部分和action部分,这两部分由一个或多个空格或tab分隔。rsyslog发现符合 filter 规则的日志后,将日志发送到 action 指定的动作进行处理。
2. rsyslog规则-过滤器Filter
在rsyslog中,提供了三种方式的过滤器方法:
(一)基于设施/优先级的过滤器 (Facility/Priority-based filters)
基于设施/优先级的过滤器是最常用的方法,语法如下:
FACILITY.PRIORITY
基于设施/优先级的过滤器由设施FACILITY和优先级PRIORITY两部分组成,点号.分隔。
定义多个设施或者优先级使用 , 分隔,如果是多个 filter 的话,则使用 ; 进行分隔,如:*.info;mail.none;cron.info,debug 。
facility:设施FACILITY指定了产生日志消息的子系统,从功能或程序上对日志收集进行分类。内建的日志设施有:
- auth(4) :pam产生的日志,认证日志
- authpriv(10):ssh,ftp等登录信息的验证信息,认证授权认证
- kern(0):来自Linux内核的消息
- mail(2):邮件服务系统的各种组件
- mark:防火墙标记,rsyslog服务内部的信息,时间标识
- cron(15):周期任务计划相关的信息
- daemon(3):守护进程产生的信息
- news:网络消息子系统
- lpr:打印相关的日志信息
- user(1):用户进程相关的信息
- local0 to local7(16-23):保留,本地使用
priority:优先级PRIORITY,也就是日志级别,优先级有:
- debug(7):包含详细的开发情报的信息,通常只在调试一个程序时使用
- info(6):一般信息的日志,最常用
- notice(5): 最具有重要性的普通条件的信息,不是错误情况,也不需要立即处理
- warn,warning(4): 警告信息,不是错误,比如系统磁盘使用了85%等
- err,error(3):错误,不是非常紧急,在一定时间内修复即可
- crit(2):重要情况,如硬盘错误,备用连接丢失
- alert(1):应该被立即改正的问题,如系统数据库被破坏,ISP连接丢失
- emerg(0):紧急情况,需要立即通知技术人员
- none:什么也不记录
前面提到过针对PRI的计算公式:
PRI = FacilityCode*8 + SeverityCode
例: local3.info的日志,它的PRI就是19*8+6=158,所以这条消息在传输中的格式为<158> {HEADER} {MEG}
例,PRI为14的消息,那么它实际的级别就是user.info (1*8+6=14)
在定义规则的时候,可以选择前置符号:
符号 | 功能 |
---|---|
* | 所有级别消息被捕获 |
.none | 没有级别 |
.priority | 此级别及高于此级别的所有级别消息被捕获 |
.=priority | 仅此级别消息被捕获 |
.!priority | 在此级别外的级别消息被捕获 |
(二)基于属性的过滤器
基于属性的过滤器语法如下:
:PROPERTY, [!]COMPARE_OPERATION, "STRING"
:PROPERTY是要比较的日志属性,COMPARE_OPERATION 为要执行的比较操作,!表示取反的意思,"STRING"为比较的值。比较操作有:
比较操作 | 描述 |
---|---|
contains | 匹配提供的字符串值是否是属性的一部分,如果不区分大小写,使用contains_i |
isequal | 比较属性和值是否相等 |
startswith | 属性是否以指定字符串开始(startswith_i ) |
regex | 正则表达式(POSIX BRE 基本正则)匹配 |
ereregex | 正则表达式(POSIX ERE 扩展正则)匹配 |
isempty | 判断属性是否为空,不需要 value |
使用范例(:PROPERTY日志属性见附录):
:msg, contains, "error"
:hostname, isequal, "host1"
:msg, !regex, "fatal .* error"
(三)基于表达式的过滤器
基于表达式的过滤器使用了rsyslog自定义的脚本语言RainerScript构建复杂的filter,适合非常复杂的日志处理,本文暂不涉及。
3. rsyslog规则-动作(action)
Action位于过滤器/选择器的后面,定义了当匹配指定的 filter 的时候,执行什么操作。消息内容被写到一种日志文件上,但也可以执行其他动作,比如写到数据库表中或转发到其他主机,下面是默认/etc/rsyslog.conf的设置:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
动作目标Target有:
- PATH:文件或设备, 如/var/log/messages,最主要的配置方式
- 用户, root,*(表示所有用户)
- 日志服务器,@192.168.10.51
- 管道 , | COMMAND
- ~ ,丢弃/忽略日志
- 执行脚本,可用来触发报警如 local3.* ^/tmp/a.sh # ^号后跟可执行脚本或程序的绝对路径,日志内容可以作为脚本的第一个参数。
如果要指定多个 ACTION, 使用 &
连接多个 ACTION。
在 ACTION 后面追加;模板名称可以为指定的 action 使用该模板格式化日志。
注1:默认情况下,每次生成 syslog 的时候,日志信息会同步到日志文件。可以在文件路径前使用 - 指定忽略同步(如果系统崩溃,会丢失日志,但是这样可以提高日志性能)
注2:除了上述方法记录日志(静态),可以动态的生成日志文件,这里的DynamicFile是预定义的输出路径模板。
FILTER ?DynamicFile
例如:
kern.=crit user1
& ^test-program;temp
& @192.168.0.1
#指定了所有的定时任务日志都写入到/var/log/cron.log文件
cron.* /var/log/cron.log
不对特定的日志做处理
- :rawmsg, contains, "testunit" ~ #日志中包含 testunit,则不处理
- & ~ #本行以下动作不做执行
实际的例子还有:
# 表示将mail相关的,info级别及以上级别都记录到mail.log文件中
mail.info /var/log/mail.log
# 表示将auth相关的基本为info信息记录发送到远程syslog服务器
auth.=info @192.168.10.1
# 表示记录与user和error相反的
user.!error
# 表示记录所有日志信息的info级别及以上级别
*.info
# 所有日志及所有级别信息都记录下来
*.*
# 表示将所有facility的info以上级别,但不包括mail,authpriv,cron相关的信息,记录到 /var/log/messages文件
*.info;mail.none;authpriv.none;cron.none /var/log/messages
4. 模板与日志存储设置(日志转发中心)
模板允许你指定日志信息的格式,也可用于生成动态文件名,或在规则中使用。
模板基本上可以将日志处理的灵活性发挥出来,可以对日志信息进行灵活的裁剪,比如生成json格式的日志信息。(rsyslog通过自定义json格式发送日志信息给logstash -)
在分布式日志管理中,日志中心服务器可以对运行的客户地址段、存放路径等进行进一步设置,创建日志目录,尽量选择系统内比较大的区域创建,因为考虑到要存放很多服务器的日志文件。
(1)rsyslog模板
任何rsyslog生成的日志都可以根据需要使用模板进行格式化,创建模板,格式如下:
$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]
双引号之间的内容为模板的内容;
【注】模板名后面不能有空格,否则也会是模板名的一部分,吐血提醒!
PROPERTY属性:在模板中使用的属性是在%之间的内容,使用属性可以访问日志消息中的内容,格式;
%PROPERTY_NAME[:FROM_CHAR:TO_CHAR:OPTION]%
可用的属性列表见本文附录及“man rsyslog.conf”,其中系统属性前要加“$”字符,如“$YEAR”!
OPTION , 它指定了模板的功能,支持选项为sql和stdsql,在使用数据库存储的时候会用到。
生成动态文件名:模板可以用来生成动态文件名,就如之前所述,在使用动态文件名的时候,需要在 ACTION 中的模板名称前增加?
表明该文件名是动态生成的。
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log"
*.* ?DynamicFile
(2)模板配置--日志生成格式
$template myFormat,"%timestamp% %fromhost-ip% %msg%\n"
$ActionFileDefaultTemplate myFormat
#或者在日志文件后添加模板名, 并用;号分隔
authpriv.* /var/log/secure;myFormat
# 表示将所有facility的info级别,但不包括mail,authpriv,cron相关的信息,发送到192.168.10.58日志服务器
*.info;mail.none;authpriv.none;cron.none @@192.168.10.58:514
# Rsyslog默认日志首部有空格,可以使用下面的模板删除空格;
$template logstash,"%msg:2:$%\n"
(3)模板配置--动态文件名
$AllowedSender tcp, 192.168.0.0/16 #允许 192.168.0.0网段内的主机以tcp协议来传输
$InputTCPServerRun 514 #开启tcp,tcp和udp 可以共存
$template Remote,"/data/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log" #定义模板,日志文件路径区分不同主机不同时段日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote #过滤server 本机的日志。
日志分类存储,不同设备IP 的日志转储到不同的日志文件,根据日志类型和优先级设定发送目标
$template SwitchLogs,"/var/log/syslog/%FROMHOST-IP%-%PROGRAMNAME%.log"*
*.* ?SwitchLogs
daemon.info;auth.info;syslog.;authpriv. @@192.168.21.2:514 # SecAudit
// rsyslog按天日志,按程序名programname分割不同日志文件_林三的专栏-CSDN博客_rsyslog 按日期输出
(4)动态文件目录结构?怎么logrotate呢
[root@opm ~]# tree /data/log/
/data/log/
├── 192.168.30.56
│ └── 192.168.30.56_2016-05-05.log
├── 192.168.30.57
│ └── 192.168.30.57_2016-05-05.log
└── messages
2 directories, 3 files
(5)zlib压缩
完整的格式:
@[(zNUMBER)]HOST:[PORT]
#范例
*.* @192.168.0.1 # 使用 UDP 发送,默认端口514
*.* @@example.com:18 # 使用 TCP 发送到端口18, 默认10514
*.* @(z9)[2001:db8::1] # UDP, ipv6,使用zlib级别9压缩
这里的@告诉syslog使用 UDP 协议发送日志,要使用 TCP 的话,使用 @@。可选值zNUMBER设置了是否允许使用zlib对日志压缩(压缩级别1-9)。
5. 输出(outputs)
输出频道为用户可能想要的输出类型提供了保护,outchane标准的官方文档是:RSyslog Documentation - rsyslog。
在规则中使用前要先定义.其定义如下所示,其中NAME指定输出频道的名称,FILE_NAME指定输出文件,MAX_SIZE指定日志文件的大小,单位是bytes, ACTION指定日志文件到达MAX_SIZE时的操作。
$outchannel NAME, FILE_NAME, MAX_SIZE, ACTION
在规则中使用输出频道按照如下的格式:selectors :omfile:$NAME,例:
$outchannel log_rotation, /var/log/test_log.log, 104857600, /home/joe/log_rotation_script
*.* :omfile:$log_rotation
一个例子,使用rsyslog限制日志文件大小,outchannel实现自动回滚rotate_yurunsheng的专栏-CSDN博客
#在/etc/rsyslog.d/50-default.conf文件中添加下面两行(执行rotate_script.sh脚本时附加logfile.log的绝对路径作为参数):
$outchannel log_rotation,/var/log/mylogs/logfile.log, 500,/var/log/mylogs/rotate_script.sh /var/log/mylogs/logfile.log
local1.* $log_rotation
#新建/var/log/mylogs/rotate_script.sh脚本,内容只一行(接收文件名参数,将logfile.log文件move到logfile.log.1):
mv -f ${1} ${1}.1
但可能会遇到权限问题(这时,先关闭SElinux!):
#rsyslog内部指定了对哪种文件有操作权限,在rsyslog.conf中配置
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
#据此更改日志文件的权限
chown -R syslog:adm /var/log/mylogs
chmod -R g+w /var/log/mylogs
chmod ug+x /var/log/mylogs/rotate_script.sh
然后重启rsyslog服务,新日志总是输出到logfile.log,当大小超出500MB就rotate,旧日志覆盖logfile.log.1,同时清空logfile.log,接收新日志,如此重复。
6. rsyslog队列
在图1中可以看到,rsyslog中队列用来传输数据,有主消息队列main和动作队列两种类型。
- 当 rsyslog 接收到一个消息的时候,首先传递消息预处理器,然后加入到主消息队列,接下来消息会从队列中取出传递给规则处理器。
- 规则处理器是一个解析过滤引擎,它会基于配置文件中定义的规则,执行相应的动作(action),每一个动作都有自己的动作队列,消息通过这个队列发送到对应的动作处理器,然后输出。对于同一个消息来说,可以同时传递这个消息给多个动作队列。
在配置文件/etc/rsyslog.conf文件中:$objectQueueType queue_type
这里的队列类型(queue_type)可选值为 direct , inmemory(linkedlist动态分配 , fixedarray 预分配), 或者 disk 等。默认情况下,对于主队列,使用的是FixedArray队列(10000个消息长度),动作队列采用的是direct 队列。
详见《rsyslog队列权威指南》,作者有很多Linux深度文章,包括rsyslog海量场景。
三、rsyslog使用案列
1. 转发到其它syslog 服务器
唯品会的一个运维案例:使用RSYSLOG中继和转发日志_科技峰行者的博客-CSDN博客
转发到其它syslog服务器可以直接@@转发或者使用omfwd转发器转发:
* . * action(type="omfwd" Target="192.168.21.2" Port="514" Protocol="tcp")
#或者
* . * @@192.168.21.2:514
omfwd插件提供更丰富的功能,是rsyslog内建模块,不需要手动加载。详见《rsyslog module manule-omfwd》
# 摘取$msg(消息)变量内容,判断如果有keyboard关键字就进行远程传送,没有此关键字的就不传送;
if $msg contains "keyboard" then
action(type="omfwd" Target="172.18.20.60"\
Port="8594"\
Protocol="udp"\
queue.type="LinkedList"\
queue.spoolDirectory="/var/spool/rsyslog"\
queue.filename="test2"\
queue.size="100000"\
queue.maxdiskspace="2g"\
queue.highwatermark="60000"\
queue.lowwatermark="2000"\
queue.discardmark="80000"\
queue.timeoutenqueue="3000"\
queue.maxfilesize="200m"\
queue.dequeuebatchsize="1000"\
)
& stop
例2:In case the system in use has multiple (maybe virtual) network interfaces network namespaces come in handy, each with its own routing table. To be able to distribute syslogs to remote servers in different namespaces specify them as separate actions.
action(type="omfwd" Target="192.168.1.13" Port="10514" Protocol="tcp" NetworkNamespace="ns_eth0.0")
action(type="omfwd" Target="192.168.2.24" Port="10514" Protocol="tcp" NetworkNamespace="ns_eth0.1")
action(type="omfwd" Target="192.168.3.38" Port="10514" Protocol="tcp" NetworkNamespace="ns_eth0.2")
例3:omfwd另外一个例子收集tomcat日志及问题解决,Rsyslog日志服务搭建 - K‘e0llm - 博客园
2. 将日志写到mysql数据库中
(1)安装rsyslog-mysql。
[root@localhost ~]# yum install rsyslog-mysql
[root@localhost ~]# rpm -ql rsyslog-mysql
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
(2)在MySQL/Mariadb中,执行上面的mysql-createDB.sql脚本,创建数据库(syslog)结构,包括:表 SystemEvents 和表 SystemEventsProperties :
mysql -uroot -p{youpass} < /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
(3)修改/etc/rsyslog.conf配置文件,加载ommysql模块
$ModLoad ommysql
# rule, send to mysql
#*.* :ommysql:database-server,database-name,database-userid,database-password
mail.none;authpriv.none;cron.none :ommysql:127.0.0.1,Syslog,syslogwriter,topsecret
3. 非 syslog 日志的转发
在另外一种环境中,让我们假定你已经在机器上安装了一个名为“foobar”的应用在/var/log下生成foobar.log日志文件。现在,你想要将它的日志定向到rsyslog服务器,这可以通过像下面这样在rsyslog配置文件中加载imfile模块来实现。可参考https://blog.51cto.com/tenderrain/1701462。
rsyslog默认只可以传送系统的日志,比如DHCP,cron、kern等,现在要传送一个服务的日志到远端的rsyslog服务器,要使用rsyslog的imfile模块。该模块提供将任何标准文本文件转换为syslog消息的功能。该文件逐行读取,任何读取的行都传递给rsyslog的规则引擎。
首先,加载imfile模块,这只需做一次。
module(load="imfile" PollingInterval="5")
然后,指定日志文件的路径以便imfile模块可以检测到:
input(type="imfile"
File="/var/log/foobar.log"
Tag="foobar"
Severity="error"
Facility="local7")
最后,定向local7设备到远程rsyslog服务器:
local7.* @192.168.1.25:514
另外一种格式是(Rsyslog 现在支持三种配置语法格式:sysklogd,legacy rsyslog,RainerScript):
module(load="imfile" PollingInterval="5") 加载imfile 模块,并5秒刷新一次
$InputFileName /var/log/nova/nova-compute.log 要监控的日志文件路径
$InputFileTag nova-info: 定义文件标签 ,注意最后是冒号:
$InputFileStateFile state-nova-info 定义状态文件
$InputRunFileMonitor 激活读取,可以设置多组日志读取,每组结束时设置本参数
4. rsyslog输出模块omprog
参考《rsyslog输出模块omprog》,自己写个日志处理程序,放入rsyslog日志工作流引擎中。
5. 从SQL数据转到syslog
一些应用系统中,日志是保存在数据库的log表中,需要及时的转发到syslog。解决方法是使用触发器。
下面文章提到了mysql和postgresql,在PostgreSQL函数中使用参数运行系统命令 - IT屋-程序员软件开发技术分享社区
对于Mysql,需要使用UDF用户自定义函数《mysql触发器内执行shell脚本》提到libmysqludf,网站是:https://github.com/mysqludf/lib_mysqludf_sys
可以直接使用网站上的lib_mysqludf_sys.so文件,放到 mysql的lib/mysql/plugin/下
对于龙芯loongson1.0 下载后自行编译lib_mysqludf_sys.so,如下。
gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o lib_mysqludf_sys.so
四、日志转存切割Rotating与logrotate
1. rsyslog关于日志转存切割
先看看Rsyslog中内置的机制,一个是Dynamic文件,可以自动的生成按日期的日志文件,另外可以outchannel选项限制服务器的日志文件大小,让它在达到一定大小后自动rotate。那么,能否将DynamicFile和outputchannel结合起来使用呢!见《rsyslog配置动态日志文件-outchannel补丁》,syslog - How to combine template and outchannel together in rsyslog.conf? - Unix & Linux Stack Exchange
2. logrotate
logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让日志文件每30天轮循,并删除超过6个月的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。CentOS等都会预装logrotate(或者yum -y install logrotate crontabs)。参考《日志切割之logrotate》,《Linux自带神器logrotate详解》有一个非常详细的例子。
logrotate是通过cron任务调用的,可查看定时任务调用:cat /etc/cron.daily/logrotate(cron.daily下的文件执行通过/etc/crontab配置),详细配置参数见附件:
$cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
logrotate配置文件/etc/logrotate.conf,定义如何处理你的log文件,日志文件的轮循设置在独立的配置文件中,在/etc/logrotate.d/目录下。
注:可以快速创建一个测试用的日志文件,脚本如下:
#其中填入一个10MB的随机比特流数据文件。
[root@clsn6 ~]# touch /var/log/log-file
[root@clsn6 ~]# head -c 10M < /dev/urandom > /var/log/log-file
例:默认情况下,每周对日志文件进行一次rotate,并且保留4份旧日志。 这里wtmp和btmp有些例外,wtmp记录系统登录日志,btmp记录错误的登录尝试,这两个日志文件每月进行一次rotate。
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here
自定义的log rotation配置文件在/etc/logrotate.d/目录,例:
cat /etc/logrotate.d/rsyslog
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
invoke-rc.d rsyslog reload > /dev/null
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
invoke-rc.d rsyslog reload > /dev/null
endscript
}
配置的目的是:syslog的日志文件每天被rotated,保留7份旧的日志。其他的日志文件每周进行一次rotate,并保留4份旧的日志。
测试配置是否正确(logrotate自身的日志通常存放于/var/lib/logrotate/status下):
lograte -d /etc/logrotate.d/rsyslog
注:logrotate可以在任何时候从命令行手动调用。
#要调用为/etc/lograte.d/下配置的所有日志调用logrotate:
[root@local~]# logrotate /etc/logrotate.conf
#或者为某个特定的配置调用logrotate,执行一次切割任务测试(-f表示强制执行)
[root@local~]# logrotate -vf /etc/logrotate.d/log-file
示例:为防止nginx访问日志文件过大设置日志切割
[root@local ~]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 5
missingok
notifempty
create 644 www www
postrotate
if [ -f /application/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /application/nginx/logs/nginx.pid`
fi
endscript
}
五、logananlyzer
https://loganalyzer.adiscon.com/downloads/
syslog协议分析:【协议分析】Syslog协议介绍_Walter的专栏-CSDN博客_syslog协议
六、附录
1. RSYSLOG配置过程中可用的变量或属性参数:
http://www.rsyslog.com/doc/v8-stable/configuration/properties.html
主要有三种Properties:
(一) Message Properties:
- rawmsg
- msg
- hostname
- source
- fromhost
- fromhost-ip
- syslogtag
- programname
- syslogfacility
- syslogfacility-text
- syslogseverity-text
- syslogseverity
- timestamp
- ?timegenerated属性从日志信息中提取出消息的时间戳,
在日志模版的定义中,可以对%msg%属性的输出文本在任意起始字符位置到任意结束位置进行字符串截取。
在%msg%的字符串截取中第一个字符的偏移计数为1.
字符串截取格式%msg:<fromChar>:<toChar>%
(二)System Properties:
$bom The UTF-8 encoded Unicode byte-order mask (BOM)
$myhostname The name of the current host as it knows itself
(三)Time-Related System Properties:
$now 当前日期,格式YYYY-MM-DD,now是指当前message被处理的时间
$year 当前年份(4-digit)
$month 当前月份(2-digit)
$day 当前日期(2-digit)
$hour 当前小时(24 hour) time (2-digit)
$hhour From minute 0 to 29, this is always 0 while from 30 to 59 it is always 1.
$minute 当前分钟(2-digit)
2 .预留的模板名
以”RSYSLOG_”开头的模板名是位rsyslog预留使用的,自定义的模板不要使用这些名字,否则有可能产生冲突导致未知故障。下面就是一直预留共使用的系统模板(模板语法 第15篇:Linux 日志管理--rsyslog模板详解 - 知乎,有模板定义)
- RSYSLOG_TraditionalFileFormat - 传统风格的使用不怎么精确的时间戳的默认日志文件格式
- RSYSLOG_FileFormat - “现代风格”的日志文件格式,与TraditionalFileFormat类似,但是使用的是更高精度的时间戳和时区信息
- RSYSLOG_TraditionalForwardFormat - 传统风格的转发格式,时间戳精度低,通常用于将日志消息转发给其他的syslogd或者低于3.12.5版本的rsyslogd
- RSYSLOG_SysklogdFileFormat - sysklogd兼容的日志格式。如果使用选项$SpaceLFOnReceive on,$EscapeControlCharactersOnReceive off和$DropTrailingLFOnReception off,那么日志格式就会遵从sysklogd的日志格式
- RSYSLOG_ForwardFormat - 类似传统的风格,但是有更高精度的时间戳和时区信息。建议在将日志消息转发给3.12.5或更高的rsyslog版本的时候使用
- RSYSLOG_SyslogProtocol23Format - 在IETF的internet-draft ietf-syslog-protocol-23中指定的格式,可能会成为新的RFC日志标准格式。这种格式加入了一些改进。rsyslog的消息分析程序(message parser)可以读懂这种格式,所以它可以在最近版本的rsyslog中使用,对于不支持的syslog版本可能会直接拒绝这种格式,所以使用之前最好检查一下。【注】在最终的RFC标准出台的时候,格式可能不会发生改变,但也有可能会发生一些变化
- RSYSLOG_DebugFormat - 一种特殊的用于调试property故障的格式,不要在生产环境或者远程转发的情况下使用这种格式
3. logger命令生成日志
logger是Syslog的系统日志模块的shell命令接口,可以从命令行直接向系统日志文件写入一行信息,适合调试,语法如下:
logger [options] [messages]
**options (选项):**
-d, --udp
使用数据报(UDP)而不是使用默认的流连接(TCP)
-i, --id
逐行记录每一次logger的进程ID
-f, --file file_name
记录特定的文件
-h, --help
显示帮助文本并退出
-n, --server
写入指定的远程syslog服务器,使用UDP代替内装式syslog的例程
-P, --port port_num
使用指定的UDP端口。默认的端口号是514
-p, --priority priority_level
指定输入消息的优先级,优先级可以是数字或者指定为 "facility.level" 的格式。比如:"-p local3.info " local3 这个设备的消息级别为info。默认级别是 "user.notice"
-s, --stderr
输出标准错误到系统日志。
-t, --tag tag
指定标记记录
-u, --socket socket
写入指定的socket,而不是到内置系统日志例程。
-V, --version
现实版本信息并退出
[messages] 写入log文件的内容消息,可以与-f配合使用。
例如: logger -p user.info "test from loongson"
logger 以0退出表示成功,大于0表示失败。
4. 直接生成syslog日志报文
总体而言,除了可以用logger工具生成日志,还可以发送端直接构造syslog协议报文。
日志发送端用构造udp报文来进行简单的测试(日志接收服务器地址是192.168.10.58,端口514):
echo “test from loongson” > /dev/udp/192.168.10.58/514
同样,接受服务端对日志进行监测主要有两种方式:
- tail -f 实时监视日志文件,类似于top命令
- tcpdump监测收到的syslog报文
在日志接收服务器用tcpdump监听到报文命令如下:
tcpdump udp port 514 -A -i any
还可以使用nc工具构建syslog报文,例如:
$ echo "<14>: Test syslog message from Netcat" | nc -w1 -u 192.168.10.58 514
$ nc 192.168.10.58 514 <<< "<14>Test syslog message from Netcat through TCP."
User.Info的 PRI 是:(1 << 3 ) + 6 = 8 + 6 = 14.;-u 表示UDP(无-u表示TCP)
5. windows syslog 调试工具
windows下的syslog解决方案开源的有nx-log、evty、snare和nt-syslog等,商业的有kiwi-syslog,syslog-watch等。
如果是用于调试生成syslog数据,建议使用solarwinds公司(kiwi-syslog出品)的kiwi-sysloggen工具,免费而强大。
https://downloads.solarwinds.com/solarwinds/Release/FreeTool/Kiwi-SyslogGen-v2.zip
另外解决方案就是直接生成syslog报文,windows下利用netcat for windows。参考https://blog.csdn.net/shipfei_csdn/article/details/108341829,windows下netcat的命令(_未闻小然桑_新浪博客
6. logrotate常用配置项
通过man logrotate来获取所有的参数和详细描述。这里列出一部分:
- daily 指定转储周期为每天
- weekly 指定转储周期为每周
- monthly 指定转储周期为每月
- compress 通过gzip 压缩转储以后的日志
- nocompress 不需要压缩时,用这个参数
- copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
- nocopytruncate 备份日志文件但是不截断
- missingok 如果文件不存在,继续下一个文件,不报异常
- nomissingok 如果文件不存在,报异常(默认配置)
- create mode(文件权限) owner(拥有者) group(组) 转储文件,使用指定的文件模式创建新的日志文件
- nocreate 不建立新的日志文件
- delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
- nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
- errors address 转储时的错误信息发送到指定的Email 地址
- ifempty 即使是空文件也转储,(logrotate 的缺省选项)
- notifempty 如果是空文件的话,不转储
- mail address 把转储的日志文件发送到指定的E-mail 地址
- nomail 转储时不发送日志文件
- olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
- noolddir 转储后的日志文件和当前日志文件放在同一个目录下
- prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
- postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
- rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
- tabootext [+] LIST 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
- size SIZE 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem)
7. RELP
在传输过程中TCP虽然比UDP可靠,但是是明文传输,Rsyslog提供了一个比TCP更可靠的传输,RELP。RELP传输,不会丢失信息。
参考《Syslog-ng+Rsyslog收集日志:RELP可靠传输,替代UDP、TCP(五) 》
使用RELP需要开启omrelp模块,在传输时将TCP的@,替换成“:omrelp:”。
其它参考:
- https://www.jianshu.com/p/bcf0445a1b8f 日志聚合和可视化
- https://www.cnblogs.com/wuxiaochang/p/11024092.html 日志系统架构介绍
- 日志聚合和可视化,日志聚合和可视化 - 简书
- 《Rsyslog配置文件详解》、《第14篇:Linux 日志管理--rsyslog规则详解》
- cacti:Cacti安装syslog插件配合syslog-ng构建中央日志服务器 - 海运的博客
- 《Rsyslog 基本结构》 流程梳理的还可以
- 《有赞百亿级日志系统架构设计》,windows解决方案KIWI Syslog配置。
- 《日志收集之rsyslog to kafka》
- 《传输日志》,这个例子很好
- 《rsyslog 的 TCP 转发性能测试》