目录html
有一个4台机器的分布式服务,很少很多,上每台机器上查看日志比较麻烦,用Flume,Logstash、ElasticSearch、Kibana等分布式日志管理系统又显得大材小用,因此想到了centos自带的rsyslog。node
Rsyslog能够简单的理解为syslog的超集,在老版本的Linux系统中,Red Hat Enterprise Linux 3/4/5默认是使用的syslog做为系统的日志工具,从RHEL 6 开始系统默认使用了Rsyslog。mysql
Rsyslog 是负责收集 syslog 的程序,能够用来取代 syslogd 或 syslog-ng。 在这些 syslog 处理程序中,我的认为 rsyslog 是功能最为强大的。 其特性包括:linux
$rsyslogd -version rsyslogd 3.22.1, compiled with: FEATURE_REGEXP: Yes FEATURE_LARGEFILE: Yes FEATURE_NETZIP (message compression): Yes GSSAPI Kerberos 5 support: Yes FEATURE_DEBUG (debug build, slow code): No Atomic operations supported: Yes Runtime Instrumentation (slow code): No See http://www.rsyslog.com for more information.
yum -y rsyslog #查看是否安装了rsyslog rpm -qa | grep rsyslog #若是还须要别的组件(mysql模块,日志轮转) yum -y rsyslog-mysql yum -y logrotate
/etc/init.d/rsyslog start /etc/init.d/rsyslog stop /etc/init.d/rsyslog restart //帮助文档 man rsyslogd, 或者输入一个错误的命令 $rsyslogd --help rsyslogd: invalid option -- '-' usage: rsyslogd [-c<version>] [-46AdnqQvwx] [-l<hostlist>] [-s<domainlist>] [-f<conffile>] [-i<pidfile>] [-N<level>] [-M<module load path>] [-u<number>] To run rsyslogd in native mode, use "rsyslogd -c3 <other options>" For further information see http://www.rsyslog.com/doc
rsyslog的配置文件有多种书写方法:git
$ModLoad imtcp.so
),在本文中的配置都比较简单,就采用了legacy rsyslog的配置书写方法。更多详情参考:http://www.rsyslog.com/doc/master/configuration/basic_structure.html#statement-typesgithub
下面是一个例子:sql
$less /etc/rsyslog.conf #rsyslog v3 config file # if you experience problems, check # http://www.rsyslog.com/troubleshoot for assistance #### MODULES #### $ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command) $ModLoad imklog.so # provides kernel logging support (previously done by rklogd) #$ModLoad immark.so # provides --MARK-- message capability # Provides UDP syslog reception #$ModLoad imudp.so #$UDPServerRun 514 # Provides TCP syslog reception #$ModLoad imtcp.so #$InputTCPServerRun 514 #### GLOBAL DIRECTIVES #### # Use default timestamp format $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # File syncing capability is disabled by default. This feature is usually not required, # not useful and an extreme performance hit #$ActionFileEnableSync on #### RULES #### # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.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 # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log
配置文件查看less /etc/rsyslog.conf
。Rsyslog的配置主要有如下模块:shell
ModLoad imudp.so
配置加载UDP传输模块selector也由两部分组成,设施和优先级,由点号.
分隔。第一部分为消息源或称为日志设施,第二部分为日志级别。多个选择器用;
分隔,如:*.info;mail.none
。数据库
日志设施有:vim
日志级别有(升序):
日志设施的配置:
.
表明比后面还要高的消息等级都会记录下来.=
表明只有后面的这个消息等级会被记录下来.!
表明除了后面的这个消息等级,其余的都会被记录下来,我在rsyslogd 4.6.2中失败了不知道为啥。。对于多个选择器能够用;
分隔。
local0.=debug /home/admin/applogs/app-name/debug.log local0.err;local0.warning;local0.info /home/admin/applogs/app-name/info.log local0.err /home/admin/applogs/app-name/error.log
action是规则描述的一部分,位于选择器的后面,规则用于处理消息。总的来讲,消息内容被写到一种日志文件上,但也能够执行其余动做,好比写到数据库表中或转发到其余主机。
在前面的实例中的是写到本地文件中的:
# The authpriv file has restricted access. authpriv.* /var/log/secure
也能够写到mysql数据库中,
# modules, 要将日志写到mysql中须要加载ommysql模块 $ModLoad ommysql # rule, send to mysql #*.* :ommysql:database-server,database-name,database-userid,database-password *.* :ommysql:127.0.0.1,Syslog,syslogwriter,topsecret
关于配置发送消息到数据库的更多类容能够参考:http://www.rsyslog.com/doc/master/tutorials/database.html
action的配置:
cron.* -/var/log/cron.log
若是路径前有-
则表示每次输出日志时不一样步(fsync)指定日志文件。 文件路径既能够是静态文件也能够是动态文件。动态文件由模板前加 ? 定义。cron.* ~ 丢弃全部信息,即该配置以后的动做不会看到该日志。 随 rsyslog 版本不一样,若是有以下警告信息,则将 ~ 修改成 stop。
模板容许你指定日志信息的格式,也可用于生成动态文件名,或在规则中使用。其定义以下所示,其中TEMPLATE_NAME是模板的名字,PROPERTY是rsyslog自己支持的一些属性参数。
$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]
使用例子:
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log" $template DailyPerHostLogs,"/var/log/syslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/messages.log" *.info ?DailyPerHostLogs *.* ?DynamicFile
在模板中咱们用到的properties能够参考官方文档说明,例子中用到的timegenerated
是指接收到消息时的时间戳。
输出频道为用户可能想要的输出类型提供了保护,在规则中使用前要先定义.其定义以下所示,其中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
经过下面命令能够校验配置文件是否配置正确:
sudo rsyslogd -f /etc/rsyslog.conf -N4
其中 -N后面的数值表明rsyslog启动时-c 后指定的版本。
经过下面命令能够手动发送日志信息:
logger -p local0.info "hello world"
随着日志文件愈来愈大,这不只会带来性能问题,同时对日志的管理也很是棘手。 当一个日志文件被rotated,会建立一个新的日志文件,同时旧的日志文件会被重命名。这些文件在一段时间内被保留,一旦产生必定数量的旧的日志,系统就会删除一部分旧的日志。
logrotate是经过cron任务调用的,在安装的时候就自动建立了,因此经过ps命令看不到logrotate,可查看定时任务调用: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
cron.daily下的文件执行都是经过/etc/crontab
配置的:
$cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 0 0 * * * root run-parts /etc/cron.daily #定时执行cron.daily
logrotate的配置文件为/etc/logrotate.conf,下面给一个例子:
# 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/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog reload > /dev/null endscript } /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 } # system-specific logs may be configured here
syslog的日志文件天天被rotated,保留7份旧的日志。其余的日志文件每周进行一次rotate,并保留4份旧的日志。
咱们能够经过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)
sudo vim /etc/rsyslog.conf
# Provides UDP syslog reception $ModLoad imudp.so $UDPServerRun 514 $template ipAndMsg,"[%fromhost-ip%] %$now%%msg%\n" local0.=debug /home/admin/applogs/app-name/debug.log;ipAndMsg local0.err;local0.warning;local0.info /home/admin/applogs/app-name/info.log;ipAndMsg local0.err /home/admin/applogs/app-name/error.log;ipAndMsg
sudo service rsyslog restart
sudo service syslog/syslog-ng stop
sudo vim /etc/logrotate.conf
/home/admin/applogs/app-name/debug.log /home/admin/applogs/app-name/info.log /home/admin/applogs/app-name/error.log{ daily create 0664 root root rotate 30 missingok nocompress notifempty dateext postrotate /etc/init.d/rsyslog restart > /dev/null 2>&1 endscript }
注意,最后必须加上:
postrotate /etc/init.d/rsyslog restart > /dev/null 2>&1 endscript
由于logrotate以后,即便已经移走了,可是rsyslog仍是持有这个文件操做句柄,会继续往原文件(被rotate的文件)中写,即便已经被重命名了,因此须要 restart rsyslog 来 reopen 下 logrotate新建立的同名文件。
另外有一个能够不用重启的办法,可是会丢失部分数据,logrotate 提供了 copytruncate
。默认的指令 create
作法,是 移动旧文件,建立新文件,而后用脚本reopen新文件;而 copytruncate 是采用的先拷贝再清空, 先复制一份旧的日志,而后请客原文件,整个过程原来的文件句柄,并无变化,因此不须要reopen,服务能够不中断,可是这个过程会致使部分数据丢失。
BASIC CONFIGURATION OF RSYSLOG(最完整的文档)
Logrotate帮助文档
using a different log format for all files
Rsyslog官网
如何对Rsyslog进行配置
Rsyslog配置详解
跟我学Rsyslog
Linux日志文件与Syslog函数介绍
logback SyslogAppender