rsyslog 入门 第二篇 imfile omfile

本文探讨了如何使用rsyslog模块和模板统一不同来源的日志格式,以便于日志分析。通过定义模板,实现了日志内容的重新组合和关键信息的提取,简化了Logstash中的grok解析过程。示例中详细展示了针对nginx日志的处理,以及如何在Logstash中利用ruby过滤器进一步转换日志格式,提高了日志处理的效率和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# vi /etc/rsyslog.d/test.conf 

  module(load="imfile")
  module(load="omfile")
#使用到什么模块,加载

template(name="ThisIsTemplateName" type="string" string="/tmp/custom_filename_%$year%-%$month%-%$day%.log")
#定义一个模板。首先是模板名字。模板的类型2种:1是字符型string,2是列表型list 。  最后是omfile 将处理好的事件(一条日志)输出到哪个文本中。变量rsyslog 内置的。

template(name="nginx_a" type="string" string="%msg%\n")
#再定义一个模板。第三个参数调用变量,%msg%  就是rsyslog 读取到的一条日志(事件)。
#就算是tomcat之类的日志,如果你rsyslog用了多行规则,那么多行合并后就是一条日志(事件)嘛。


template(name="nginx_b" type="list"){
property(name="hostname") constant(value="#nginxlogtest")
constant(value="#") property(name="msg" position.from="1" position.to="19")
constant(value="#") property(name="msg" field.delimiter="32" field.number="3")
constant(value="#") property(name="msg" position.from="32" position.to="9999")
}
#定义第三个模板,这就是列表型的模板。property 这个应该是变量的意思。constant这个是常量。
#举例,如果一条完整的日志是括号中的内容【2017-09-28 10:36:21 [test] info www.baidu.com 192.168.10.1】
#property(name="hostname")  这个就是linux命令hostname得出的值。取到主机名。。。假如是nginx-server
#constant(value="#nginxlogtest") 常量嘛。就是双引号之内的值。
#第三行property,msg 就是这一条日志,这里不用%号,position.from  position.to  就是从第几 到 第几 个字符。2017-09-28 10:36:21  包括空格,19个。
#第四行property,field.delimiter  字面意思:字段(域) 间隔符。msg这条日志,以ascii码32 ,就是空格,为间隔符,第三个字段(域)。就是 [test]
#第五行property,日志中的info 这个给跳过掉了,从第32个字符开始起算,也不知道日志会有多长,直接9999 , 长度随便写。
###最后### 这就是在拼接一条新的日志(事件),会拼接成如下,以#号分隔开的新内容:
nginx-server#nginxlogtest#2017-09-28 10:36:21#[test]#www.baidu.com 192.168.10.1

特别说明一下,nginx日志是可以自定义生成的格式的。所以第三个模板再好的不太合适了。而以nginx也有个$hostname的变量,生成日志就自带了hostname。而$host变量则记录访问的域名(主机头)
信息相当丰富。完全可以一条日志,就定位到是哪一台机器,哪一个域名的访问状况。第二种模板就可以了。而我们不就是想要看到一条日志,就可以轻易定位到某某个日志文件中去。
对于非nginx的其他日志,第三个模板就相当合适。而且,重做成#做间隔符,在logstash 中就不需要写蛋疼的grok。要简单很多。


input(
type="imfile"        #使用的是infile模块,下边的参数,都是这个模块的参数。
File="/tmp/1.log"    #采集哪个文本
startmsg.regex="^2017"        #多行匹配,遇到2017开头的行,包括它之后,所有非2017开头的行,合并成一行。合并时的间隔,是\n 。 可以通过tcpdump抓包,a行跟b行合并后,中间是\n。
startmsg.regex="^\\["      ##双斜杠!!! 就是中括号开头。多写个例子,可不是说让你同时写二个。
readTimeout="60"              #多行匹配超时设置。新的2017开头的日志进来,上一条合并才会结束,结束了就进入rsyslog其他操作最后输出。设置超时,不然有可能等一辈子。
freshStartTail="off"         #看到Tail 这个就知道了。Tail是从最后读,off关闭,就是从文本开头读取。当然,要第一次读这个文本,这个才有效,读过的,都有记录状态文件。
addMetadata="on"         #开启元数据,就是第三个模版那里,还可以加一个变量,就是读取的文本     的绝对路径。用不到不写。
Severity="info"
Facility="user"
tag="nginx_access"
ruleset="ruleset11"        #调用ruleset
)
##多行参数用不到可以不要写上。


ruleset( name="ruleset11" ){
action(type="omfwd" Target="10.116.1.1" Port="514" Protocol="tcp" template="nginx_a" )
action(type="omfile" dynaFile="ThisIsTemplateName" fileOwner="develop" fileCreateMode="0655" template="nginx_b" )
stop
}
#最后部分,ruleset 就是处理步骤顺序。。通常只需要一个action就行。
#第2行action,omfwd 模块,是内置模块。就是不体现在模块列表里.so 字眼。但实际确实有这个模块功能。。nginx_a模板中无对事件进行修改,读取到什么就发送什么。过通tcp发送到。。。
#第3行action。dynaFile 是动态文件名,在第一个模板里,设置了以日期为变量。如果静态,参数就是file="/tmp/xx.txt",nginx_b模板中已重新拼接过。输出就是新的格式了。
#一条日志,一份发送出去,一份保留在本地。2份还处理成不一样的内容。
#如果日志中有字符需要处理替换。比如第2个action里的事件,需要把aaa替换成bbb。则在第2个action的前一行插入:

  set $.replaced_msg = replace($msg, "aaa", "bbb");
    #设置一个新的变量,必需以. 开头 。。$msg 是读取到的原始文本。$.replaced_msg是做过替换后的新变量。。上边的2个模板中的msg都要跟着换成.replaced_msg,nginx_a模板不需要改。
因为第一个action 并没要求进行替换。
   #不能对msg直接进行修改。好像有哪个模块可以。忘了 。。反正file模块不行。

 

 

 

 

 

-------------------------------------------------------------------------------------------------------------
各家公司的日志,就算是nginx 也是各种不同。何况还有业务服务产生的日志。这格式就更没谁了。
而通过第三个模板这样重新拼接一次后,将格式统一成间隔符的形式。。而在logstash 进行字段解析的时候,就不必写grok了。grok的正则,差一个空格就出错了。
比如,nginx 的XFF变量,有时是多个IP的。。用grok 也是麻烦。下面是重新生成的日志。在Logstash这么写配置:

nginx-server#nginxlogtest#2017-09-28 10:36:21#[test]#www.baidu.com 192.168.10.1

input { tcp { port => 514  type => nginx_xx_log } }        ## 这是开放个端口,好让rsyslog发送过来。

filter {
if [type] == " nginx_xx_log" {
ruby {
init => "@kname = ['hostname','log_name','log_time','status ','new_msg']"        #定义新的各个字段名。
code => "new_event = LogStash::Event.new(Hash[@kname.zip(event['message'].split('#'))]); new_event.remove('@timestamp');event.append(new_event)"
remove_field => ["message","@version","host"]
}

##code => 这一句,只需要改间隔符是什么。我也不懂ruby,照抄还不会。  上边这个是基于ELK2.X版本的,5.X略有区别。看下面


filter {
if [type] == " nginx_xx_log" {
ruby {
init => "@kname = ['hostname','log_name','log_time','status ','new_msg']"
code => "new_event = LogStash::Event.new(Hash[@kname.zip(event.get('message').split('#'))]); new_event.remove('@timestamp');event.append(new_event)"
remove_field => ["message","@version","host"]
}

### rsyslog 系统日志程序的功能介绍 #### 日志管理基础 rsyslog 是一种增强型的日志管理系统,用于替代传统的 syslog 和 klogd 组件。传统上,在 CentOS 5 及更早版本中,系统日志由两个独立的服务负责:`syslogd` 负责记录应用程序产生的日志,而 `klogd` 则专注于捕获 Linux 内核生成的日志[^1]。 然而,随着技术的发展,这种分离式的架构逐渐显得不足以为现代复杂环境提供高效支持。因此,rsyslog 应运而生,作为一个统一且强大的解决方案来满足这些需求。 #### 高性能特性 相比原始的 syslog 实现方式,rsyslog 提供显著更高的吞吐量以及更加灵活配置选项的能力。官方资料表明其能够每秒处理多达一百万条消息事件[^2]。这一能力使得即使是在高负载生产环境中也能保持稳定运行状态而不至于因为大量涌入的数据而导致崩溃或者延迟增加等问题发生。 #### 安全性和模块化设计 除了速度之外,安全性也是该软件开发过程中重点考虑的一个方面;通过内置加密机制保护传输过程中的敏感信息不被窃取篡改成为可能 。另外值得注意的是它的高度可扩展性——借助于插件系统(plugins),用户可以根据实际需要加载不同的功能组件以实现特定目的 ,比如数据库存储、网络协议适配等等。 #### 配置与维护 当完成必要的设置更改之后(例如指定远程服务器地址以便集中式日志管理),可以通过简单的命令重新启动服务使新参数生效: ```bash [root@node1 ~]# systemctl restart rsyslog ``` 此操作会立即应用最新的规则集并开始按照新的指示行事[^3]。 综上所述,rsyslog 不仅继承了经典 syslog 协议的核心理念,还在此基础上进行了多方面的改进优化,从而成为了当前主流操作系统平台上的首选日志工具之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值