在WebSphere Application Server下配置log4j

时间:2016-01-11 03:06:33

标签: java log4j websphere-8 java.util.logging

我们在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调用来编写日志条目并应用类似于我在自定义模式中放置的逻辑。

再次感谢您的投入。

0 个答案:

没有答案