使用同一对象将不同级别记录到不同文件
Logging different levels using same object to different files
我的简单问题是:如果我在 Java 中有两个语句,例如 logger.info() 和 logger.error() (使用 log4j),我想要这两行的结果打印在两个单独的文件中。也就是说,logger.info(...) 应该打印到文件 myLog.info 而 logger.error(...) 应该打印到 myLog.error 文件。我正在为此任务使用滚动文件附加程序。此外,我只想要一个记录器对象来完成这项任务。有人可能会建议每个文件使用两个或多个不同的记录器,但事实并非如此。
我尝试寻找问题的解决方案。其中一个链接 Creating multiple log files of different content with log4j 提到了 "threshold",我什至试图在我的 xml 配置文件中添加阈值。但它实际上是在做什么:信息日志正在 myLog.info 文件中打印,但错误日志在两个文件中打印。可以单独通过 xml 配置文件来完成还是需要单独的属性文件?如果xml文件足够,那么需要做什么?
我更喜欢 xml 文件而不是属性文件。如果有仅使用 xml 配置文件的工作解决方案,那就足够了。提前致谢。
您可以使用过滤器来拒绝除您想要的级别之外的任何消息。以下是如何执行此操作的示例:
首先 class 来测试我们的努力:
package test;
import org.apache.log4j.Logger;
public class Main {
private static final Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) {
logger.debug("here's some debug");
logger.info("here's some info");
logger.warn("here's some warn");
logger.error("here's some error");
logger.fatal("here's some fatal");
}
}
接下来是一个 log4j.xml 配置文件来设置附加程序和记录器:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
</layout>
</appender>
<appender name="debugLog" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/debug.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="5000KB" />
<param name="maxBackupIndex" value="5" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelMatchFilter">
<param name="LevelToMatch" value="DEBUG" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>
<appender name="infoLog" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/info.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="5000KB" />
<param name="maxBackupIndex" value="5" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelMatchFilter">
<param name="LevelToMatch" value="INFO" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>
<logger name="test" additivity="false">
<level value="DEBUG" />
<appender-ref ref="consoleAppender" />
<appender-ref ref="debugLog" />
<appender-ref ref="infoLog" />
</logger>
</log4j:configuration>
此模式将允许您为每个日志级别生成单独的日志,只需重复我为调试或信息日志记录提供的配置即可。请注意,控制台附加程序将接受所有级别。
我能够从 this post 中获得一些见解,所以我认为我应该给予赞扬。
我的简单问题是:如果我在 Java 中有两个语句,例如 logger.info() 和 logger.error() (使用 log4j),我想要这两行的结果打印在两个单独的文件中。也就是说,logger.info(...) 应该打印到文件 myLog.info 而 logger.error(...) 应该打印到 myLog.error 文件。我正在为此任务使用滚动文件附加程序。此外,我只想要一个记录器对象来完成这项任务。有人可能会建议每个文件使用两个或多个不同的记录器,但事实并非如此。
我尝试寻找问题的解决方案。其中一个链接 Creating multiple log files of different content with log4j 提到了 "threshold",我什至试图在我的 xml 配置文件中添加阈值。但它实际上是在做什么:信息日志正在 myLog.info 文件中打印,但错误日志在两个文件中打印。可以单独通过 xml 配置文件来完成还是需要单独的属性文件?如果xml文件足够,那么需要做什么?
我更喜欢 xml 文件而不是属性文件。如果有仅使用 xml 配置文件的工作解决方案,那就足够了。提前致谢。
您可以使用过滤器来拒绝除您想要的级别之外的任何消息。以下是如何执行此操作的示例:
首先 class 来测试我们的努力:
package test;
import org.apache.log4j.Logger;
public class Main {
private static final Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) {
logger.debug("here's some debug");
logger.info("here's some info");
logger.warn("here's some warn");
logger.error("here's some error");
logger.fatal("here's some fatal");
}
}
接下来是一个 log4j.xml 配置文件来设置附加程序和记录器:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
</layout>
</appender>
<appender name="debugLog" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/debug.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="5000KB" />
<param name="maxBackupIndex" value="5" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelMatchFilter">
<param name="LevelToMatch" value="DEBUG" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>
<appender name="infoLog" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/info.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="5000KB" />
<param name="maxBackupIndex" value="5" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelMatchFilter">
<param name="LevelToMatch" value="INFO" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>
<logger name="test" additivity="false">
<level value="DEBUG" />
<appender-ref ref="consoleAppender" />
<appender-ref ref="debugLog" />
<appender-ref ref="infoLog" />
</logger>
</log4j:configuration>
此模式将允许您为每个日志级别生成单独的日志,只需重复我为调试或信息日志记录提供的配置即可。请注意,控制台附加程序将接受所有级别。
我能够从 this post 中获得一些见解,所以我认为我应该给予赞扬。