我们在Webshere Application Server(WAS)上部署了大量应用程序。在类路径的某个地方,我们有一个非常基本的log4j.properties,看起来类似于下面的内容:
log4j.rootLogger=ERROR, FILE, CONSOLE
#
# CONSOLE appender is a ConsoleAppender
#
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%X{component} [%-5p] %c - %m%n
#
# FILE appender is a FileAppender
#
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=##%d{dd-MM-yyyy HH:mm:ss,SSS} %X{component} [%-5p] %c - %m%n
#
# MyApp Debug Levels.
#
log4j.logger.com.my.company.my.app=INFO
请注意log4j.properties中缺少的log4j.appender.FILE.File
文件,这是通过Application Servers -> MyServer -> Logging and tracing -> JVM Logs
配置的艺术WAS级别,文件名设置如下:
${SERVER_LOG_ROOT}/SystemOut.log
更改调试级别可以正常工作,例如添加到log4j.properties后,以下行将导致在日志中获取MySpecialClass
的调试条目。
log4j.logger.com.my.company.my.app.MySpecialClass=DEBUG
这使我得出结论,我的属性文件被认为是。
但是我们最近收到一个请求,除了正常的日志条目之外,还要将一些特殊的日志条目(与应用程序错误相关的日志)输出到一个单独的文件中。我最初的想法是添加一个滚动文件appender并让它完成工作。令我惊讶的是它没有用,与那个appender相关的一切都被忽略了。
然后我认为这可能是因为日志文件是在WAS中配置的,无论我们在log4j.properties中放置什么,一切都会在那里进行,我说有多个应用程序写入同一个日志文件看起来有点奇怪。但是我不想花太多时间在这上面,因为特殊的日志条目是我刚刚说过的error
个,只需使用现有的WAS功能,为System.Err日志提供一个单独的文件:{{1 }}:
Application Servers -> MyServer -> Logging and tracing -> JVM Logs
为实现这一目标,我创建了自己的${SERVER_LOG_ROOT}/SystemErr.log
并实现了这种非常基本的格式化方法:
com.my.company.my.app.CustomPatternLayout
我还替换了log4j.properties中的文件appender以使用我的自定义模式布局
public String format(LoggingEvent event) {
String log = patternLayout.format(event);
Level logLevel = event.getLevel();
if (Level.ERROR.equals(logLevel) || Level.WARN.equals(logLevel)
|| log.contains("Exception") || log.contains("PEM_LOGGER_SEV3")) {
System.err.println(log);
}
return log;
}
我的日志中没有发生任何事情,并且预期的日志条目从未写入SystemErr.log。除此之外,我设置了一些调试断点,我的代码永远不会被执行。但是,如果我从类路径中删除我的自定义类,我在SystemErr.out中得到了一些ClassNotFoundException log4j条目,这是一个符号,我的配置被读取。
没有多少想法,我尝试的最后一件事是创建一个名为log4j.appender.FILE.layout.com.my.company.my.app.CustomPatternLayout
的文件,其内容如下:
org.apache.commons.logging.LogFactory
我们的应用程序使用org.apache.commons.logging.impl.Log4jFactoryImpl
类加载策略运行,我们无法更改此内容。
这最后一次尝试也无效。现在我没有想法,只能帮助某些人为我所缺少的东西带来一些启示。
提前感谢您的意见。
更新
其实我错了。如果log4j用于生成日志条目,则使用parent first
。只有在WAS编写日志条目时才能使用我的自定义模式。我认为这是因为WAS将使用JDK CustomPatternLayout
。所以我的问题将改为:
是否有一种相对简单的方法来拦截WAS调用来编写日志条目并应用类似于我在自定义模式中放置的逻辑。
再次感谢您的投入。