1. 介绍
rsyslog可以简单的理解为syslog的超集,在老版本的Linux系统中,Red Hat Enterprise Linux 3/4/5默认是使用的syslog作为系统的日志工具,从RHEL 6 开始系统默认使用了rsyslog。
其特性包括:
- 支持输出日志到各种数据库,如 MySQL,PostgreSQL,MongoDB,ElasticSearch,等等;
- 通过 RELP + TCP 实现数据的可靠传输(基于此结合丰富的过滤条件可以建立一种 可靠的数据传输通道供其他应用来使用);
- 精细的输出格式控制以及对消息的强大 过滤能力;
- 高精度时间戳;队列操作(内存,磁盘以及混合模式等); 支持数据的加密和压缩传输等。
2. 配置
/etc/rsyslog.conf
syslog的配置文件有多种书写方法:
- sysklogd(一些结构不兼容新特性),
- legacy rsyslog(以“$”开头的写法,如:
$ModLoad imtcp.so
), - RainerScript(一种新的格式,是最推荐使用的一种,尤其是需要做复杂的配置时)
在本文中的配置都比较简单,就采用了legacy rsyslog的配置书写方法。更多详情参考:
http://www.rsyslog.com/doc/master/configuration/basic_structure.html#statement-types
rsyslog的配置主要有以下模块:
- modules,模块,配置加载的模块,如:
ModLoad imudp.so
配置加载UDP传输模块 - global directives,全局配置,配置ryslog守护进程的全局属性,比如主信息队列大小(MainMessageQueueSize)
- rules,规则(选择器+动作),每个规则行由两部分组成,selector部分和action部分,这两部分由一个或多个空格或tab分隔,selector部分指定源和日志等级,action部分指定对应的操作
- 模板(templates)
- 输出(outputs)
2.1 常用的modules
- imudp,传统方式的UDP传输,有损耗
- imtcp,基于TCP明文的传输,只在特定情况下丢失信息,并被广泛使用
- imrelp,RELP传输,不会丢失信息,但只在rsyslogd 3.15.0及以上版本中可用
更多参考:http://www.rsyslog.com/doc/master/configuration/modules/index.html
2.2 规则(rules)
规则的选择器(selectors)
selector也由两部分组成,设施和优先级,由点号.
分隔。第一部分为消息源或称为日志设施,第二部分为日志级别。多个选择器用;
分隔,如:*.info;mail.none
。
日志设施有:
- auth(security), authpriv: 授权和安全相关的消息
- kern: 来自Linux内核的消息
- mail: 由mail子系统产生的消息
- cron: cron守护进程相关的信息
- daemon: 守护进程产生的信息
- news: 网络消息子系统
- lpr: 打印相关的日志信息
- user: 用户进程相关的信息
- local0 to local7: 保留,本地使用
日志级别有(升序):
- debug:包含详细的开发情报的信息,通常只在调试一个程序时使用。
- info:情报信息,正常的系统消息,比如骚扰报告,带宽数据等,不需要处理。
- notice: 不是错误情况,也不需要立即处理。
- warning: 警告信息,不是错误,比如系统磁盘使用了85%等。
- err:错误,不是非常紧急,在一定时间内修复即可。
- crit:重要情况,如硬盘错误,备用连接丢失。
- alert:应该被立即改正的问题,如系统数据库被破坏,ISP连接丢失。
- emerg:紧急情况,需要立即通知技术人员。
日志设施的配置:
.
代表比后面还要高的消息等级都会记录下来.=
代表只有后面的这个消息等级会被记录下来.!
代表除了后面的这个消息等级,其他的都会被记录下来。
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
2.3 动作 (action)
action是规则描述的一部分,位于选择器的后面,规则用于处理消息。总的来说,消息内容被写到一种日志文件上,但也可以执行其他动作,比如写到数据库表中或转发到其他主机。
写到本地文件/var/log/lyh.log中
#
# Save message to other file
#
local0.* /var/log/lyh.log
写到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
2.4 模板(templates)
模板允许你指定日志信息的格式,也可用于生成动态文件名,或在规则中使用。
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
2.5 输出(outputs)
输出频道为用户可能想要的输出类型提供了保护,在规则中使用前要先定义.其定义如下所示,
NAME:指定输出频道的名称;FILE_NAME:指定输出文件;MAX_SIZE指定日志文件的大小,单位是bytes; ACTION:指定日志文件到达MAX_SIZE时的操作。
$outchannel NAME, FILE_NAME, MAX_SIZE, ACTION
在规则中使用输出频道按照如下的格式:
selectors :omfile:$NAME
3. demo
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>int main()
{openlog("msg-lyh", LOG_PID, LOG_LOCAL0);syslog(LOG_INFO, "this is a test");closelog();return 0;
}
在/etc/rsyslog.conf中增加。
#
# Save message to other file
#
local0.* /var/log/lyh.log
注:需要sudo service rsyslog restart 重启服务,配置才能生效