Log4j2简单配置

log4j官网:http://logging.apache.org/log4j/2.x/manual/appenders.html

熟读官网内容的请忽视本文,记录英文小白的摸索过程

-------起因

新接手的项目原来是log4j的,线上日志登上去不是很好,分类的不够好,而且相对于xml的格式,properties的配置一直觉得不够直观

这次就想直接替换成log4j2了,而且简单了解了一下log4j2的性能相比较log4j和logback更加好


--------

用过logback的小伙伴们,对应log4j2的配置一定不会感到特别陌生,只是部分标签和格式不一样,大体的结构是一样的


<?xml version="1.0" encoding="GBK" ?>
<Configuration>
    <!-- 输出日志到控制台  ConsoleAppender -->
    <Properties>
        <!--申明全局别名,下面可以直接使用-->
        <Property name="APP_Name">myproject</Property>
        <Property name="log.dir">/data/logs/apps/myproject</Property>
    </Properties>

    <!-- 输出日志到文件  每天一个文件 -->
    <Appenders>
        <!-- fileName:申明当前输出文件的目录和文件名 -->
        <!-- filePattern:申明当使用归档策略的时候,生成的文件应该放到哪些目录下且名字格式如何 -->
        <RollingFile name="FILE_INFO" fileName="${log.dir}/info-${APP_Name}.log"
         filePattern="${log.dir}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log">
            <!-- 当使用组合过滤器的时候,onMatch/onMismatch=NEUTRAL的时候 日志消息会继续往后面流转-->
            <Filters>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <!--归档策略,当满足归档条件,则自动归档。TimeBasedTriggeringPolicy基于时间条件归档,SizeBasedTriggeringPolicy基于文件大小归档-->
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="FILE_DEBUG" fileName="${log.dir}/debug-${APP_Name}.log"
                                 filePattern="${log.dir}/%d{yyyy-MM-dd}/debug-%d{yyyy-MM-dd}-%i.log">
            <!-- 当使用组合过滤器的时候,onMatch/onMismatch=NEUTRAL的时候 日志消息会继续往后面流转-->
            <Filters>
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="FILE_ERROR" fileName="${log.dir}/error-${APP_Name}.log"
                                 filePattern="${log.dir}/%d{yyyy-MM-dd}/error-%d{yyyy-MM-dd}-%i.log">
            <!-- 当使用组合过滤器的时候,onMatch/onMismatch=NEUTRAL的时候 日志消息会继续往后面流转-->
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="FILE_WARN" fileName="${log.dir}/warn-${APP_Name}.log"
                                 filePattern="${log.dir}/%d{yyyy-MM-dd}/warn-%d{yyyy-MM-dd}-%i.log">
            <!-- 当使用组合过滤器的时候,onMatch/onMismatch=NEUTRAL的时候 日志消息会继续往后面流转-->
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="MONITOR" fileName="${log.dir}/monitor-${APP_Name}.log"
                     filePattern="${log.dir}/%d{yyyy-MM-dd}/monitor-%d{yyyy-MM-dd}-%i.log">
            <!-- 当使用组合过滤器的时候,onMatch/onMismatch=NEUTRAL的时候 日志消息会继续往后面流转-->
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="false"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
    </Appenders>

    <!--
        控制某包下面的日志输出级别,只有大于等于这个级别才会输出
     -->
    <Loggers>
        <Logger name="com.ibatis" level="DEBUG"/>
        <Logger name="java.sql" level="DEBUG"/>
        <Logger name="org.springframework" level="WARN"/>
        <Logger name="org.apache.velocity" level="WARN"/>
        <Logger name="org.apache.http" level="WARN"/>
        <Logger name="net.sf" level="WARN"/>
        <Logger name="org.displaytag" level="ERROR"/>
        <Logger name="org.apache.commons" level="WARN"/>
        <Logger name="org.apache.struts" level="WARN"/>
        <Logger name="RocketmqClient" level="ERROR"/>
        <Logger name="httpclient.wire" level="ERROR"/>
        <!--申明一个特殊的日志,输出到某个文件里面去-->
        <Logger name="monitor" level="DEBUG" >
            <AppenderRef ref="MONITOR"/>
        </Logger>

        <Root level="DEBUG">
            <AppenderRef ref="FILE_INFO"/>
            <AppenderRef ref="FILE_WARN"/>
            <AppenderRef ref="FILE_ERROR"/>
            <AppenderRef ref="FILE_DEBUG"/>
        </Root>
    </Loggers>

</Configuration>

web.xml的配置

	<context-param>
		<param-name>log4jContextName</param-name>
		<param-value>myproject</param-value>
	</context-param>
	<context-param>
		<param-name>log4jConfiguration</param-name>
		<param-value>classpath:log4j2.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>



对于monitor log的申明是这样的

private static final Logger monitorLog = LoggerFactory.getLogger("monitor");

这样通过这个log记录的日志都会到monitor这个日志文件里面去了,还是很灵活的,这个功能logback也提供了。

--------Filters

这里着重说一下Filters 

我这里是用的ThresholdFilter,因为之前还用过logback的xml配置,那边的level指定了DEBUG就输出DEBUG,而LOG4J2不太一样

http://logging.apache.org/log4j/2.x/manual/filters.html#ThresholdFilter

Threshold Filter Parameters这个里面对于level定义其实不够准确,可能也因为前文已经说到了,这里也只是简单的定义了一下。

重点在前文说明上:

This filter returns the onMatch result if the level in the LogEvent is the same or more specific than the configured level and the onMismatch value otherwise

过滤器会筛选 如果日志级别大于等于配置的级别的,则返回onMatch的值,否则返回OnMismath的值

所以满足级别要求的,也可以不输出,把onMatch配置成DENY就行。


说一下onMatch和onMishmatch的三个值:

Accept     通过 :输出日志并阻止日志往下个过滤器流转

Deny        拒绝  :不输出日志并阻止日志往下个过滤器流转

Neutral     中立  :不输出日志,日志往下个过滤器流转, 直到最后一个过滤器



因为过滤器的级别定义的特性,如果要配置一个只输出INFO级别日志的文件,过滤器如下:

<Filters>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>


--------Policy

着重说一下 TimeBasedTriggeringPolicy

interval,指定归档日志时间间隔,具体单位以日志的文件名最后一个单位为标准,比如  yyyy-MM-dd,则以天为单位

modulate,boolean型,说明是否对封存时间进行调制。若modulate=true,则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00,。。。


--------Appender

今天配好之后,error、warn、info、debug级别的日志输出都没有问题,但是原来catalina.out文件输出的内容只有启动时候的,之后具体运行时候的都没有记录了。

还是吃了没文化的亏,之前没有自己从头到尾的配置过日志。

跟手上其他的项目比较之后,发现有一个ConsoleAppender没有配置导致的,这个是输出控制台日志的,配置了这个之后catalina.out就会包含所有的日志了,但是需要注意catalina.out文件过大的问题

<Console name="STDOUT" >
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n"/>
        </Console>



--------附加相关网址

配置按照分钟归档 http://blog.csdn.net/zhang168/article/details/46814489

猜你喜欢

转载自blog.csdn.net/u012210451/article/details/78180493