如何使用 rsyslog 将文件从客户端记录到服务器

如何使用 rsyslog 将文件从客户端记录到服务器

我已经设置了一个 rsyslog 服务器,它接受来自客户端的日志信息。

但是我可以成功接收系统日志消息我也对记录一些文件感兴趣

我的客户如下所示:

$ModLoad imfile

$InputFileName /var/log/drew-error.log
$InputFileTag drew:
$InputFileStateFile stat-drew-error
$InputFileSeverity error
$InputRunFileMonitor

$InputFilePollInterval 1

我不确定服务器配置中到底要输入什么。理想情况下,我希望服务器输出类似以下内容的内容:

/var/log/remote/$HOSTNAME/drew-error.log

我这样做对吗?尝试实现这一目标合理吗?

最佳情况:我希望能够更新我在客户端上查看的文件,而无需重新配置服务器。如果这不可能或太难,我可能可以采用硬编码解决方案。

我尝试过的方法

到目前为止,我已经尝试了一些服务器配置(尽管我觉得它们不是正确的解决方案/方法):

$template syslog, "/var/log/remote/%hostname%/%programname%/%$year%%$month%%$day%/syslog"
*.*;auth,authpriv.none          ?syslog

$template DrewTemplate,"/var/log/remote-DREWAPP-%HOSTNAME%.log"
if $programname == 'drew:' then -?DrewTemplate
& ~

$template PerHostLog,"/var/log/remote-%HOSTNAME%.log"
if $fromhost-ip startswith '1.2.' then -?PerHostLog
& ~

答案1

一个解决方案是检查 $programname(它会根据您监控的每个文件的客户端上的 $InputFileTag 值进行填充)。

客户端配置

在客户端上,创建文件监视器,并确保 $InputFileTag 以“file-”开头。以下是日志文件 foo 和 bar 的示例:

######################### START /var/log/foo.log
$InputFileName /var/log/foo.log
$InputFileTag file-foo:
$InputFileStateFile stat-foo
$InputFileSeverity info
$InputRunFileMonitor
######################### END /var/log/foo.log

######################### START /var/log/bar.log
$InputFileName /var/log/bar.log
$InputFileTag file-bar:
$InputFileStateFile stat-bar
$InputFileSeverity info
$InputRunFileMonitor
######################### END /var/log/bar.log

服务器配置

然后在服务器上,检查 $programname 是否以“file-”开头(对于所有文件监视器来说都应该如此,但对于任何标准系统日志消息来说都不是)。以下是示例:

$template FileTemplate,"/var/log/remote-%HOSTNAME%-%programname%.log"
if $programname startswith 'file-' then -?FileTemplate
& ~
  • 此解决方案检查 $programname 是否以 'file-' 开头
  • 只要你能控制如何标记 $InputFileTag(在客户端),这个解决方案就可以很好地工作
  • 模板使用程序名和主机名来保持服务器上的文件名唯一
  • & ~ 确保此系统日志消息不会在配置中进一步处理
  • 此解决方案在服务器上提供一种配置,每次在客户端上添加新的文件监视器时无需更新该配置。

相关内容