Java到rsyslog:STDOUT还是syslog?

时间:2014-08-27 20:12:01

标签: java logging logstash syslog rsyslog

rsyslog理解是它是Ubuntu计算机上常见的syslog服务器实现。

此外,我的理解rsyslog可用于挂钩/捕获STDOUT输出以及标准syslog消息。

最后,我的理解rsyslog可以转发任何捕获的消息(同样,来自STDOUT或{{1}客户端)到另一台服务器,例如日志聚合器或其他syslog服务器等。

首先,如果上面提到的任何不正确,请首先纠正我对rsyslog / syslog工作方式及其相互关系的理解!

如果我的假设或多或少是正确的,那么给出以下两个选项:

  • 选项#1:登录到rsyslog并配置STDOUT以捕获该流并将日志消息转发到远程进程(例如日志聚合器);或
  • 选项#2:登录rsyslog并配置syslog以捕获它并将日志消息转发到同一个远程进程

鉴于这两个选项,我更喜欢#1,因为:

  • 在本地或从IDE运行时,rsyslog将打印到控制台;和
  • 在任何非本地环境中投放时,STDOUT只会STDOUT收集rsyslog

如果我使用选项#2,在本地运行时会丢失控制台可见性。

话虽如此,是否有任何安全/性能/其他问题/警告/陷阱/登录STDOUT会使选项#2更具吸引力/可取性?如果是这样,他们是什么?

1 个答案:

答案 0 :(得分:4)

您应该使用众多记录器之一(即java.util.logging等),然后根据每个用例配置它。对于本地测试,请将记录器配置为STDOUT。对于生产,请将其配置为syslog。

通过简单地记录STDOUT,您将丢失记录器提供的任何元数据,或者可能由syslog使用,因为您可以记录的只是消息。

例如,在Glassfish中,运行到STDOUT的任何内容都将作为INFO记录到Glassfish日志中。

因此,如果您正在运行Log4j到STDOUT,则会捕获日志,但是您没有捕获的是它们是WARN还是DEBUG等等。 TAG被捕获,作为消息的一部分,但与通过记录器本身运行的内容相比,消息表面上是不透明的。

如果您已将Log4j配置为使用Glassfish记录器(即java.util.logger),那么Glassfish日志将捕获元信息(如级别),映射到Glassfish日志系统(例如Log4j DEBUG)是jul FINE)。现在,日志查看器可以访问该数据并对其进行操作。

这就是为什么你不想只在可能的情况下登录STDOUT。最好登录到更高级别,然后让后面的步骤决定如何渲染它并组织数据。