赞
踩
syslog常被称为系统日志或系统记录,是一种用来在互联网协议(TCP/IP)的网上中传递记录日志消息的标准。syslog标准协议如下图:
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服务
把尾部#*.* @@remote-host:514删除注释,将remote-host替换为日志服务器主机IP即可,根据UDP/TCP设置@或@@前缀;
- *.* @192.168.10.58:514 #UDP
- #和/或
- *.* @@192.168.10.58:514 #TCP
注:日志默认使用udp协议,使用@@则使用tcp协议。
配置文件/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 重启日志服务;
在客户端和服务端都可以使用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命令!
参考《Linux 日志管理 Rsyslog Loganalyzer》,概念参考《Rsyslog日志系统-Linux就该这么学》。
rsyslog的消息流是从输入模块->预处理模块->主队列->过滤模块->执行队列->输出模块。
rsyslog是插件式的开放结构,除了内建模块,也有很多扩展模块,常见的输入模块和输出模块如下图:
rsyslog主配置文件是/etc/rsyslog.conf,和其它经典Linux程序一样,syslog配置功能非常强大。配置基本是手工完成,Rsyslog官网提供“在线的配置文件辅助生成器”。
rsyslog.conf 的配置主要有三个部分:
(1)modules:模块,配置加载的模块,如:ModLoad imrelp 配置加载RELP传输模块,基本的modules有:
(2)global directives:全局配置,配置ryslog守护进程的全局属性,全局指令必须以$开始,每行只能有一个指令,例如:比如主信息队列大小$MainMsgQueueSize 50000。在V6版本以后配置格式已经不在使用这种方式的指令,但是它们仍然是可用的。
(3)rules:规则(选择器+动作),规则是配置中最核心的部分,rsyslog的规则引擎依次处理配置文件中的规则,rsyslog定义规则格式如下:
filter action
每个规则由两部分组成,filter(selector)部分和action部分,这两部分由一个或多个空格或tab分隔。rsyslog发现符合 filter 规则的日志后,将日志发送到 action 指定的动作进行处理。
在rsyslog中,提供了三种方式的过滤器方法:
(一)基于设施/优先级的过滤器 (Facility/Priority-based filters)
基于设施/优先级的过滤器是最常用的方法,语法如下:
FACILITY.PRIORITY
基于设施/优先级的过滤器由设施FACILITY和优先级PRIORITY两部分组成,点号.分隔。
定义多个设施或者优先级使用 , 分隔,如果是多个 filter 的话,则使用 ; 进行分隔,如:*.info;mail.none;cron.info,debug 。
facility:设施FACILITY指定了产生日志消息的子系统,从功能或程序上对日志收集进行分类。内建的日志设施有:
priority:优先级PRIORITY,也就是日志级别,优先级有:
前面提到过针对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,适合非常复杂的日志处理,本文暂不涉及。
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有:
如果要指定多个 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
不对特定的日志做处理
实际的例子还有:
- # 表示将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

模板允许你指定日志信息的格式,也可用于生成动态文件名,或在规则中使用。
模板基本上可以将日志处理的灵活性发挥出来,可以对日志信息进行灵活的裁剪,比如生成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)。
输出频道为用户可能想要的输出类型提供了保护,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,接收新日志,如此重复。
在图1中可以看到,rsyslog中队列用来传输数据,有主消息队列main和动作队列两种类型。
在配置文件/etc/rsyslog.conf文件中:$objectQueueType queue_type
这里的队列类型(queue_type)可选值为 direct , inmemory(linkedlist动态分配 , fixedarray 预分配), 或者 disk 等。默认情况下,对于主队列,使用的是FixedArray队列(10000个消息长度),动作队列采用的是direct 队列。
详见《rsyslog队列权威指南》,作者有很多Linux深度文章,包括rsyslog海量场景。
唯品会的一个运维案例:使用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 - 博客园
(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
在另外一种环境中,让我们假定你已经在机器上安装了一个名为“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 激活读取,可以设置多组日志读取,每组结束时设置本参数
参考《rsyslog输出模块omprog》,自己写个日志处理程序,放入rsyslog日志工作流引擎中。
一些应用系统中,日志是保存在数据库的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
先看看Rsyslog中内置的机制,一个是Dynamic文件,可以自动的生成按日期的日志文件,另外可以outchannel选项限制服务器的日志文件大小,让它在达到一定大小后自动rotate。那么,能否将DynamicFile和outputchannel结合起来使用呢!见《rsyslog配置动态日志文件-outchannel补丁》,syslog - How to combine template and outchannel together in rsyslog.conf? - Unix & Linux Stack Exchange
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
- }
https://loganalyzer.adiscon.com/downloads/
syslog协议分析:【协议分析】Syslog协议介绍_Walter的专栏-CSDN博客_syslog协议
http://www.rsyslog.com/doc/v8-stable/configuration/properties.html
主要有三种Properties:
(一) Message Properties:
- 在日志模版的定义中,可以对%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)
以”RSYSLOG_”开头的模板名是位rsyslog预留使用的,自定义的模板不要使用这些名字,否则有可能产生冲突导致未知故障。下面就是一直预留共使用的系统模板(模板语法 第15篇:Linux 日志管理--rsyslog模板详解 - 知乎,有模板定义)
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表示失败。
总体而言,除了可以用logger工具生成日志,还可以发送端直接构造syslog协议报文。
日志发送端用构造udp报文来进行简单的测试(日志接收服务器地址是192.168.10.58,端口514):
echo “test from loongson” > /dev/udp/192.168.10.58/514
同样,接受服务端对日志进行监测主要有两种方式:
在日志接收服务器用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)
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的命令(_未闻小然桑_新浪博客
通过man logrotate来获取所有的参数和详细描述。这里列出一部分:
在传输过程中TCP虽然比UDP可靠,但是是明文传输,Rsyslog提供了一个比TCP更可靠的传输,RELP。RELP传输,不会丢失信息。
参考《Syslog-ng+Rsyslog收集日志:RELP可靠传输,替代UDP、TCP(五) 》
使用RELP需要开启omrelp模块,在传输时将TCP的@,替换成“:omrelp:”。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。