在Alfresco的log4j.properties中配置SyslogAppender

时间:2018-01-03 12:41:37

标签: log4j alfresco syslog

我尝试使用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日志记录可以在不同级别进行定制。出于发展的目的,我目前正致力于“最高”的发展目标。 <Alfresco's Tomcat>/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

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

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

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

是否有人有提示或某些文件表明我可能错过了?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

最后我设法解决了这个问题。我的问题是由于对log4j配置的理解很差,特别是在Alfresco中。

我之前说过,在Alfresco中,log4j可以配置为3个不同的级别,第一个被其他2个人覆盖。 因为我想尽量减少变化,所以我将它们放在最高级别。这样做,我想我不必重新定义已在最低级别定义的rootLogger,并且我只需要将新制作的appender添加到其中。

因为它看起来并不那么容易,而且我还没有找到一种更好的方法来将新的appender添加到默认记录器(rootLogger然后),而不是重新定义它。

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

当我在上面的时候,我改变了不同的调试级别,以便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>是系统日志目标的地址,在我的例子中是ELK服务器的网址。
  • rootLogger的调试级别与将日志发送到ELK所需的一样低。因此,我使用threshold属性在appenders级别过滤日志。

它现在正在工作,我对这个解决方案非常满意。但是我仍然希望找到一种方法来向rootLogger添加一个新的appender,而无需重新定义它。

嗯,它主要是面向Alfresco的问题,因为通常是rootLogger,并且所有的appender都在同一个地方定义。但如果有人有提示,我很乐意听到它。