通过配置log4j.xml来打印指定类或指定级别的日志信息
把指定类的日志信息输出到指定appender里:
============================================================
<!--appender中,Theshold和Filter都是可选。不过,建议这种目的下最好不要写,这样,什么信息会输出到该appender中,就只由指定logger的appender-ref的值来决定。否则会受到Theshold和Filter值的影响)。-->
<appender name="appender-3" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${loggingRoot}/file.log"/>
<param name="append" value="true"/>
<param name="encoding" value="GBK"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p [%d{HH:mm:ss}] %c{1}.%M(%L) - %m%n"/>
</layout>
</appender>
<logger name="com.a.b.c.d.e" additivity="false">
<!--指定类的日志级别,会影响指定类日志发出信息的成功与否-->
<level value = "debug" />
<appender-ref ref="appender-3" />
</logger>
同样,在root元素里不要指定该appender,如下:
<root>
<level value="warn"/>
<appender-ref ref="appender-1"/>
<appender-ref ref="appender-2"/>
</root>
这样的话,就杜绝了被其他logger继承的可能性。
此例中,如果在root里指定了该appender,则级别不低于warn的日志信息都会输出到appender-3中。
把各个级别的日志信息输出到各个的appender里,可使用过滤器,下面以info级别为例:
============================================================
<appender name="appender-info" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${loggingRoot}/info.log"/>
<param name="append" value="true"/>
<param name="encoding" value="GBK"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p [%d{HH:mm:ss}] %c{1}.%M(%L) - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>
appender-info只接受信息级别为info的日志信息。
再说说关于root的一些情况:
============================================================
root元素定义的一些信息只供作默认情况和继承用。
只要后面的logger或appender,稍作显式声明,这些信息都会被覆盖。
以下面为例:
<root>
<level value="warn"/>
<appender-ref ref="appender-1"/>
<appender-ref ref="appender-2"/>
</root>
默认情况是:
1. 输出器appender-1和appender-2只接受不低于warn级别的日志信息,不过一旦指定了Theshold或Filter,就以指定的为准。
2. 日志记录器logger的输出器appender,默认会输出到appender-1和appender-2中,若指定了<appender-ref value="appender-3" />,则日志信息会输出到这三个,要停止这种继承关系,可添加additivity=false。
log4j简明手册中的要点。
.1 Named Hierarchy
如果一个logger 的名字后面跟着一个点号(dot),它就是点号(dot)后面的那个logger的前辈( ancestor),是这个晚辈(descendant) 的前缀。如果在它自己和这个晚辈之间没有其它的前辈,它和这个晚辈之间就是父子关系。
.2 Level Inheritance
对于一个给定的logger C,它继承的级别等于logger阶层里,从C开始往root logger上去的第一个non-null级别。
.3 Basic Selection Rule
在一个级别为q(被指定的或继承的)的logger里,一个级别为p的日志请求,只有在p >= q 时才能够被执行。
.4 Appender Additivity
Logger C的log输出信息将被输出到C的所有appenders和它的前辈的 appenders。这就是"appender additivity"的意思。
但是,如果logger C的前辈,比如说P,P的additivity flag被设置为 false,那么,C的输出信息将被输出到C的所有appenders中去,以及它的前辈的——截 止在P那里,包括P在内的,appenders中去,但是不会输出到P的前辈的 appenders中去。
默认情况下,Loggers的additivity flag设置为true。
log4j简明手册:http://log4j.jaxmao.org/log4j/docs/manual.html
初次实施log4j,做了些小总结,期待交流哈。
例如本地项目执行:
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="/app/paas/logs/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="/app/edm/logs/info.log"
filePattern="/app/paas/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileDebug" fileName="/app/edm/logs/debug.log"
filePattern="/app/paas/logs/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="/app/edm/logs/warn.log"
filePattern="/app/paas/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="/app/edm/logs/error.log"
filePattern="/app/paas/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
</RollingFile>
<RollingFile name="appender-3" fileName="/var/www/html/test.log"
filePattern="/var/www/html/$${date:yyyy-MM}/test-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.springframework" level="warn"></logger>
<logger name="org.mybatis" level="info"></logger>
<logger name="org.apache" level="info"></logger>
<logger name="com.netflix" level="info"></logger>
<logger name="com.paas.controller.MessageController" level="info">
<appender-ref ref="appender-3"/>
</logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileDebug"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="log"/>
</root>
</loggers>
</configuration>

浙公网安备 33010602011771号