1. Log4j 1
引入Log4j:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
重点讲解Log4j的配置文件log4j.properties
(classpath下):
log4j.rootLogger=info, A, B, C
# 使用的输出器
log4j.appender.A=org.apache.log4j.ConsoleAppender
# 输出目标
log4j.appender.A.Target=System.out
# 输出格式
log4j.appender.A.layout=org.apache.log4j.PatternLayout
# 自定义格式
log4j.appender.A.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss, SSS} [%t] [%p]:%L - %m%n
log4j.appender.B=org.apache.log4j.DailyRollingFileAppender
# 输出文件路径,当前项目下的log/info.log文件
log4j.appender.B.File=log/info.log
# 文件编辑模式,true为追加模式,false为复写模式
log4j.appender.B.Append=true
# 保存INFO级别,ERROR等更高级别不保存
log4j.appender.B.Threshold=INFO
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss, SSS} [%t] [%p]:%L - %m%n
log4j.appender.C=org.apache.log4j.DailyRollingFileAppender
log4j.appender.C.File=log/error.log
log4j.appender.C.Append=true
log4j.appender.C.Threshold=ERROR
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss, SSS} [%t] [%p]:%L - %m%n
Logger4j的使用:
org.apache.log4j.Logger logger = Logger.getLogger(xxx.class);
2. Log4j 2
Log4j2主要由Appender和Logger组成,一个Logger可以包含多个Appender,即一种日志可以同时输出到多个地方。
Logger一般使用类名作为名称。
2.1 helloworld
导入log4j 2依赖:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
</dependency>
</dependencies>
获取Logger实例:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class HelloWorld {
private static final Logger logger = LogManager.getLogger(HelloWorld.class);
public static void main(String[] args) {
logger.info("Hello, World!");
}
}
log4j2提供了无参获取方式,即LogManager.getLogger()
会生成以当前类为名称的logger。
输出参数可以使用{}
形式:logger.debug("logger with username = {}", user.getName())
;
参数格式化第一种可以使用formatterLogger
:
public static Logger logger = LogManager.getFormatterLogger("Foo");
logger.debug("Logging in user %s with birthday %s", user.getName(), user.getBirthdayCalendar());
第二种可以使用普通logger的printf()
:
public static Logger logger = LogManager.getLogger("Foo");
logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());
默认加载classpath:log4j2.xml
配置文件,若无则使用默认配置,以下为与默认配置一样效果的log4j2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<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">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
2.2 结合slf
引入
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.2</version>
</dependency>
即可使用slf的api,底层用的是l4j2。
再加上一个lombok库,IDEA同时启用lombok插件,即可使用@slf
,无需手动创建logger。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
2.3 Configuration
Configuration
标签可以设置的主要属性:
status
:设置log4j2本身的运行日志级别。monitorInterval
:自动重新加载配置文件的间隔(秒)。name
:配置组名称。
日志级别高低:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
Configuration
标签的主要子标签:
properties
:定义属性Appenders
Loggers
属性的定义及使用:
<configuration>
<properties>
<property name="LOG_HOME">D:/logs</property>
<property name="FILE_NAME">mylog</property>
</properties>
<Appenders>
<File name="File" fileName="${LOG_HOME}/${FILE_NAME}.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
</configuration>
2.4 Appenders
Appenders
标签用来配置日志输出对象,例如控制台、文件等。
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="File" fileName="log/info.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
File
标签用来定义文件类型的输出对象,常用属性如下:
name
:Appender名称,用来给Logger进行引用fileName
:输出的文件路径,可以是相对于项目根目录的路径,例如logs/info.log
,或者绝对路径D:/logs/app.log
append
:文件写入模式,true为续写模式,false为复写模式
RollingRandomAccessFile
Appender,rolling表示满足某个条件即重命名原日志文件,重新生成新的日志文件,例如按天生成日志文件,或超过指定大小重新生成日志文件。
<Appenders>
<RollingRandomAccessFile name="MyFile"
fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
</Appenders>
主要属性或标签说明如下:
fileName
:当前日志文件名称。filePattern
:触发rolling时,将原有日志重命名的格式。%i
表示同一时间段中,超出临界值文件大小而重命名的日志文件序号。SizeBasedTriggeringPolicy
:日志文件大小临界值。TimeBasedTriggeringPolicy
:日志文件时间点临界值,以filePattern
中最小的时间粒度为单位,例如HH-mm
,则interval="1"
表示1分钟。DefaultRolloverStrategy
:最多保存的日志文件个数。
PatternLayout
标签用来配置日志格式,常见的格式符号:
%d{yyyy-MM-dd HH:mm:ss.SSS}
:输出时间,格式为年-月-日 时:分:秒.毫秒%t
:输出当前线程名称%-5level
:输出当前日志级别,-5表示左对齐并且固定输出5个字符,不足在右边补0%logger
:输出logger名称%msg
:日志内容%n
:换行符%L
:输出行号,可能影响性能,慎用。
2.6 Loggers
Loggers
标签用来配置所有Logger的属性,对于Java代码中使用的Logger,会根据其名称在这里查找对应的Logger属性配置并应用,如果没找到,则会使用ROOT Logger的配置。
自定义Logger属性:
<Loggers>
<Logger name="mylog" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
name
:即LogManager.getLogger()
传入的字符串或类对象的名称。level
:当前日志的输出级别,小于该级别的则不会输出。additivity
:当前日志经由Logger输出后,是否继续交由ROOT Logger配置输出。默认情况下,所有日志输出后都会再交由ROOT Logger输出。
2.7 自定义配置文件位置
web项目配置web.xml
:
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/conf/log4j2.xml</param-value>
</context-param>
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
2.8 Web应用结合Log4j 2
为了让Log4j 2可以自动根据Web应用的生命周期进行资源释放等操作,需要导入以下依赖:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.11.2</version>
</dependency>
</dependencies>
参考:详解log4j2(上) - 从基础到实战
参考:Using Log4j 2 in Web Applications