在 Alfresco 的 log4j.properties 中配置 SyslogAppender

Posted

技术标签:

【中文标题】在 Alfresco 的 log4j.properties 中配置 SyslogAppender【英文标题】:Configure SyslogAppender in log4j.properties in Alfresco 【发布时间】:2018-01-03 12:41:37 【问题描述】:

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

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

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

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

Alfresco 日志记录可以在不同级别进行自定义。出于开发目的,我目前正在&lt;Alfresco's Tomcat&gt;/shared/classes/alfresco/extension/env-log4j.properties 中处理“最高”级别(覆盖其他级别)。在那里,我指定了以下内容:

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、守护进程...),但从 alfresco 看不到任何日志。

我认为我的问题是 Syslog appender 配置不正确,或者该 appender 的调试级别设置不正确。

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

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

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

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

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

这样做会覆盖先前存在的附加程序和特定的记录器(在较低级别的 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=%dISO8601 %x %-5p [%c3] [%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=%dyyyy-MM-dd %dABSOLUTE %-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=%dyyyy-MM-dd %dABSOLUTE %-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
这存储在&lt;alfresco's tomcat&gt;/shared/classes/alfresco/extension/ &lt;host&gt; 是系统日志目标的地址,在我的例子中是 ELK 服务器的 url。 rootLogger 的调试级别低到发送日志到 ELK 所需的级别。因此,我使用 threshold 属性在附加程序级别过滤日志。

它现在可以工作了,我对这个解决方案非常满意。但我仍然想找到一种方法,无需重新定义即可将新的 appender 添加到 rootLogger。

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

【讨论】:

以上是关于在 Alfresco 的 log4j.properties 中配置 SyslogAppender的主要内容,如果未能解决你的问题,请参考以下文章

使用 LDAP 的 Alfresco,在 Alfresco 接口中更改用户的密码

无法在 Alfresco 中禁用创建站点权限

Alfresco:如何在 Alfresco Share 中搜索链接(app:filelink 或 cm:link 类型的节点)?

在Alfresco中启用JavaScript登录

Alfresco 和 drupal 集成

跟踪 Alfresco 点击