下载地址:http://logging.apache.org/log4j/2.x/download.html
下载apache-log4j-××-bin.zip文件,解压后可以看到有*.jar、*source.jar以及*doc.jar我们用只取*.jar,因为另外两种是压缩的源代码文件和api文档文件。
2.创建基本测试项目
2.1 创建java web项目
导入我们需要的jar包,这里初步我们只需要log4j-api-2.3.jar和log4j-core-2.3.jar两个jar包,目录结构如下图:
2.2 编写测试类
【TestLog4j2.java】
package com.mlq.love;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.mlq.love.entity.Log4j2Entity;
public class TestLog4j2 {
private static final Loggerlogger = LogManager.getLogger(TestLog4j2.class);
public static void main(String[] args){
logger.trace("Appliaction is entering the Log4j2Entity...");
if(!Log4j2Entity.printTestString()){
logger.error("Didn`t do it");
}
logger.trace("Appliaction is exiting the Log4j2Entity...");
}
}
【Log4j2Entity】
package com.mlq.love.entity;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j2Entity {
private static final Loggerlogger = LogManager.getLogger(Log4j2Entity.class);
public static boolean printTestString(){
logger.entry();
System.out.println("我正在测试使用Log4j2");
logger.error("Did it again");
returnlogger.exit(false);
}
}
2.3 执行测试程序
Run as->javaapplication结果如下:
这是因为我们没有指定log4j2的配置文件,系统会用Log4j2自己自带的默认配置,这里就引入了我们学习的新问题,如何配置Log4j2让其按照我们的意愿输出log信息到控制台、文件等
3.Log4j2配置
详细的官方文档可以参见http://logging.apache.org/log4j/2.x/manual/configuration.html但是鉴于某些一看英文就头大的同学,这里作下简单介绍。
概述:Log4j2的配置包含四种方式,其中三种是在程序中直接调用Log4j2的方法进行配置的,还有一种是我们最常用的用文件进行配置,可以是XML、JSON、YAML,这里我们用XML为例来详细介绍。
3.1基本配置
Log4j2会首先根据既定的规则去项目中寻找配置信息,XML文件命名为Log4j2.xml放在classpath中就可以被找到,通常Java web项目放在src根目录就可以被找到。默认的配置如下例所示:
【Log4j2.xml】
<?xmlversion="1.0"encoding="UTF-8"?>
<Configurationstatus="WARN">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -%msg%n"/>
</Console>
</Appenders>
<Loggers>
<Rootlevel="error">
<AppenderRefref="Console"/>
</Root>
</Loggers>
</Configuration>
当我们把这个文件放到src下,把<Rootlevel="error">改为<Rootlevel="trace">再执行,得如下结果
3.2日志级别
【简介】
上面最后看到所有的日志都打印了出来,这里面就涉及到了日志级别(level)的问题,Log4j2把日志打印分为6个级别,级别由低到高分别为trace < debug <info < warn < error < fatal,简单介绍下:
-
trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。
-
debug:调试么,我一般就只用这个作为最低级别,trace压根不用。是在没办法就用eclipse或者idea的debug功能就好了么。
-
info:输出一下你感兴趣的或者重要的信息,这个用的最多了。
-
warn:有些信息不是错误信息,但是也要给程序员的一些提示,类似于eclipse中代码的验证不是有error和warn(不算错误但是也请注意,比如以下depressed的方法)。
-
error:错误信息。用的也比较多。
-
fatal:级别比较高了。重大错误,这种级别你可以直接停止程序了,是不应该出现的错误么!不用那么紧张,其实就是一个程度的问题。
【规则】
<Rootlevel="X">设定级别X,那么大于等于该级别的日志都会输出,例如X=”info”那么info、warn、error、fatal日志会输出,trace和debug则不会输出
3.3隔离输出
当我们想让某个包中的文件使用一个级别,其他的包使用另一个级别时就可以修改配置文件在<Loggers></Loggers>节点中添加<Logger>节点,例如我想让com.mlq.love.entity包中的日志级别为trace,而com.mlq.love包为error,那么就可以如下这样写:
<Loggers>
<Logger name="com.mlq.love.entity"level="TRACE">
<AppenderRefref="Console"/>
</Logger>
<Rootlevel="error">
<AppenderRefref="Console"/>
</Root>
</Loggers>
再执行,得到如下结果:
我们发现com.mlq.love.entity中的日志都会输出两次,从代码结构角度来讲是,com.mlq.love.entity的Logger与Appender是关联关系,项目代码包结构统一由LoggerConfig来维护的,子包的<Logger>配置会被装饰到父包。但是大多数情况我们不想要这样,就需要在<Logger>设置属性additivity="false"如下:
<Logger name="com.mlq.love.entity"level="TRACE"additivity="false">
<AppenderRefref="Console"/>
</Logger>
再执行,得到如下结果:
3.4自动重新加载配置
通常情况系统上线后重启系统代价是很大的,所以Log4j2支持动态调整配置,自动识别加载,我们只需要作如下设置(30秒检查一次更新):
<Configurationstatus="off"monitorInterval="30">
3.5输出日志到文件中
-
<Appenders></Appenders>定义了日志的输出方式
-
<Loggers></Loggers>定义了对应范围的日志输出级别,并且通过引用<Appenders></Appenders>中的定义来确认输出方式
下面通过一个例子来学习下输出日志到文件的方式
【Log4j2.xml】
<?xmlversion="1.0"encoding="UTF-8"?>
<Configurationstatus="WARN">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -%msg%n"/>
</Console>
<Filename="Trace"fileName="WebRoot/WEB-INF/logs/debug.log"append="true">
<PatternLayout>
<Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
</PatternLayout>
</File>
<Filename="error"fileName="WebRoot/WEB-INF/logs/erorr.log"append="true">
<PatternLayout>
<Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="com.mlq.love.entity"level="TRACE"additivity="false">
<AppenderRefref="Trace"/>
</Logger>
<Rootlevel="error">
<AppenderRefref="error"/>
</Root>
</Loggers>
</Configuration>
其中第一个Logger是将com.mlq.love.entity包中的内容级别设置为TRACE,并按照Appenders中定义的<Filename="Trace"/>方式来输出,这里面的name可以随便定义,上下对应就可以,路径也可以根据需求来更改。在配置文件中可以使用${web:rootDir}来获取项目根目录
3.6配置日志输出格式<Pattern>
详细的官方文档可以参见
http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout但是鉴于某些一看英文就头大的同学,这里作下简单介绍。
-
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-ddHH:mm:ss},输出类似:2006-01-1817:50:22',刚好适合插入SQLServer
-
%t产生该日志事件的线程名
-
%p日志的log_level,如DEBUG、WARN或者INFO
-
%c输出所属的类目,通常就是所在类的全名,如“com.mlq.love”
-
%m日志的内容
-
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。如Wite2Database.main(Wite2Database.java:18)
-
%n 输出一个回车换行符
Log4j2甚至可以通过Socket远程记录日志以及直接将日志记录入数据库,这些官网都有介绍,有兴趣可以去挖一下哦~