一、关于Log4J
2015年,Apache宣布Log4J 1.x停止更新。最新版本为2.11
官网地址:http://logging.apache.org/log4j/2.x/
二、Log4J可以做什么
- 将信息送到控制台,文件,GUI组件等。
- 控制每条信息的输出格式。
- 将信息分类,定义信息级别,细致地控制日志的输出。
三、Log4J的安装
以maven为例子
<!--日志 begin-->
<dependency> <!-- 桥接:告诉Slf4j使用Log4j2 -->
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency> <!-- 桥接:告诉commons logging使用Log4j2 -->
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--日志 end-->
四、配置文件介绍
日志级别
trace:追踪,就是程序推进一下,可以写个trace输出debug:调试,一般作为最低级别,trace基本不用。
info:输出重要的信息,使用较多
warn:警告,有些信息不是错误信息,但也要给程序员一些提示。
error:错误信息。用的也很多。
fatal:致命错误。级别较高,这种级别不用调试了,重写吧……
机制:如果一条日志信息的级别大于等于配置文件的级别,就记录。
- 输出源
CONSOLE(输出到控制台)、FILE(输出到文件)等。 布局方式
SimpleLayout:以简单的形式显示
HTMLLayout:以HTML表格显示
PatternLayout:自定义形式显示
在Log4J2中基本采用PatternLayout自定义日志布局。
自定义格式:
%t:线程名称
%p:日志级别
%c:日志消息所在类名
%m:消息内容
%M:输出执行方法
%d:发生时间,%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%L:代码中的行数
%n:换行
c{precision}
logger{precision}
class{precision}àOutputs the name of the logger thatpublished the logging event.
Conversion Pattern | Logger Name | Result |
---|---|---|
%c{1} | org.apache.commons.Foo | Foo |
%c{2} | org.apache.commons.Foo | commons.Foo |
%c{10} | org.apache.commons.Foo | rg.apache.commons.Foo |
%c{-1} | org.apache.commons.Foo | apache.commons.Foo |
%c{-2} | org.apache.commons.Foo | commons.Foo |
%c{-10} | org.apache.commons.Foo | org.apache.commons.Foo |
%c{1.} | org.apache.commons.Foo | org.apache.commons.Foo |
c{1.1.~.~} | org.apache.commons.test.Foo | org.apache.commons.test.Foo |
%c{.} | org.apache.commons.test.Foo | org.apache.commons.test.Foo |
五、配置使用
配置文件命名与存储位置(Log4J没有默认的配置文件)
系统选择configuration文件的优先级如下(放在src文件夹):
classpath下名为 log4j-test.json 或者log4j-test.jsn文件
classpath下名为 log4j2-test.xml
classpath下名为 log4j.json 或者log4j.jsn文件
classpath下名为 log4j2.xml
配置文件详细内容
web.xml
<!--log4j2-begin 注意! 由于使用3.1版本web.xml log4j2 会自动注册 如果使用2.5版本xml 需要手动注册 以下代码--> <listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener> <filter> <filter-name>log4jServletFilter</filter-name> <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class> </filter> <filter-mapping> <filter-name>log4jServletFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> <!--log4j2-end -->
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="off" monitorInterval="1800"> <properties> <property name="LOG_HOME">${web:rootDir}/log</property> <property name="FILE_NAME">Mylog</property> </properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <RollingRandomAccessFile name="running-log" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="10 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingRandomAccessFile> </Appenders> <Loggers> <!--<Logger name="com.test.app" level="trace" additivity="true">--> <!--<AppenderRef ref="running-log"/>--> <!--</Logger>--> <Logger name="com.test.app.dao" level="DEBUG" additivity="true"> <AppenderRef ref="Console"/> </Logger> <Root level="INFO"> <AppenderRef ref="running-log"/> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>