【问题标题】:Logging different Level messages in different Logs using Log4j使用 Log4j 在不同的日志中记录不同级别的消息
【发布时间】:2012-02-07 19:22:47
【问题描述】:

我想使用 apache Log4j.jar 在我的网络应用程序中维护两个日志文件:

1) 一个日志将包含每个级别的所有日志消息 2) 第二个日志文件将包含特定类的日志消息

这是我正在使用的配置 XML:(不太了解 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="FILE1" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/CSVExportLogs/CSVExportLogFile-ERROR.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<param name="Append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c (%F:%L) - %m%n"/>
</layout>
</appender>

<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/CSVExportLogs/CSVExportLogFile-INFO.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<param name="Append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c (%F:%L) - %m%n"/>
</layout>
</appender>


<category name="com.taxware.mgmt.CustomerManager" additivity="false">
<priority value="warn"/>
<appender-ref ref="FILE"/>
</category>

<root>
<priority value="info"/>
<appender-ref ref="FILE1"/>
</root>
</log4j:configuration>

通过上面的 xml,我只在 FILE1 中获取信息消息,我想要所有级别的消息以及警告级别的消息,这些消息将在此文件的单独文件中。有没有可用的解决方案。

【问题讨论】:

  • 您当前的配置应该将除 CustomerManager 之外的任何类的所有内容 >= INFO 输出到 FILE1。 CustomerManager >= WARN 中的所有内容都将转到 FILE。你到底想要什么?

标签: java log4j


【解决方案1】:
# Create ROOT logger(main logger) with level INFO, and add to it 2 appenders:
# FILE_INFO, FILE_WARN. This means that all loggers by default will writes messages
# in this 2 file appenders, with level INFO or higher
log4j.rootLogger=INFO, FILE_INFO, FILE_WARN

######## LEVELS:
# Set logging level to WARN for all classes and subclasses in package 
# com.taxware.mgmt.CustomerManager
log4j.category.com.taxware.mgmt.CustomerManager=WARN

######## APPENDERS:

# FILE_INFO
# Type of appender
log4j.appender.FILE_INFO=org.apache.log4j.RollingFileAppender
# File where to save all messages
log4j.appender.FILE_INFO.File=D:/CSVExportLogs/CSVExportLogFile-INFO.log
# Max file size, after that will be created new log file, and old file will be renamed
log4j.appender.FILE_INFO.MaxFileSize=100KB
# Maximum amount of old log files.
log4j.appender.FILE_INFO.MaxBackupIndex=100
# Patter of messages.
log4j.appender.FILE_INFO.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE_INFO.layout.ConversionPattern=%d{ISO8601} [%-5p][%-24.24t][%32.32c] - %m%n
# Custom level for appender. In this file will be add only messages with level INFO or highter
log4j.appender.FILE_INFO.Threshold=INFO

# FILE_WARN file appender
log4j.appender.FILE_WARN=org.apache.log4j.RollingFileAppender
log4j.appender.FILE_WARN.File=D:/CSVExportLogs/CSVExportLogFile-WARN.log
log4j.appender.FILE_WARN.MaxFileSize=50KB
log4j.appender.FILE_WARN.MaxBackupIndex=10
log4j.appender.FILE_WARN.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE_WARN.layout.ConversionPattern=%d{ISO8601} [%-5p][%-24.24t][%32.32c] - %m%n
# Custom level for appender. In this file will be add only messages with level WARN or highter
log4j.appender.FILE_WARN.Threshold=WARN

【讨论】:

  • 它解决了我的问题。但是请您解释一下这些属性..只是一个简短的解释
  • 我在设置中添加了更多的 cmets。
  • log4j.appender.FILE_WARN.Threshold=INFO & log4j.appender.FILE_WARN.Threshold=WARN ,两个cmets有用吗?
  • 如果我需要来自 com.taxware.mgmt.CustomerManager 的所有消息,是否需要多次输入?
  • 对不起,这是我的错误。 log4j.appender.FILE_INFO.Threshold=INFO & log4j.appender.FILE_WARN.Threshold=WARN
【解决方案2】:

要记录特定类的消息,您可以执行以下操作:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="myClassAppender" class="org.apache.log4j.FileAppender">
        <param name="File" value="../logs/myClassLogs.log"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m%n"/>
        </layout>
    </appender>
    .............

    <logger name="com.my.package.MySpecificClass">
        <!-- 
                all log messages of level "debug" or higher will be logged, unless defined otherwise 
                all log messages for "MySpecificClass" will be logged to the appender "myClassAppender"
            -->
        <level value="DEBUG"/>
        <appender-ref ref="myClassAppender"/>
    </logger>
    .............
</log4j:configuration>

【讨论】:

    【解决方案3】:
    【解决方案4】:

    我在 log4j 级别说这个行为:

    All < Debug < Info < Warn < Error < Fatal < Off
    

    根据您的配置,发生以下情况:

    1. 所有具有“com.taxware.mgmt.CustomerManager”类别和“警告”和较小级别(“错误”
    2. 除“com.taxware.mgmt.CustomerManager”之外的任何类别的所有日志都发送给“FILE1”附加程序。 3.你说:“通过上面的 xml,我只在 FILE1 中获得信息消息”。您尝试使用“警告”或更小级别(例如“错误”)和“com.taxware.mgmt.CustomerManager”类别的日志记录,您将在“FILE”附加程序中看到结果,并尝试使用另一个类别进行日志记录,您将看到导致“FILE1”附加程序,除了这个结果是错误的。请这样做并说出结果。

    我也建议你使用 SLF4J 来解耦 API 和实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      相关资源
      最近更新 更多