从01开始 从01开始
首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC基础
  • SpringBoot

    • SpringBoot基础
  • Windows使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • WPS
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 网站介绍
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

PeterJXL

首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC基础
  • SpringBoot

    • SpringBoot基础
  • Windows使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • WPS
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 网站介绍
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

    • JavaEE概念

    • Ant

    • Maven

    • 日志

      • 日志介绍
      • print大法
      • 常见的日志框架-简单介绍
      • 一个日志框架的设计
      • JDK Logging
      • log4j2 笔记
        • 准备jar包
        • 入门案例
        • 指定配置文件
        • 配置文件的路径和后缀
        • Log4j2 日志等级
        • properties案例
        • Appender
        • 参考
      • 日志的一些小技巧
      • 日志系统小结
    • Junit

    • JDBC

    • XML和JSON

  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java
  • JavaEE
  • 日志
2022-12-03
目录

log4j2 笔记

# 05.log4j2 笔记

‍   Log4j :log for java (java 的日志) 是 java 主流的日志框架,提供各种类型,各种存储,各种格式,多样化的日志服务

‍

‍

# 准备jar包

在官网下载jar包 Log4j – Download Apache Log4j™ 2 (opens new window)

解压,我们只需要里面的这2个jar包:

  • log4j-api-2.x.jar
  • log4j-core-2.x.jar

api的jar包是接口规范,core的jar包才是具体的实现,如果忘了可以回顾下:常见的日志框架-简单介绍 (opens new window)

我们将其放到我们代码所在的路径.

‍

# 入门案例

在jar包所在目录里,新建测试类

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class HelloLog4j {

    private static final Logger logger = LogManager.getLogger(HelloLog4j.class);
    public static void main(String[] args) {
      logger.error("error");
      logger.warn("warn");
      logger.info("Info");
      logger.debug("debug");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

‍

编译,运行:

> javac -cp "log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j.java

> java -cp ".;log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j

15:33:30.612 [main] ERROR HelloLog4j - error
1
2
3
4
5

可以看到只输出了error。

‍

# 指定配置文件

我们新建一个配置文件 Log4j2.xml。Log4j2会自动加载该文件,该配置文件有点复杂,大家简单看看即可,后面会讲。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
    <!-- 定义日志格式 -->
	<Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
    <!-- 定义文件名变量 -->
	<Property name="file.err.filename">log/err.log</Property>
	<Property name="file.err.pattern">log/err.%i.log.gz</Property>
</Properties>
  
  
  <!-- 定义Appender,即目的地 -->
<Appenders>
    <!-- 定义输出到屏幕 -->
	<Console name="console" target="SYSTEM_OUT">
      <!-- 日志格式引用上面定义的log.pattern -->
		<PatternLayout pattern="${log.pattern}" />
	</Console>
  
    <!-- 定义输出到文件,文件名引用上面定义的file.err.filename -->
	<RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
		<PatternLayout pattern="${log.pattern}" />
		<Policies>
        <!-- 根据文件大小自动切割日志 -->
			<SizeBasedTriggeringPolicy size="1 MB" />
		</Policies>
        <!-- 保留最近10份 -->
		<DefaultRolloverStrategy max="10" />
	</RollingFile>
</Appenders>
<Loggers>
	<Root level="info">
      <!-- 对info级别的日志,输出到console -->
		<AppenderRef ref="console" level="info" />
      <!-- 对error级别的日志,输出到err,即上面定义的RollingFile -->
		<AppenderRef ref="err" level="error" />
	</Root>
</Loggers>
</Configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

‍

‍

‍

此时我们再次运行:

> java -cp ".;log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j
12-03 15:44:48.556 [main] ERROR HelloLog4j
error

12-03 15:44:48.558 [main] WARN  HelloLog4j
warn

12-03 15:44:48.558 [main] INFO  HelloLog4j
Info
1
2
3
4
5
6
7
8
9

可以看到输出了error,warn和INFO。并且当前目录下生成了 log文件夹,里面有err.log文件。

‍

‍

# 配置文件的路径和后缀

Log4j2能够在初始化期间自动寻找配置,它支持4种格式的配置文件:

  • Properties — .properties
  • YAML — .yaml or .yml
  • JSON — .json or .jsn
  • XML — .xml

并且按从高到低的加权顺序查找配置文件。例如,如果它找到一个 YAML 配置,它将停止搜索并加载它。注意,只能是这几种配置文件后缀名。

‍

‍

那么,Log4j2具体是怎么寻找文件的呢?

Log4j2启动时,首先检查系统属性log4j.configurationFile,如果设置了该属性,则匹配文件扩展名去加载配置文件,在启动应用时配置该参数。

我们复制一份Log4j2.xml,重命名为my.xml 修改第6行和第7行内容如下:

<Property name="file.err.filename">log/err2.log</Property>
<Property name="file.err.pattern">log/err2.%i.log.gz</Property>
1
2

‍

然后运行:

> java -cp ".;log4j-jcl-2.19.0.jar;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" -Dlog4j.configurationFile="my.xml" HelloLog4j
12-03 16:13:07.626 [main] ERROR HelloLog4j
error

12-03 16:13:07.628 [main] WARN  HelloLog4j
warn

12-03 16:13:07.628 [main] INFO  HelloLog4j
Info
1
2
3
4
5
6
7
8
9

可以看到生成了err2.log 日志文件,也就是采用了我们指定的配置文件

log4j.configurationFile可以配置如上的绝对路径,也可以配置相对路径,即只配置文件名myLog4j2.xml,Log4j2会在classpath路径中查找配置文件。

‍

‍

如果没有设置系统属性,则在classpath路径中按照顺序查找如下4个文件:

log4j2-test.properties
log4j2-test.yaml or log4j2-test.yml
log4j2-test.json or log4j2-test.jsn
log4j2-test.xml
1
2
3
4

‍

如果还找不到上面的文件,则在classpath路径中按照顺序查找如下4个文件:

log4j2.properties
log4j2.yaml or log4j2.yml
log4j2.json or log4j2.jsn
log4j2.xml
1
2
3
4

‍

如果没有任何配置文件,则使用默认配置文件,这将导致日志输出到控制台;默认配置如下

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <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>
1
2
3
4
5
6
7
8
9
10
11
12
13

这也就是为什么我们入门案例里只输出了error

‍

‍

‍

# Log4j2 日志等级

Log4j2共有8种日志级别,按照优先级从小到大排序:

ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
1

当日志级别设置为某一级别时,则会打印大于等于该级别的日志,
比如日志级别设置为ERROR, 则会打印ERROR,FATAL级别的日志。
ALL会把所有级别的日志打印出来,OFF不会打印任何级别的日志,所以严格来讲只有中间6种日志级别。

‍

‍

Log4j 官方建议实际实用的话,只使用四个级别,** ERROR、WARN、INFO、DEBUG。我们工作中也一般只使用这4种。**

‍

‍

# properties案例

有时候xml文件写起来比较麻烦,可以考虑使用properties文件,我们新建一个log4j2.properties文件

name=PropertiesConfig
# 定义变量。指定日志文件的位置和文件名称,以便记录多份日志时,直接引用
property.fileName=peterjxldemo
property.fileDir=./logs
property.filePath=${fileDir}/${fileName}.log
appenders=console, rolling

# rootLogger, 根记录器,所有记录器的父辈
# 指定根日志的级别
rootLogger.level=ALL
# 指定输出的appender引用
rootLogger.appenderRef.stdout.ref=Stdout
rootLogger.appenderRef.rolling.ref=InfoRollingFile


# console
# 指定输出源的类型与名称
appender.console.type=Console
appender.console.name=Stdout
appender.console.layout.type=PatternLayout
# 输出模板
appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
  

# rootLogger, 根记录器,所有记录器的父辈

# 指定根日志的级别
rootLogger.level=ALL

# 指定输出的appender引用
rootLogger.appenderRef.stdout.ref=Stdout
rootLogger.appenderRef.rolling.ref=InfoRollingFile


# console
# 指定输出源的类型与名称
appender.console.type=Console
appender.console.name=Stdout
appender.console.layout.type=PatternLayout
# 输出模板
appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}

# rolling file
appender.rolling.type=RollingFile
appender.rolling.name=InfoRollingFile
appender.rolling.fileName=${filePath}
# 指定当发生Rolling时,文件的转移和重命名规则
appender.rolling.filePattern=${fileDir}/${fileName}_%d{yyyy-MM-dd}_%i.log
appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
# 指定记录文件的封存策略,该策略主要是完成周期性的日志文件封存工作
appender.rolling.policies.type=Policies
# 基于时间的触发策略
appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
# 当前记录周期为每1h生成一个文件
appender.rolling.policies.time.interval=1
appender.rolling.policies.time.modulate=true
# 基于日志文件体积的触发策略
appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
# 当日志文件体积大于size指定的值时,触发Rolling
appender.rolling.policies.size.size=20M
# 文件封存的覆盖策略
appender.rolling.strategy.type=DefaultRolloverStrategy
# 生成分割(封存)文件的个数
appender.rolling.strategy.max=100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

然后运行:

>java -cp ".;log4j-api-2.19.0.jar;log4j-core-2.19.0.jar" HelloLog4j
2022-12-03 16:51:35,457 main ERROR Unable to locate appender "InfoRollingFile" for logger config "root"
2022-12-03 16:51:35.491 [ERROR] [main] [HelloLog4j.main(HelloLog4j.java:8)] - error
2022-12-03 16:51:35.494 [ WARN] [main] [HelloLog4j.main(HelloLog4j.java:9)] - warn
2022-12-03 16:51:35.494 [ INFO] [main] [HelloLog4j.main(HelloLog4j.java:10)] - Info
2022-12-03 16:51:35.494 [DEBUG] [main] [HelloLog4j.main(HelloLog4j.java:11)] - debug
1
2
3
4
5
6

可以看到有输出,并且有日志文件

‍

‍

‍

‍

# Appender

输出源,用于定义日志输出的地方。log4j2支持的输出源有很多,有

  • 控制台ConsoleAppender、
  • 文件FileAppender、AsyncAppender、RandomAccessFileAppender、RollingFileAppender、RollingRandomAccessFile 等。

‍

‍

ConsoleAppender

控制台输出源是将日志打印到控制台上,开发的时候一般都会配置,以便调试。

name:指定Appender的名字。
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT。
PatternLayout:输出格式,不设置默认为:%m%n。
1
2
3

‍

FileAppender

文件输出源,用于将日志写入到指定的文件,其底层是一个OutputStreamAppender,需要配置输入到哪个位置(例如:D:/logs/mylog.log)

name:指定Appender的名字。
fileName:指定输出日志的目的文件带全路径的文件名。
PatternLayout:输出格式,不设置默认为:%m%n。
1
2
3

‍

RollingFileAppender

RollingFileAppender是一个OutputStreamAppender,它写入fileName参数中指定的File。因为它可以指定当日志文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则。避免日志文件过大,工作中常用

为什么叫rolling呢?因为日志是滚动的,不断新增的

‍

‍

‍

‍

‍

# 参考

Log4j2基本使用入门 - 简书 (opens new window)

log4j2 入门教程_timchen525的博客-CSDN博客 (opens new window)

log4j2配置详细 - gsluofu - 博客园 (opens new window)

‍

‍

更多配置相关的说明,可以参考官网的文档:

Log4j – Configuring Log4j 2 (opens new window)

Log4j – Log4j 2 Appenders (opens new window)

Log4j – Frequently Asked Questions (opens new window)

‍

在 GitHub 上编辑此页 (opens new window)
上次更新: 2024/3/27 00:00:28
JDK Logging
日志的一些小技巧

← JDK Logging 日志的一些小技巧→

Theme by Vdoing | Copyright © 2022-2024 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式