如何使用rsyslog从客户端到服务器logging文件

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

我可以成功接收syslog消息,但是我也有兴趣logging一些文件

这是我的客户的样子:

$ModLoad imfile $InputFileName /var/log/drew-error.log $InputFileTag drew: $InputFileStateFile stat-drew-error $InputFileSeverity error $InputRunFileMonitor $InputFilePollInterval 1 

我不确定要在我的服务器configuration。 理想情况下,我想要服务器输出这样的东西:

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

我正在以正确的方式进行吗? 这是合理的尝试实现?

最佳案例场景: 我希望能够更新我在客户端上观看的文件,而不必重新configuration服务器。 如果这不可能,或者太难,我可以围绕一个硬编码的解决scheme工作。

我试过了

到目前为止,我已经尝试了一些服务器configuration(虽然我觉得他们不是正确的解决scheme/方法):

 $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 & ~ 

一个解决scheme是检查$ programname(在每个你监视的文件上,在客户端上用$ InputFileTag的值填充)。

客户端configuration

在客户端上,创build文件监视器,并确保$ 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 

服务器configuration

然后在服务器上,检查$ programname是否以'file-'开头(对于所有的文件监视器应该是这样,而不是任何标准的系统日志消息)。 这里是一个例子:

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