activeweb - 试图找出 activeweb 日志记录到一个单独的文件
问题描述
我正在尝试使用默认的活动 Web 库将所有内容记录到单独的日志文件中。现在我在 IntelliJ 下运行所有东西(通过 mvn jetty:run),所有的日志都只输出到控制台。
我尝试在 WEB-INF 目录中添加一个 log4j.properties 文件;没用(我没有在我的 pom 中添加 log4j 依赖项,因为我不希望它在那里)。
查看 slf4j,我找不到任何属性或配置文件让我定义如何登录到特定的日志文件。而且,我不确定 AW 使用什么日志记录,所以很难看出我需要配置什么。
卡在这一点上,只需通过 slf4j 站点进行谷歌搜索和阅读以尝试使其正常工作。
解决方案
我一般来说,如果你想通过 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 支付的费用较少,但我们保留完整文件以防万一。
推荐阅读
- reactjs - 如何根据传入的道具对反应组件进行排序
- r - 在哪里下载以前版本的 R for mac?
- bash - 如何获取有关我的 git 本地存储库的每个分支的信息
- jquery - 如何让这个 jQuery 选择器正常工作?带有转义字符
- python - 在 Django 中,如何根据多对多关系过滤 QuerySet 中的对象?
- android-studio - 我如何在 Android Studio 中禁用意图?
- php - Laravel 6.5.1 迁移 Errno:语法错误或访问冲突 1064
- firebase - 如何访问 Future 方法中存在的回调函数的返回值 | 镖
- json - 传递超过一定大小的 Json 时 Ajax 调用失败
- javascript - 在 testcafe 中断言空文本框