作者:whisper
链接:http://proprogrammar.com:443/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>
最后的日志结构
大致就是这么多内容了,有兴趣的可以自己试一下。
亲爱的读者:有时间可以点赞评论一下
全部评论