Log4j2
log4j2的好处看了以下主要体现在这么几点,提升底层运行效率,异步输出之类的,配置文件支持json等相关优化,对API进行了优化,但是API对外表现的好像看不太出来。
日志级别
log4j2的日志级别有很多,但是一般使用error,info,debug最多在加上一个warn(一般也没有使用到,另外trace
是最低级别)。
- error:记录错误级别的日志信息,有异常发生之类的。
- warn:记录警告级别的信息。
- info:记录常用的日志信息,一般记录一些开始,结束和相关的关键字段。
- debug:记录debug级别的调试信息。
依赖
log4j2需要导入两个jar包,分别为
log4j-core-xx.jar
log4j-api-xx.jar
如果使用maven导入相关jar,可以参考下面的pom文件。
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.qingtianr</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--<dependency>-->
<!--<groupId>log4j</groupId>-->
<!--<artifactId>log4j</artifactId>-->
<!--<version>1.2.14</version>-->
<!--</dependency>-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
</dependencies>
</project>
Example
log4j2Test.java
package cn.qingtianr;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j2Test {
//使用LogManager来获得Logger(和log4j不一样了)
private static Logger logger = LogManager.getLogger(log4j2Test.class);
public static void main(String[] args) {
logger.error("我是error信息");
logger.warn("我是warn信息");
logger.info("我是info信息");
logger.debug("我是debug信息");
}
}
配置文件
在classpath目录下面需要有一个配置文件。
在默认情况下,系统选择configuration文件的优先级如下:(classpath为scr文件夹)
- classpath下名为 log4j-test.json 或者log4j-test.jsn文件
- classpath下名为 log4j2-test.xml
- classpath下名为 log4j.json 或者log4j.jsn文件
- classpath下名为 log4j2.xml
如果是用maven管理的话,那么可以直接放在resouces里面就可以了。其实可以发现log4j2
是不在支持properties
,但是都是支持xml
来配置的。
下面这个可以认为是没有配置文件时的时候的默认配置。
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
所以在默认的配置下面可以在控制台中看到以下输出信息。因为默认是error
级别的信息,所以只会有error
级别的信息。
14:35:54.002 [main] ERROR cn.qingtianr.log4j2Test - 我是error信息
如果把<root level="error">
中的error
改为info
,那么将会输出以下日志信息。也就是说会输出所有info
级别及以上级别的日志信息。
14:38:01.086 [main] ERROR cn.qingtianr.log4j2Test - 我是error信息
14:38:01.088 [main] WARN cn.qingtianr.log4j2Test - 我是warn信息
14:38:01.088 [main] INFO cn.qingtianr.log4j2Test - 我是info信息
Appenders
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!--这个都知道是输出日志的格式-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="log/test.log" append="true">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--建立一个默认的root的logger-->
<root level="info">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
把这个配置文件和之前简单的配置文件进行比较可以知道appender
的使用方式,主要的appender
有下面几种。
- ConsoleAppender:用来输出到控制台
- FileAppender:用来输出到文件中
- RollingFileAppender:用来将到一定大小的文件按时间进行存档
Layout
可以将传入的日志信息已一定格式进行输出,有HTML
格式的,CVS
格式的等,最主要使用的应该就是PatternLayout
,有点类似于格式化输出的情况。
例子项目截图
其中有自己log4j
的东西,省略.....
Other
具体的配置文件中的东西,可以参考官方文档。
一些其他问题
- Log4j(或者Log4j2)和Spring是如何关联起来的,可以弄个详细的东西来简单描述一下。Spring的core包使用的日志工具会自动找寻classpath下面的jar包,如果发现有Log4j或者Log4j2的jar包,会直接导入进去的。
- 但是如果没有使用Spring的话,是需要手动在web.xml中使用一个监听器来将Log4j(或者Log4j2)的配置文件给读入进去的。
- 利用Log4j是可以将Mybatis里面最终执行的数据库的sql语句给纪录下来的,所以下次可以做一个简单的demo出来。