rsyslog配置解析
本地Rsyslog版本: 8.25.0-1.el6.x86_64
配置
基本语法
Rsyslog 现在支持三种配置语法格式:
sysklogd
legacy rsyslog
RainerScript
sysklogd 是老的简单格式,一些新的语法特性不支持。legacy rsyslog 是以dollar符($)开头的语法,在v6及以上的版本还在支持,一些插件和特性可能只在此语法下支持。RainnerScript是最新的语法。
老的语法格式(sysklogd
& legacy rsyslog
)是以行为单位。新的语法格式(RainnerScript
)可以分割多行。
注释有两种语法:
井号符
#
C-style
/* .. */
执行顺序: 指令在rsyslog.conf文件中是从上到下的顺序执行的。
模块(Modules)
Rsyslog 使用 $ModLoad
指令加载模块。常用的模块类型是 Input Modules 和 Output Modules。
输入模块(Input Modules) 用于从多个来源收集(读取)消息,比如tcp/udp, 文本等。
模块 | 作用 |
---|---|
imfile | input module for text files |
imrelp | RELP input module |
imudp | udp syslog message input |
imtcp | input plugin for tcp syslog |
imptcp | input plugin for plain tcp syslog (no TLS but faster) |
immark | support for mark messages |
imklog | kernel logging |
imuxsock | unix sockets, including the system log socket |
impstats | provides periodic statistics of rsyslog internal counters |
输出模块(Output Modules)处理消息。通过它,可以格式化消息以及传递消息到不通的目标(target)。
模块 | 作用 |
---|---|
omfile | file output module |
omfwd | ???????? |
ompipe | named pipe output module |
omrelp | RELP output module |
ommysql | output module for MySQL |
omprog | permits sending messages to a program for custom processing |
omuxsock | output module Unix domain sockets |
还有其它类型的模块, 可以参考官方模块文档
简单的消息工作流:
消息从 Input Modules 接收,然后传递给 Parser Modules,最终传递给 Output Module。
Templates
模板是 rsyslog 一个重要的属性,它可以控制日志的格式,支持类似template()
语句的基于string或plugin的模板
legacy 格式使用 $template
的语法,不过这个在以后要移除,所以最好使用新格式 template()
:
$template name, param[, options]
name 是模板的名称,param 指定模板内容,options 用来设置模板选项。TODO
基于string的模板:
$template strtpl,"PRI: %pri%, MSG: %msg%\n"
基于plugin的模板:
$template plugintpl,=myplugin
举个例子:
$template MyTemplateName,"Text %property% some more text\n",<options>
模板指令定义一个模板 MyTemplateName,模板的格式是引号阔起来的,其中百分号%
标记的是property
,可以获取rsyslog的消息内容,更多参考 property replacer
Filter Conditions
Rsyslog 提供三种格式的过滤条件语法:
RainerScript-based filters
"traditional" severity and facility based selectors : 基于严重程度和设施的选择器
property-based filters : 基于属性的过滤器
选择器(Selectors):
选择器是过滤syslog消息的传统方法。它使用rsyslog的原始语法,效率高,适合针对优先级(priority)和设施(facility)的过滤。
选择器由两部分组成, 一个facility和一个priority, 中间用句号(.
)分隔。priority和facility都忽略大小写,并且可以用十进制数字代替,不过不建议这么做。可以通过 man 3 syslog
更详细的了解这两部分。
Facility 用来指定哪个程序发送的日志消息,可以让配置通过不同的消息来源做不通的处理。
auth
authpriv
cron
daemon
kern
lpr
mail
mark
news
security (same as auth)
syslog
user
uucp
local0 - local7
priority 列表: debug info notice warning warn (same as warning) err error (same as err) crit, alert emerg panic (same as emerg)
error, warn, panic已经过时,不应该再使用。
星号符(*
)可以表示所有facility或所有priority。 关键词none表示为指定级别的。
一个priority可以指定多个facilities, 使用逗号(,
)分隔。(priority不能这么做)
在一个action下配置多个selectors,使用分号(;
)分隔。
priority前面加等于号(=
)表示仅选择当前级别的。
priority前面加感叹号(!
)表示排除该级别的。 TODO 测试 测试失败,不能用?
如果要同时使用感叹号和等于号,感叹号应该在等于号之前。
举例:
TODO
Property-Based Filters:
可以过滤任何属性,例如 HOSTNAME、msg等。支持的属性见The Property Replacer
property-based filter必须使用冒号(:
)开头。
语法:
:property, [!]compare-operation, "value"
value 是用来比较的值,必须用引号括起来。
注意 property和compare-operation是大小写敏感的。
compare-operation 有:
contains : property 包含指定 value isequal : property 和指定 value 相等 startswith : 以 value 起始的property regex ereregex
Rsyslog Queue
队列是 rsyslog 的核心。下午(来源) 展示了rsyslog处理消息的流程:
队列分为 Main Queue
和 Action Queue
,Main Queue 只有一个,Action Queue 有多个,每一个 Action 前面都有一个 Action Queue。Main Queue 的配置一般以MainMsg
开头,Action Queue的配置以Action
开头,两者的配置基本相同。
队列的模式有Direct
, Disk
, In-Memory
, Disk-Assisted Memory
四种,最后一种后面都简称DA,这种队列模式是Disk 和 In-Memory的结合体。其中 In-Memory 又包括 FixedArray
和 LinkedList
两种模式。
Direct Queues
实际上是一个 non-queuing
queue。它直接把消息从 producer 传递给 customer。
这种模式适合简单的把日志写入本地, 效率非常高。
所以 Action Queue 的默认模式就是 Direct Queues。
Disk Queues
这种对了使用硬盘当做缓存,因为没有使用内存,所以缓存速度最慢,但是可靠性最高,一般用于数据非常重要的情景下。
缓存文件存在指定的目录下,文件名是 队列名.7位数字
,从 0000001
开始,当一个文件达到限制的最大大小,会继续新建文件,文件名加一。
In-Memory Queues
这种队列是最常使用的队列,它分为 FixedArray
和 LinkedList
两种。它们使用内存作为缓存,所以效率非常高,但是相对的它们的可靠性没有Disk Queue好。
FixedArray 是预分配固定大小的队列,也是Main Queue的默认模式。它针对的是队列日志相对较小的情况,拥有很好的性能。
LinkedList 是动态分配大小的队列,适合队列日志很大的情况。
官方建议这两者间优先选择 LinkedList。
Disk-Assisted Queues
它集成了In-Memory 和 Disk 这两种队列的优点。
如果一个In-Memory Queue定义了队列名(通过 $<object>QueueFileName
),它自动就变成 Disk-Assisted
(DA)模式。
DA队列实际是两个队列,一个普通的memory队列 (called the "primary queue")和一个disk队列(called the "DA queue")。当达到一定条件后,DA队列就会被激活。
关于队列的配置
因为 MainMsgQueue 和 ActionQueue 的配置基本一样(除了有些默认值可能不同), 所以这里以MainMsgQueue 为例:
$MainMsgQueueType [FixedArray/LinkedList/Direct/Disk]
$MainMsgQueueFileName <name>
针对disk queue的配置,定义队列名,存储队列数据时用的文件名就是这个名称MainMsgQueueCheckpointInterval <number>
针对disk queue的配置,单位条数,设置在检查点写入相关信息,增加可靠性,但是会降低性能$MainMsgQueueDequeueBatchSize <number>
[default 32] 设置多少条队列作为一个batch一起出队,针对一个日志量很大的系统,可以考虑把这个值调高来增加性能,不过要结合可使用内存考虑实际情况
对于DA队列,最有特点就是队列阈值的设置了。主要包括这几个配置:
$MainMsgQueueSize
设置队列的最大大小$MainMsgQueueDiscardMark <number>
[default 9750] 配合下面的$MainMsgQueueDiscardSeverity
,超过这个watermark后,不重要的日志都会丢弃,包括新进来和已经在队列里的$MainMsgQueueDiscardSeverity <severity>
[default 4 (warning)] 0-Emergency, 1-Alert, 2-Critical, 3-Error, 4-Warning, 5-Notice, 6-Informational, 7-Debug$MainMsgQueueHighWaterMark <number>
[default 8000] 设置 high watermark$MainMsgQueueLowWaterMark <number>
[default 2000] 设置 low watermark$MainMsgQueueMaxFileSize <size_nbr>
[default 1m] 针对disk情况下,单个文件的最大大小$MainMsgQueueMaxDiskSpace
控制占用硬盘总空间大小
DA 对于阈值处理的逻辑比较有意思,并不是单纯的内存满了就开始使用硬盘。首先,有 low watermark
和 high watermark
这两个概念。
如果队列大小达到 high watermark,队列开始写数据到disk 如果队列大小降到 low watermark,停止写入disk(直到再次达到 high watermark); 或者 disk queue 队列为空(即da队列里的数据处理完),这两种情况都会进入in-memory 模式
关于终止队列的一些处理配置:
$MainMsgQueueTimeoutEnqueue
[number is timeout in ms (1000ms is 1sec!), default 2000, 0 means indefinite] 当队列或硬盘满了,在这个超时时间后新来的日志,设置0可以直接丢弃掉$MainMsgQueueTimeoutShutdown <number>
[number is timeout in ms (1000ms is 1sec!), default 0 (indefinite)] 当队列关闭时,还有数据在进入队列,rsyslog会尽可能在这个timeout周期内处理掉这些数据$MainMsgQueueTimeoutActionCompletion <number>
[number is timeout in ms (1000ms is 1sec!), default 1000, 0 means immediate!] 配置需要多久来处理完当前的数据$MainMsgQueueSaveOnShutdown [**on**/off]
针对disk queue的配置,当运行中的队列关闭时,会先把队列中的数据存在硬盘中$MainMsgQueueDequeueSlowdown <number>
[number is timeout in microseconds (1000000us is 1sec!), default 0 (no delay). Simple rate-limiting!] 简单的出队速度限制,单位微秒$MainMsgQueueImmediateShutdown [on/off]
弃用的选项
当配置的队列大小或硬盘空间满了以后,rsyslogd 会限制数据submitter。配置 $MainMsgQueueTimeoutEnqueue
后,当超过这个时间后新来的日志会被丢弃;设置0为直接丢弃。
$MainMsgQueueTimeoutShutdown
、$MainMsgQueueTimeoutActionCompletion
和 $MainMsgQueueSaveOnShutdown
是在队列终止后可以做的一系列措施。
关于队列的worker thread:
$MainMsgQueueWorkerThreadMinumumMessages <number>
[default 100]$MainMsgQueueWorkerThreads <number>
[num worker threads, default 1, recommended 1]$MainMsgQueueWorkerTimeoutThreadShutdown <number>
[number is timeout in ms (1000ms is 1sec!), default 60000 (1 minute)]
每个队列(direct queue除外)都有一个工作线程池(worker thread pool). 初始时,是没有worker thread的,当有消息来是,会自动启动一个.$MainMsgQueueWorkerThreadMinumumMessages
配置一个worker thread处理的消息大小, $MainMsgQueueWorkerThreads
配置work thread的上限值。
比如设置一个worker thread的最小处理消息大小是100个,当小于100个是,只有一个worker,当超过100个,小于200个时,会有两个worker...
以上配置要注意单位
, 默认值
,Main Queue 和 Action Queue 可能有些配置的默认值不一样。
另外所有指明针对disk
的配置,都是包括 disk queue 和 DA queue.
更多配置参考这里
在一般情况下,大部分的配置都可以直接使用默认的配置,这里给出一份Action使用DA队列的配置:
# 这两个是全局的 $ActionResumeRetryCount 3$ActionResumeInterval 10# 以下是每个ActionQueue自己的配置$ActionQueueType LinkedList$ActionQueueFileName da_queue$ActionQueueMaxFileSize 100M # 设置单个disk文件的大小$ActionQueueMaxDiskSpace 10G # 设置最大占用空间$ActionQueueDisacdSeverity 3 # 设置忽略的等级$ActionQueueLowWaterMark 5000 # 默认是2000$ActionQueueHighWatermark 15000 # 默认是8000$ActionQueueDiscardMark 30000 # 默认是9750$ActionQueueSize 80000 # 文档没写,测试发现默认是1000$ActionQueueSaveOnShutdown on*.* @log-center.xxx.com:514
Main Queue 的默认模式是 FixedArray
,Action Queue 的默认模式是 Direct
关于Rsyslog Queue的官方文档:
impstats 模块
队列的相关统计信息可以使用输出模块 impstats
来查看。参考配置:
$ModLoad impstats$PStatInterval 5$PStatSeverity 7syslog.=debug /var/log/rsyslog-stats&~
样例表示每5s(默认是300s)生成一个统计信息,日志等级是7及以上(默认是6),日志写入/var/log/rsyslog-stats后丢弃。
这里我配置为DA类型,通过 impstats 模块观察:
2014-03-14T17:51:16.744660+08:00 localhost rsyslogd-pstats: imuxsock: submitted=3086634 ratelimit.discarded=0 ratelimit.numratelimiters=02014-03-14T17:51:16.744712+08:00 localhost rsyslogd-pstats: action 1 queue[DA]: size=138176 enqueued=138176 full=0 maxqsize=1381762014-03-14T17:51:16.744720+08:00 localhost rsyslogd-pstats: action 1 queue: size=13808 enqueued=151976 full=0 maxqsize=200092014-03-14T17:51:16.744727+08:00 localhost rsyslogd-pstats: main Q[DA]: size=0 enqueued=0 full=0 maxqsize=02014-03-14T17:51:16.744732+08:00 localhost rsyslogd-pstats: main Q: size=4 enqueued=3087045 full=0 maxqsize=261
可以看到,action queue使用了da队列,因为默认的 $WorkDirectory /var/spool/rsyslog
,在 /var/spool/rsyslog 下可以看到存储的日志:
root@localhost:/var/spool/rsyslog# lltotal 160384drwxr-xr-x 2 syslog adm 36864 Mar 14 17:50 ./drwxr-xr-x 7 root root 4096 Oct 29 13:27 ../-rw------- 1 syslog syslog 100000283 Mar 14 17:50 fwdacq.00000001-rw------- 1 syslog syslog 50443050 Mar 14 17:52 fwdacq.00000002root@localhost:/var/spool/rsyslog# du -sh *96M fwdacq.0000000149M fwdacq.00000002
存储文件默认是用队列名.7位数字
以递增方式命名的,因为定义了存储文件的最大值是100M,所以可以看到第一个是96M,再存储就存不了了,进而新建第二个文件存储。
2014-03-14T17:27:07.485964+08:00 localhost rsyslogd-pstats: imuxsock: submitted=32005 ratelimit.discarded=0 ratelimit.numratelimiters=02014-03-14T17:27:08.090574+08:00 localhost rsyslogd-pstats: action 1 queue[DA]: size=0 enqueued=0 full=0 maxqsize=02014-03-14T17:27:08.090590+08:00 localhost rsyslogd-pstats: action 1 queue: size=1000 enqueued=1065 full=65 maxqsize=10002014-03-14T17:27:08.090598+08:00 localhost rsyslogd-pstats: main Q[DA]: size=0 enqueued=0 full=0 maxqsize=02014-03-14T17:27:08.090604+08:00 localhost rsyslogd-pstats: main Q: size=9940 enqueued=32042 full=18 maxqsize=10000
在没有配置 $MainMsgQueueSize
和 $ActionQueueSize
时,可以看到队列最大值分别是10000和1000。
更多的可以参考:
更多资料
官方资料
–EOF–
rsyslog 2017-09-19 15:12
rsyslog配置解析的更多相关文章
- NGINX(四)配置解析
前言 nginx配置解析是在初始化ngx_cycle_t数据结构时,首先解析core模块,然后core模块依次解析自己的子模块. 配置解析过程 nginx调用ngx_conf_parse函数进行配置文 ...
- nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化
配置解析 nsqd的主函数位于apps/nsqd.go中的main函数 首先main函数调用nsqFlagset和Parse进行命令行参数集初始化, 然后判断version参数是否存在,若存在,则打印 ...
- configparser_配置解析器
configparser:配置解析器 import configparser config = configparser.ConfigParser() #配置文件 config[', 'Compres ...
- spring+mybaits xml配置解析----转
一.项目中spring+mybaits xml配置解析 一般我们会在datasource.xml中进行如下配置,但是其中每个配置项原理和用途是什么,并不是那么清楚,如果不清楚的话,在使用时候就很有可能 ...
- DNS Bind服务配置解析
DNS域名解析服务(Domain Name System)是用于解析域名与IP地址对应关系的服务,功能上可以实现正向解析与反向解析: 一.DNS服务器工作模式分类: 1.主服务器:在特定区域内具有唯一 ...
- rsyslog 配置 二
转自:https://www.cnblogs.com/cherishry/p/6775163.html rsyslog 配置 二 # rsyslog configuration file # For ...
- 初识nginx——配置解析篇
一.nginx的介绍 nginx是由俄罗斯人开发的一款高性能的http和反向代理服务器,也可以用来作为邮件代理.相比较于其他的服务器,具有占用内存少,稳定性高等优势 二.nginx的配置 nginx的 ...
- Apache入门 篇(二)之apache 2.2.x常用配置解析
一.httpd 2.2.x目录结构 Cnetos 6.10 YUM安装httpd 2.2.x # yum install -y httpd 程序环境 主配置文件: /etc/httpd/conf/ht ...
- OK335xS 系统启动配置解析
OK335xS 系统启动配置解析 一.参考文档: AM335x ARM® Cortex™-A8 Microprocessors (MPUs) Technical Reference Manual 二. ...
随机推荐
- 关于突破 SESSION 0 隔离场景发现的一些问题
0x00 Tricks 0x01 用ZwCreateThreadEx 在 Windows 10 下直接通过管理员权限+SeDebugPrivilege启用. 0x02 用CreateRemoteThr ...
- uniapp小程序迁移到TS
uniapp小程序迁移到TS 我一直在做的小程序就是 山科小站 也已经做了两年了,目前是用uniapp构建的,在这期间也重构好几次了,这次在鹅厂实习感觉受益良多,这又得来一次很大的重构,虽然小程序功能 ...
- 一文学会Java事件机制
本文同时发布于个人网站 https://ifuyao.com/blog/java-event/ 相信做 Java 开发的朋友,大多都是学习过或至少了解过 Java GUI 编程的,其中有大量的事件和控 ...
- React Native之新架构中的Turbo Module实现原理分析
有段时间没更新博客了,之前计划由浅到深.从应用到原理,更新一些RN的相关博客.之前陆续的更新了6篇RN应用的相关博客(传送门),后边因时间问题没有继续更新.主要是平时空余时间都用来帮着带娃了,不过还是 ...
- DataX的安装及使用
DataX的安装及使用 目录 DataX的安装及使用 DataX的安装 DataX的使用 stream2stream 编写配置文件stream2stream.json 执行同步任务 执行结果 mysq ...
- 使用寄存器点亮LED
1. 项目:使用stm32寄存器点亮LED, 分别点亮红.绿.蓝3个灯. 2. 代码: 只需要编写main.c程序,stm3210x.h程序为空(只需要新建即可). 2.1 点亮绿灯main.c程序 ...
- 初学python-day4 字典(已更新完)
- Abp VNext分表分库,拒绝手动,我们要happy coding
Abp VNext 分表分库 ShardingCore ShardingCore 易用.简单.高性能.普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2+的所有版本, ...
- XSS_Labs靶场通关
XSS-labs靶场(1-20) 开始通关! 0x01 (直接漏洞注入) 反射型xss注入 1.遇到?name=text,尝试参数注入 注入语句: <script>alert('xss ...
- 所驼门王的宝藏(Tarjan)
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...