rsyslog学习小记

Linux日志机制的核心是rsyslog守护进程,该服务负责监听Linux下的日志信息,并把日志信息追加到对应的日志文件中,一般在/var/log目录下。它还可以把日志信息通过网络协议发送到另一台Linux服务器上,或者将日志存储在MySQL或Oracle等数据库中。目前rsyslog的大版本为v8。

配置文件


一般情况下,rsyslog 配置的文件文件位于/etc/rsyslog.conf 以及 /etc/rsyslog.d/文件夹下,在/etc/rsyslog.conf中通过$IncludeConfig指令将/etc/rsyslog.d/的所有配置合并到一起。配置主要可以分为以下几类:

全局配置

加载一些通用的模块

module(load="imuxsock") # provides support for local system logging
module(load="imklog")   # provides kernel logging support

设置默认的日志格式:

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

一些权限相关,在后面的一些配置中需要特别注意:

$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

规则

每条规则都由选择器和相应的动作组成,选择器说明来源和日志级别,而动作则说明如何处理对应的日志,下面是一些例子:

cron.*  /var/log/cron
mail.warn   /var/log/mail.warn

把所有来自cron守护进程的消息保存到/var/log/cron文件中。 当指定日志级别时,所有等于或大于该日志等级的信息都要被处理。比如在下面的例子中,mail子系统所有warning及以上信息的日志都保存在/var/log/mail.warn文件中。

mail.=info  -/var/log/mail.info

使用=可以指定日志等级,加上 - 表明日志异步写入。

mail.!info  /var/log/mail.info

使用!可以排除这类信息。

自定义channel

除了将日志写入本地文件外,rsyslog还支持自定义的规则,下面的指令就定义了一个名称为NAME的channel:

$outchannel NAME, FILE_NAME, MAX_SIZE, ACTION

下面是一个例子注意omfile指明输出到文件。

$outchannel log_rotation, /var/log/test_log.log, 104857600, /home/millions/log_rotation_script

*.* :omfile:$log_rotation

实际用例


如果rsyslog只能做将日志写入本地文件那就有点没意思了,下面我们来看一下rsyslog的一些高级一点的功能。

收集nginx的access log 写入文件中

从nginx的access log中可以分析出很多东西,但是在分布式环境下nginx通常部署在多个不同的服务器下,使用rsyslog可以将这些日志整合起来。

我们在/etc/rsyslog.d/文件夹下新建一个配置文件access_log.conf:

module(load="imfile")

ruleset(name="remote") {
    action(type="omfwd"
        Protocol="tcp"
        Target="127.0.0.1"
        Port="8899")

    stop
}

input(type="imfile"
    File="/var/log/nginx/access.log"
    Facility="user"
    Severity="info"
    Tag="web_access"
    PersistStateInterval="1"
    Ruleset="remote")

由于要读取文件,我们引入module(load="imfile")。然后在input中指明输入的文件位置,以及日志的类型和级别。PersistStateInterval表示持久化的间隔,可以根据需要调整,Ruleset表示使用的规则是什么。在规则中,我们指明了输出类型为转发,目标是127.0.0.1的8899端口,并且使用tcp协议。

接下来,我们再增加一个接受转发日志的配置:

module(load="imtcp")

template(name="msg" type="string" string="%msg:2:$%\n")

ruleset(name="analysis") {
    action(type="omfile"
        File="/home/millions/log/access.log"
        Template="msg")

    stop
}

input(type="imtcp"
    Port="8899"
    Ruleset="analysis")

这里我们的input是tcp,并且监听在8899端口上,输出到指定的文件,并使用自定义的模板msg。这里要注意权限问题。

然后去访问nginx,就可以看到指定目录下的文件了。

收集nginx日志并重定向到程序

稍微修改以下我们接收日志的配置,就可以把日志重定向给某个程序的标准输入了:

module(load="imtcp")
module(load="omprog")

template(name="msg" type="string" string="%msg:2:$%\n")

ruleset(name="analysis") {
    action(type="omprog"
        Binary="/usr/bin/php /home/millions/log/test.php"
        Template="msg")

    stop
}

input(type="imtcp"
    Port="8899"
    Ruleset="analysis")

为了方便起见,我们这里采用php脚本,也可以换成其他想使用的语言,test.php的内容如下。

$fp = fopen("/home/millions/log/f.log", "w+");
while (($data = fgets(STDIN)) !== false) {
        fwrite($fp, "got data:" . $data);
}

这样就可以看到f.log中记录的数据了:

got data:192.168.0.102 - - [08/Jan/2017:11:58:00 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
got data:192.168.0.102 - - [08/Jan/2017:13:20:34 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"

如果kill掉test.php,下次同步日志时rsyslog还会启动一个新的test.php,这样可以在运行一定次数后退出进程防止内存泄露。

总结


上面只是对rsyslog的使用做了一个简单的介绍,具体使用还有很大的发挥空间。比如在脚本中不是简单的把日志写入本地文件,而是发往kafka,记录到mysql,mongodb中去。进一步的学习还是需要查看rsyslog的官方文档。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,654评论 24 1,002
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,217评论 9 467
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,996评论 0 9
  • 【同读一本书.王朋彦】2016-9-14-001《沟通的艺术》P13 正文:有时候我们会希望可以回到过去,消除某...
    王朋彦阅读 236评论 2 1