Java 到 rsyslog:STDOUT 还是 syslog?

Dir*_*oys 6 java logging syslog rsyslog logstash

理解rsyslog是,它是一个syslog在Ubuntu机服务器实现常见。

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

最后,我的理解是,rsyslog然后可以将任何捕获的消息(再次来自客户端STDOUTsyslog客户端)转发到另一台服务器,例如日志聚合器或另一台rsyslog服务器等。

所以首先,如果我上面所说的有任何不正确,请首先纠正我对如何syslog/rsyslog工作及其相互关系的理解!

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

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

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

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

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

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

Wil*_*ung 5

您应该使用众多记录器中的一个(即 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 is jul FINE )。现在,日志查看器可以访问该数据并对其采取行动。

这就是为什么您不想在可能的情况下仅登录到 STDOUT。最好将日志记录到更高级别,并让稍后的步骤决定如何呈现它和组织数据。