log4j2的基本使用
-使用maven导入依赖:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.1</version>
</dependency>
</dependencies>
-配置log4j2
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appenders>
<!--控制台输出-->
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!--单个文件输出,临时使用,这个log每次运行程序会自动清空-->
<File name="Temp_log" fileName="${sys:catalina.home}/logs/ancient_books_log/temp.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile" fileName="${sys:catalina.home}/logs/ancient_books_log/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"/>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</appenders>
<!--配置在什么情况下使用log1以什么样子的形式输出-->
<loggers>
<root level="info">
</root>
<!--开发调试-->
<Logger name="develop" level="debug">
<AppenderRef ref="Console"/>
</Logger>
<!--线上测试-->
<Logger name="onlionTest" level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="Temp_log"/>
</Logger>
<!--线上运行-->
<Logger name="run" level="error">
<AppenderRef ref="RollingFile"/>
</Logger>
</loggers>
</configuration>
一些细节:
需要配置root节点,不然会默认root节点为使用控制台输出,logger节点都会先调用root节点的输出方式,再调用自己的输出方式,这样有时候会造成在控制台2次输出同样的内容影响心情
log文件路径的配置一般使用${sys:catalina.home}来获得tomcat路径,使用这个路径可以做到部署无需修改路径,但是,catcatalina.home这个环境变量只能在web项目中才有
-使用log4j2
使用时,由于项目存在几个环境,开发环境,线上测试环境,于是就使用了配置文件来存储现在项目所处的环境,项目运行第一次使用log的时候会读取配置文件,并将将环境设置存储到System.propertes中,之后就直接读取System.properties,减少io
package util;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.*;
import java.util.Properties;
/**
* Created by zhangyanqi on 16/3/17.
*
* 创建log对象的工厂
*
*/
public class LoggerFactory {
//获得开发时的logger对象
private Logger getDevlopLoger() {
return LogManager.getLogger("develop");
}
//获得上线测试时的logger对象
private Logger getOnlionTestLoger() {
return LogManager.getLogger("onlionTest");
}
//获得线上运行的logger对象
private Logger getRunTimeLogger() {
return LogManager.getLogger("run");
}
public Logger getLogger() {
//判断一下现在系统的环境
String m= System.getProperty("model");
//没有model设置
if(m==null && "".equals(m)) {
Properties properties = new Properties();
FileInputStream fileInputStream = null;
try {
String path = Thread.currentThread().getContextClassLoader().getResource("/").getPath();
fileInputStream = new FileInputStream(new File(path + "runModel.properties"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
properties.load(fileInputStream);
} catch (IOException e) {
e.printStackTrace();
}
System.setProperty("model",properties.getProperty("model"));
}
String model = System.getProperty("model");
if ("run".equals(model)) {
return getRunTimeLogger();
}
if ("onlionTest".equals(model)) {
return getOnlionTestLoger();
} else {
//默认develop模式
return getDevlopLoger();
}
}
}