我必须提取日志文件、静态文件。假设我的文件中有 100 个事件(100 行)。Rsyslog 必须将这些日志转发到服务器。一旦 Rsyslog 读取了最后一行,我想关闭正在运行 Rsyslog 的容器。
有没有办法知道 RSyslog 何时读取了整个文件,从而知道是否可以关闭容器?
非常感谢
答案1
似乎没有任何内置方式来知道 rsyslogd 是否已到达模块文件的文件末尾imfile
。
一种简单的方法是轮询 rsyslogd 进程的相应打开文件描述符以找到当前读取位置,并将其与文件大小进行比较。lsof
您可以列出进程或文件的此信息,或者您可以只读取文件,/proc/P/fdinfo/N
其中 P 是相应的 pid,N 是文件描述符。当然,这并不意味着读取的数据已发送,因此您需要等待一段时间。
或者,在 rsyslog 中,您可以配置omprog
模块,使其获得发送到服务器的所有相同的行,然后让模块将它们传递给一个程序,该程序对这些行进行计数,并将其与它必须首先从静态日志文件中读取的行数进行比较。
或者,您可以在启动 rsyslogd 之前,在日志文件末尾附加一个特殊标记行,并在 rsyslog 配置中匹配该行,再次使用它omprog
来运行一个发出关闭信号而不是继续发送的程序。
还有一个impstats
模块可以提供读取或写入的总行数统计信息,但它似乎不适用于imfile
。但是,您可能能够在所使用的输出模块上使用它。由于我没有用过它,我不确定它有什么帮助。