通知 网站从因情语写改为晴雨,这个网站的模板也从calmlog_ex改为 whimurmur

log4j2搭建记录

2417人浏览 / 0人评论 / | 作者:因情语写  | 分类: log4j  | 标签: 框架

作者:因情语写

链接:https://www.qingyu.blue/article/369

声明:请尊重原作者的劳动,如需转载请注明出处


  今天新建了一个项目,自己弄的小玩意,想要做的正式点,就想引入日志。就想到了log4j2,经过几个小时的努力,还真的可以用了,下面就记录一下我是怎么做的。

  下面是总的结构:

  下面是MAVEN依赖:

<!-- log配置:Log4j2 + Slf4j -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency> <!-- 桥接:告诉Slf4j使用Log4j2 -->
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency> <!-- 桥接:告诉commons logging使用Log4j2 -->
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jcl</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.10</version>
        </dependency>

    下面是测试代码:

  下面是输出结果

  下面就来说一下是怎么做的。

  我用的是LOG4J2和SLF4J来做的日志系统,关于log4j2和slf4j及更早的log4j,有兴趣的可以自己找资料看一下。

  下面是我参考的log4j2和slf4j的例子:

  http://blog.csdn.net/clementad/article/details/44625787

   下面是我参考的配置的说明:

  https://www.cnblogs.com/hafiz/p/6170702.html

  https://www.cnblogs.com/garfieldcgf/p/5817923.html

  下面是我参考的输出到指定文件的说明:

  https://www.cnblogs.com/jessezeng/p/5144317.html

  下面是拓展,不使用配置文件,动态生成logger对象

  http://www.importnew.com/21079.html

  引入了JAR包或依赖后,配置好以后,就可以使用了。下面就说一下我是怎么配置的:

  我的配置文件是这样的:

<?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">
  <!--定义的属性-->
    <Properties>
        <Property name="log.basedir">logs</Property>
        <Property name="log.tempdir">temp</Property>
        <Property name="log.errordir">error</Property>
        <Property name="log.warndir">warn</Property>
        <Property name="log.infodir">info</Property>
        <Property name="log.debugdir">deubg</Property>
        <Property name="log.layout">[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n</Property>
        <Property name="log.templayout">%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n</Property>
    </Properties>
    <!--先定义所有的appender-->
    <appenders>
    <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
        <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        <!--输出日志的格式-->
            <PatternLayout pattern="${log.layout}"/>
        </console>
    <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="TempLog" fileName="${log.basedir}/${log.tempdir}/temp.log" append="false">
           <PatternLayout pattern="${log.templayout}"/>
        </File>
    <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="${log.basedir}/${log.infodir}/info.log"
                     filePattern="${log.basedir}/${log.infodir}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--这个的作用是只输出info级别的日志到指定文件-->        
            <Filters>  
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>  
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>  
            </Filters> 
            <PatternLayout pattern="${log.layout}"/>
            <Policies>
          <!--策略:时间策略-->
                <TimeBasedTriggeringPolicy/>
          <!--策略:文件大小策略,超过指定大小后创建新文件-->
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
          <!--最多创建的文件数量-->
                <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <RollingFile name="RollingFileWarn" fileName="${log.basedir}/${log.warndir}/warn.log"
                     filePattern="${log.basedir}/${log.warndir}/$${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="${log.layout}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
        <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <RollingFile name="RollingFileError" fileName="${log.basedir}/${log.errordir}/error.log"
                     filePattern="${log.basedir}/${log.errordir}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${log.layout}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
                <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <RollingFile name="RollingFileDebug" fileName="${log.basedir}/${log.debugdir}/debug.log"
                     filePattern="${log.basedir}/${log.debugdir}/$${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="${log.layout}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
                <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息, 这里没有用到-->
        <!-- <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger> -->
        <root level="all">
            <appender-ref ref="RollingFileDebug"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
            <appender-ref ref="Console"/>
            <appender-ref ref="TempLog"/>
        </root>
        
    <!--下面的两个日志不会同时记录到root日志中-->
        <Logger name="console" level="error" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        
        <Logger name="tempLog" level="all" additivity="false">
            <AppenderRef ref="TempLog"/>
        </Logger>
        
    </loggers>
    
    <!-- 
        格式化符号说明:

        %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
        %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
        %r:输出自应用程序启动到输出该log信息耗费的毫秒数。
        %t:输出产生该日志事件的线程名。
        %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
        %c:输出日志信息所属的类目,通常就是所在类的全名。
        %M:输出产生日志信息的方法名。
        %F:输出日志消息产生时所在的文件名称。
        %L::输出代码中的行号。
        %m::输出代码中指定的具体日志信息。
        %n:输出一个回车换行符,Windows平台为"rn",Unix平台为"n"。
        %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
        %%:输出一个"%"字符。
        另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
        1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
        2)%-20c:"-"号表示左对齐。
        3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。
     -->
</configuration>

  最后的日志结构

 

  大致就是这么多内容了,有兴趣的可以自己试一下。


自己写的文章声明标题示例:


点赞(0) 打赏

全部评论

还没有评论!