Java——Log4j1与Log4j2

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为复写模式

RollingRandomAccessFileAppender,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值