使用Log4j在不同的日志中记录不同的级别消息

时间:2012-02-07 08:24:50

标签: java log4j

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

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中的信息消息,我想要所有级别的消息以及警告级别的消息,这些消息都在这个文件的单独文件中。有没有可用的解决方案。

4 个答案:

答案 0 :(得分:2)

# 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

答案 1 :(得分:0)

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

<?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>

答案 2 :(得分:0)

答案 3 :(得分:0)

我在log4j级别中说这个行为:

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

使用您的配置时,请执行以下操作:

  1. 所有带有“com.taxware.mgmt.CustomerManager”类别和“警告”以及较小级别(“错误”&lt;致命)的日志发送给“FILE”appender并且不发送“FILE”appender因为你设置了additive属性为false。
  2. 除“com.taxware.mgmt.CustomerManager”之外的所有类别的所有日志都会发送给“FILE1”appender。 3.你说:“通过上面的xml,我只收到FILE1中的信息消息”。您尝试使用“警告”或更小级别(例如“错误”)和“com.taxware.mgmt.CustomerManager”类别记录日志时,您将看到“FILE”appender中的结果并尝试使用其他类别进行日志记录,您将看到导致“FILE1”appender,除了这个结果是错误的。请这样做并说出结果。
  3. 我还建议您使用SLF4J来解耦API和实现。