rsyslog imfile 模块说明

本文详细介绍了rsyslog中的imfile模块,包括其基本功能、配置参数及使用方法。imfile模块能将标准文本文件转换为syslog消息,并支持文件监控、消息元数据等功能。
stop() {
        echo -n $"Shutting down system logger: "
        killproc -p "${PIDFILE}" -d 30 $exec
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $lockfile
        return $RETVAL
}


prog=rsyslog
exec=/sbin/rsyslogd
lockfile=/var/lock/subsys/$prog


imfile: Text File Input Module 文本文件输入模块

这个模块提供转换任何标准输入文件为一个syslog消息。


一个标准的文本文件是一个文件有可打印的字符串组成

文件是按行读取,任何行读取后被传递到rsyslog的规则引擎。


规则引擎应用过滤条件和选择哪个actions需要来进行。

空行是不被处理的,因为它们会导致空的rsyslog记录,它们只是被忽略



当新的行被写入时,它们从文件里取出被处理根据选定的模式,


这个发生通过inotify 或者基于一个轮询间隔。


特别是在轮询模式下,文件读取不立即发生,但是会有轻微的延迟(由于处理队列和内部处理)在inotify mode.


文件监控支持文件循环,为了全面工作,rsyslogd 必须运行当文件是被循环。

然后,任何留下的行从老的文件被读取和被处理 ,一个新的文件是被处理从头开始。

如果 rsyslogd 停止在循环期间,读取新的文件,但是任何没有被报告的行从之前的文件是不会在获取

当rsyslogd 被停止当监控一个文件时,它记录最后处理的位置然后继续从那时候开始处理。

因此没有数据会丢失在重启期间


Metadata 元数据

imfile 模块支持消息元数据,它支持下面的数据项:



filename 文件名

消息来自文件的名称, 这是很有用的 当使用通配符在文件监控里,因为 它只唯一的方式知道消息来自哪里。

值可以被访问使用 %$!metadata!filename% property.


元数据目前是唯一的如果启用,默认的 它是启用的用于input() 语句包含通配符


对于所有其他,默认是禁用的。它可以显示的打开或者关闭通过 addMetadata input() parameter, 



State Files 状态文件

rsyslog 必须跟踪文件的哪个部分已经被处理了, 这个是在所谓的 “state files”完成。

那些文件总是被创建在rsyslog 的工作目录。

为了避免重复状态文件的问题,rsyslog 自动的生成状态文件命名根据下面的规则:


字符串"imfile-state:"是被增加在实际文件名称前, 包含了完整的路径:


全名是添加到字符串后,但是所有的/是被替换为-便于处理



作为一个具体的例子, 考虑 文件 /var/log/applog 被监控, 相应的状态文件会被命名为imfile-state:-var-log-applog.

jrhwpt01:/# find . -name "imfile-state*"
./imfile-state:-var-log-nginx-access.log
./imfile-state:-var-log-nginx-error.log


注意 是可以设置一个固定的状态文件通过过时的“stateFile” parameter. 

它是被建议避免这个, 因为用户必须照顾名字冲突。


最重要的是,如果 "stateFile" 被设置用于文件监控通配符,相同的状态文件被用于所有的那些文件的发生。


总之,这个通常不会工作会导致名字冲突


Module Parameters 模块参数;

mode ["inotify"/"polling"]
Default: “inotify”

Available since: 8.1.5


这个指定如果imfile 是运行在 inotify (“inotify”) or polling轮询模式。

传统上,imfile 使用轮询方式,它是更加资源紧张的(更慢的)相比inotify 模式。


建议用户开启"polling" 模式只有它们遇到奇怪的文件在inotify 模式。


轮询间隔

module(load="imfile" PollingInterval="5")

Default: 10 默认10


这个设置指定对文件进行轮询获得新数据的间隔,显而易见,它的效果只有当imfile是运行在polling 模式


时间单位是秒,在每个轮询间隔, 所有的文件是被处理以循环的方式


一个短的轮询间隔提供了更加快速的消息转发,但是需要更多的系统资源。

虽然它是可能的, 我们强链推荐不要设置polling interval  到0秒。


那样会让rsyslogd 变成一个CPU dog, 占用相当多的资源。它是被支持的,

然而, 对于一些极端的情况,这个level 是需要的。

即使你需要快速响应,1秒应该足够好了。

Input Parameters Input 参数:
input(type="imfile"
File="/var/log/nginx/access.log"
Tag="zjzc-frontend01-access"
Severity="info"
Facility="local5")


File [/path/to/file]

input(type="imfile"
File="/usr/local/apache-tomcat-7.0.55_8082/logs/localhost_access_log.*.txt"
Tag="zjzc-api-access01"
Severity="info"
Facility="local5")


(需要的参数) 这个是被监控的文件,到目前为止,这个必须是一个绝对路径.

注意 通配符是被支持的在文件名字级别


Tag

(所需的参数) tag 可以用于消息来自这个文件,如果你看到在标签后的:(冒号)


你指定像(like ‘tag=”myTagValue:”’).



Facility  设备:

syslog 设备可以被分配到行读取,可以被指定以文件形式 格式(e.g. “local0”, “local1”, ...) 

默认是 “local0”.



Severity [syslogSeverity]

syslog 严重性 可以被废品到行读取,模式是notice


Persist State Interval [lines] 坚持状态区间

指定状态文件写的频率 当处理input file时。

默认是0,意味着 新的state file 只有当监控的文件被关闭才会写(结束rsyslog 执行).


任何其他值 n意味着 状态文件是被写入 每次 n文件行被处理, 这个设置可以用于保护消息重复由于致命错误(断电)

注意这个设置影响imfile 性能,尤其当设置为一个小的值,频繁写状态文件是非常耗时的

$InputFilePersistStateInterval 1 #回写偏移量数据到文件间隔时间(秒)


startmsg.regex [POSIX ERE regex]


这个允许 处理多行消息,当设置,一个消息是终止当下一个开始,

startmsg.regex 包含表达式 表示消息的开始。 这个参数是用于正则表达式

readMode [mode] 读模式


这个提供支持用于处理多行消息的标准类型。

它是不够灵活的相比startmsg.regex但是提供了更高的性能相比正则处理,注意readMode 

和startmsg.regex 不能都被定义用于相同的输入


值范围是从0-2, 确定多行检测方法

0 (默认的)每行是一个新的消息

escapeLF [on/off] (requires v7.5.3+) 


这个唯一有意思是如果多行消息是被处理的, LF 字符嵌入到syslog 消息导致大量的问题,

因为大多数工具,甚至 legacy syslog TCP protocol 不期望那些。


如果设置为on,这个选项 避免这种问题通过正确的转义LF字符串为4字节的顺序"#012"

MaxLinesAtOnce [number] 一次最多行

这是一个传统的设置只有在轮询模式下支持,在inotify mode, 它是固定为0,所有尝试配置一个不同的值都会被忽略,

会产生一个错误

请注意 将来imfile 版本可能不支持整个参数,推荐不要使用它



在polling 模式,如果设置为0, 每个文件会完全被处理,然后处理切换到下一个文件。

MaxSubmitAtOnce [number]

每次最大提交数量


这是一个专家选项,它可以用于设置最大数量批量输入大小,infile可以生成。

默认是1024, 这是适用于广泛的应用


deleteStateOnFileDelete [on/off] (requires v8.5.0+)

默认 on


这个参数控制如果状态文件被删除 如果它们相关的主要文件是被删除,通常,

这是一个好的注意,因为其他问题会发生如果一个新的文件具有相同的名字被创建。在这种情况下,imfile会从删除的文件最后的位置开始读取,这通常是你不想要的

reopenOnTruncate [on/off] (requires v8.16.0+)
Default: off


这是一个实验性的东西告诉rsyslog 重新input file 当它被truncated(inode 没有改变 但是文件大小是小于当前偏移量在内存里)


input(type="imfile"
File="/var/log/nginx/scan.log"
Tag="uat-scan"
Severity="info"
PersistStateInterval="1"
reopenOnTruncate="on"
Facility="local5")

转载于:https://www.cnblogs.com/zhaoyangjian724/p/6199140.html

<think>好的,我现在需要帮助用户将他们的imfile模块配置从旧版本迁移到v8版本的rsyslog。用户提到了ModLoad、InputDir、InputFileTag等旧指令,我需要将这些转换为v8的新语法。 首先,我得回忆一下rsyslog v8的语法变化。旧版本使用以$开头的指令,而v8引入了更结构化的RainerScript配置方式。比如,ModLoad会被替换成module(load="...")的形式。所以用户的$ModLoad imfile应该改成module(load="imfile")。 接下来,InputDir可能在旧配置中用于指定监控目录,但v8的imfile模块可能需要不同的参数。查看文档,imfile在v8中通常使用File参数,支持通配符,比如File="/var/log/*.log",不需要单独的InputDir指令。所以用户可能需要将InputDir的路径合并到File参数中,并设置recurse="on"来监控子目录。 然后,InputFileTag在旧版本中是$InputFileTag tag,现在应该作为Tag参数放在input块里。同样,其他如InputFileStateFile、InputFileSeverity、InputFileFacility等参数都需要转换成小写的参数名,并放在input(type="imfile")的配置块中。例如,$InputFileStateFile变成stateFile="...",注意参数名可能略有不同,需要确认正确的拼写,比如是否是StateFile或stateFile。 用户还可能遇到PollInterval的问题,旧版本可能使用PollingInterval,而v8中可能改为PollInterval,或者参数名有变化,需要检查文档。例如,旧配置中的PollingInterval="5"可能需要改为PollInterval="5"。 另外,旧配置中的$InputRunFileMonitor可能不再需要,因为在v8中,只要正确配置input块,模块会自动开始监控,不需要显式启动命令。 需要提醒用户注意路径通配符的使用,v8可能需要明确指定通配符的位置,比如File="/var/log/app/*.log",并且可能需要设置recurse="on"来包括子目录。同时,stateFile的路径可能需要正确设置,以便保持状态跟踪。 用户可能还需要处理多个监控文件的配置,旧版本可能每个文件一个InputFile指令,而v8可以在一个input块中使用通配符,或者为每个文件配置单独的input块,具体取决于需求。 最后,配置完成后,用户需要使用rsyslogd -N1命令来验证配置是否正确,避免语法错误。同时,检查日志文件是否有错误输出,确保模块加载和参数使用正确。可能还需要处理模块路径的问题,比如确保imfile模块已正确安装,路径在rsyslog模块搜索路径中。</think>### Rsyslog v8版本imfile配置迁移指南 根据您提供的旧配置片段和引用内容[^1][^2],以下是新旧版本关键参数对照和v8兼容配置方案: #### 一、核心语法升级路径 ```mermaid graph LR A[旧版指令] --> B[新版RainerScript] $ModLoad-->module(load=...) $InputFileName-->File= $InputFileTag-->Tag= $InputFileStateFile-->stateFile= $InputFilePollInterval-->PollInterval= $InputFileSeverity-->Severity= $InputFileFacility-->Facility= ``` #### 二、完整迁移示例 **旧版配置(v7及之前)**: ```bash $ModLoad imfile $InputFilePollInterval 5 $InputFile /var/log/app/*.log $InputFileTag app_logs: $InputFileStateFile stat_app $InputFileSeverity info $InputFileFacility local6 $InputRunFileMonitor ``` **新版配置(v8+)**: ```bash # /etc/rsyslog.d/imfile.conf module(load="imfile" PollInterval="5") input( type="imfile" File="/var/log/app/*.log" # 使用通配符需开启递归监控 Tag="app_logs" # 移除旧版结尾的冒号 stateFile="stat_app" # 状态文件路径 Severity="info" Facility="local6" recurse="on" # 新增递归监控子目录 deleteStateOnFileDelete="on"# 文件删除时同步清理状态 ruleset="forward_rule" ) ``` #### 三、关键差异说明 1. **模块加载方式**: - 旧:`$ModLoad imfile` - 新:`module(load="imfile" [参数])` 支持直接附加参数[^1] 2. **监控路径处理**: - 旧:`$InputFileName` + `$InputFileStateFile` - 新:合并为`File`参数+`stateFile`参数,支持POSIX通配符: ```bash File="/var/log/**/*.log" # 双星号跨目录匹配 ``` 3. **递归监控配置**: - 新增`recurse="on"`参数实现旧版`InputDir`等效功能: ```bash input( type="imfile" File="/var/log/containers/" recurse="on" # 监控所有子目录 ... ) ``` 4. **参数命名规范**: - 所有参数改为**全小写**(如`statefile`→`stateFile`) - 移除旧版指令的`$`前缀 5. **多文件监控优化**: ```bash # 单个input块监控多个模式(v8.19+) input( type="imfile" File=["/path/file1.log", "/path/file2*.log"] ... ) ``` #### 四、验证与调试步骤 1. **语法检查**: ```bash rsyslogd -N1 -f /etc/rsyslog.conf | grep imfile ``` 成功输出应包含`imfile`模块加载状态 2. **状态文件验证**: ```bash ls -l /var/lib/rsyslog/stat_* # 默认存储路径 ``` 3. **实时日志追踪**: ```bash journalctl -u rsyslog -f | grep imfile ``` #### 五、高级配置示例(含规则集) ```bash # 加载模块 module(load="imfile" PollInterval="3") # 定义输入 input( type="imfile" File="/opt/app/logs/access.log" Tag="web_access" Facility="local0" Severity="notice" persistStateInterval="10" # 状态保存间隔(秒) readTimeout="30" # 文件打开超时时间 ruleset="kafka_forward" ) # 定义转发规则集 ruleset(name="kafka_forward") { action( type="omkafka" topic="web_logs" broker="kafka01:9092" partitions.auto="on" ) } ``` #### 六、常见错误处理 | 错误现象 | 解决方案 | |------------------------------|----------------------------------| | `parameter 'XXX' not known` | 检查参数大小写,如`PollInterval`非`PollingInterval` | | `state file not writable` | 创建`/var/lib/rsyslog`目录并赋权 | | 文件新增不触发监控 | 确认`recurse="on"`和通配符格式正确 | | 内存持续增长 | 添加`PersistStateInterval="60"`减少状态保存频率 | --- ### 相关问题 1. 如何配置imfile模块监控Kubernetes容器日志? 2. rsyslog v8版本中如何实现日志文件的断点续传? 3. 如何通过Prometheus监控rsyslogimfile模块状态?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值