在 Alfresco 的 log4j.properties 中配置 SyslogAppender

Configure SyslogAppender in log4j.properties in Alfresco

我正在尝试使用 syslogAppender 将日志输出从 Alfresco (Enterprise 4.2.7) 后端发送到 ELK 服务器 (Logstash->Elastic Search->Kibana)。

后者的配置超出范围,因为它用于我们公司的许多其他应用程序,因此必须保持通用。

在服务器 (RHEL7) 运行 Alfresco 上,我已经修改了 /etc/rsyslog.conf,设置了系统日志主机、端口和协议:

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# [...]
# ### end of the forwarding rule ###
*.* @<host>

Alfresco 日志记录可以在不同级别进行自定义。出于开发目的,我目前正在 <Alfresco's Tomcat>/shared/classes/alfresco/extension/env-log4j.properties 中研究 'highest' 级别(覆盖其他级别的级别)。在那里,我指定了以下内容:

log4j.logger.ELKLogger=debug, Syslog     # really not sure about this one ...
log4j.appender.Syslog=org.apache.log4j.net.SyslogAppender
log4j.appender.Syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.Syslog.layout.ConversionPattern=[%p] %c:%L - %m%n
# following config attempt didn't help
# log4j.appender.Syslog.threshold=DEBUG
# log4j.appender.Syslog.syslogHost=<host>
# log4j.appender.Syslog.facility=SYSLOG
# log4j.appender.Syslog.port=514
# log4j.appender.Syslog.protocol=UDP

目前,我可以在 ELK 服务器上看到来自服务器上其他来源的日志(cron、守护程序...),但在露天看不到。

我认为我的问题是 Syslog appender 没有正确配置,或者没有为这个 appender 正确设置调试级别。

不幸的是,我没有找到任何使用 Syslog appender 的 Alfresco 文档资源,仅用于文件 appender。所以我可能错过了一些细节甚至明显的配置步骤,但无论如何,似乎没有考虑 Syslog appender。

有没有人有提示或一些文件表明我可能错过了?

在此先感谢您的帮助。

最后我设法修复了它。我的问题是由于对 log4j 配置的一般理解不足,特别是在 Alfresco 中。

A 我之前说过,在 Alfresco 中,log4j 可以配置为 3 个不同的级别,第一个被其他 2 个覆盖。 因为我想尽量减少更改,所以我在最高级别进行了更改。这样做,我想我不必重新定义已经在最低级别定义的 rootLogger,我只需要向它添加新制作的 appender。

看起来并不那么容易,而且我还没有找到比重新定义它更好的方法来向默认记录器添加新的附加程序(rootLogger 然后)。

这样做会覆盖以前存在的 appender 和特定的记录器(在较低级别 log4j.properties alfresco 的文件中定义)。因此我不得不重新定义它们。

当我在上面时,我更改了不同的调试级别,使 ELK 获取所有日志(通过 syslog),而本地日志文件仅获取错误级别的日志。

最后,这是我的 log4j.properties 的样子:

log4j.rootLogger=debug, Console, File, Syslog

###### All outputs currently set to be a ConsoleAppender.
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{ISO8601} %x %-5p [%c{3}] [%t] %m%n
log4j.appender.Console.threshold=warn

##### File appender definition #######
log4j.appender.File=org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.File=alfresco.log
log4j.appender.File.Append=true
log4j.appender.File.DatePattern='.'yyyy-MM-dd
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=%d{yyyy-MM-dd} %d{ABSOLUTE} %-5p [%c] [%t] %m%n
log4j.appender.File.threshold=error

##### Syslog configuration #########
log4j.appender.Syslog=org.apache.log4j.net.SyslogAppender
log4j.appender.Syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.Syslog.layout.ConversionPattern=%d{yyyy-MM-dd} %d{ABSOLUTE} %-5p [%c] [%t]
log4j.appender.Syslog.syslogHost=<host>
log4j.appender.Syslog.facility=LOCAL1
log4j.appender.Syslog.threshold=debug

####### Specific logger level definition ######
log4j.logger.org.alfresco.repo.jscript.ScriptLogger=debug

### external logger global level definition ###
log4j.logger.org.apache=error
log4j.logger.org.alfresco=info
log4j.logger.org.springframework=info
  • 这存储在<alfresco's tomcat>/shared/classes/alfresco/extension/
  • <host> 是 syslog 目标的地址,在我的例子中是 ELK 服务器的 url。
  • rootLogger 的调试级别低至发送日志到 ELK 所需的级别。因此,我使用 threshold 属性在附加程序级别过滤日志。

它现在可以使用了,我对这个解决方案非常满意。但是我仍然想找到一种方法来向 rootLogger 添加一个新的 appender,而不需要重新定义它。

好吧,这主要是一个面向 Alfresco 的问题,因为通常 rootLogger 和所有附加程序都在同一位置定义。但如果有人有提示,我很想听听。