Log4j是一种经典的日志解决方案。内部把日志系统抽象封装成Logger 、Appender 、Pattern。然后通过配置文件轻松的实现日志系统的管理和多样化配置。通过使用Log4j,可以控制日志信息输送的目的地是控制台、文件、GUI组件等;用户同时可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码。
注:Log4j是Apache的一个开源项目,log4j2和log4j是一个作者,只不过log4j2是重新架构的一款日志组件,它抛弃了之前log4j的不足,以及吸取了优秀的logback的设计重新推出的一款新组件。
log4j是通过一个.properties的文件作为主配置文件的,而log4j2则采用的是.xml,.json或者.jsn等方式作为配置文件的
以下详细介绍Log4j2 的使用
Log4j2的配置文件:包括文本格式键值对组合的log4j2.properties或XML格式的log4j2.xml
Log4j2配置文件的生效,需要在应用程序启动时加载配置文件到JVM中。
log4j2加载配置文件的过程:
1.自动寻找项目下src目录中的log4j2.xml。
2.如果没有找到log4j2.xml,则自动会在项目下src目录中寻找log4j2.properties文件。
3.如果log4j2.properties文件放在其他目录中,比如src目录平级的config目录中,则需使用以下方法读取路径:
PropertyConfigurator.configure(“config/log4j2.properties”); 默认读取的是项目的根目录路径。
配置文件的加载方式有三种
1)自动加载方式:只要把配置文件放在classpath环境变量所指定的目录(例如Maven工程src/main/resources下),JAVA启动时会自动加载。
2)手动加载方式:自定义的Log4j2配置文件的目录如config,就需要手动加载
properties格式的Log4j2配置文件,需要使用PropertyConfigurator.config(filepath)加载。
XML格式的Log4j2配置文件,需要使用DOMConfigurator.config(filepath)加载。
3)默认加载方式:自动快速地使用缺省Log4j环境。BasicConfigurator.configure();
4)web项目,在web.xml中中初始化
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:config/log4j2.xml</param-value>
</context-param>
这里使用xml形式的配置
1、加入Log4j2 两个核心依赖包
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
而 log4j的依赖包只有一个
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、定义log4j.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
<!-- OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<!--这个都知道是输出日志的格式-->
<!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %L %M - %msg%xEx%n"/>-->
<PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%M]%m%n"/>
</Console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="log/test.log" append="false">
<!--<PatternLayout charset="UTF-8" pattern="%d{HH:mm:ss.SSS} %-5level %L %M - %msg%xEx%n"/>-->
<PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%M]%m%n"/>
</File>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile" fileName="log/all.log"
filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%M]%m%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--建立一个默认的root的logger-->
<root level="trace">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
<appender-ref ref="log"/>
</root>
</loggers>
</configuration>
3、创建测试类使用Log4j
package com.sc.test02;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Calendar;
public class LeapYearTest {
static Logger log = LogManager.getLogger(LeapYearTest.class);
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(2008,2,1);
calendar.add(Calendar.DAY_OF_MONTH,-1);
log.info(calendar.get(Calendar.DAY_OF_MONTH));
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
}
}
输出如下:
image.png
通过上述的实例使用可以发现
Log4j的调用:
import org.apache.log4j.Logger;
private final Logger log= Logger.getLogger(类名.class.getName());
Log4j2的调用:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static Logger logger = LogManager.getLogger(类名.class.getName());
网友评论