0

我正在尝试使用默认的活动 Web 库将所有​​内容记录到单独的日志文件中。现在我在 IntelliJ 下运行所有​​东西(通过 mvn jetty:run),所有的日志都只输出到控制台。

我尝试在 WEB-INF 目录中添加一个 log4j.properties 文件;没用(我没有在我的 pom 中添加 log4j 依赖项,因为我不希望它在那里)。

查看 slf4j,我找不到任何属性或配置文件让我定义如何登录到特定的日志文件。而且,我不确定 AW 使用什么日志记录,所以很难看出我需要配置什么。

卡在这一点上,只需通过 slf4j 站点进行谷歌搜索和阅读以尝试使其正常工作。

4

1 回答 1

0

我一般来说,如果你想通过 Log4j 和 Slf4j 完成日志记录,你需要添加适当的依赖项。这是我们的一个项目的配置:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
       <version>1.7.5</version>
    </dependency>

这将带来适当的部门。

这是log4j.properties文件的内容。

log4j.rootLogger=INFO, ${logger-name}, SPLUNK

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

log4j.appender.SPLUNK=org.apache.log4j.DailyRollingFileAppender
log4j.appender.SPLUNK.File=${catalina.home}/logs/worker-splunk.log
log4j.appender.SPLUNK.Append=true
log4j.appender.SPLUNK.Encoding=UTF-8

# This is a filter that will filter out junk we do not want to sent to Splunk
log4j.appender.SPLUNK.filter.1=app.utils.SplunkLogFilter
log4j.appender.SPLUNK.layout=org.javalite.logging.JsonLog4jLayout


log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File=${catalina.home}/logs/worker.log
log4j.appender.FILE.Append=true
log4j.appender.FILE.Encoding=UTF-8
log4j.appender.FILE.layout=org.javalite.logging.JsonLog4jLayout

logger-name是一个 Maven 过滤的属性。在本地,它被解析为CONSOLE,当应用程序被构建时,它被解析为FILE. 这样,我们可以在开发过程中在控制台上观察日志。

该类SplunkLogFilter如下所示:

import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;

public class SplunkLogFilter extends Filter {

    private static final String[] EXCLUDED_LOGGERS = new String[]{"***ServiceImpl", "app.utils.ProcessUtil"};
    private static final String[] EXCLUDED_MESSAGES = new String[]{"****Command"};

    @Override
    public int decide(LoggingEvent event) {
        String loggerName = event.getLoggerName();
        for (String excludedLogger : EXCLUDED_LOGGERS) {
            if(loggerName.equals(excludedLogger)){
                return Filter.DENY;
            }
        }
        String message = event.getMessage().toString();
        for (String excludedMessage : EXCLUDED_MESSAGES) {
            if(message.contains(excludedMessage)){
                return Filter.DENY;
            }
        }
        return Filter.NEUTRAL;
    }
}

因此,我们并行登录到两个文件,其中一个被发送到 Splunk。Splunk 文件较小,因此我们为 Splunk 支付的费用较少,但我们保留完整文件以防万一。

于 2018-08-13T21:16:43.970 回答