Log2J基本使用

举报
兮动人 发表于 2022/08/29 16:38:01 2022/08/29
【摘要】 1. Log2j 简介 2. 快速入门 3. 日志的级别 4. Log4j组件 4.1 Loggers 4.2 Appenders 4.3 Layout 5. Layout的格式说明 6. Appender的输出 6.1 console 6.2 file 6.3 JDBC Appender 7. 自定义 Logger 1. Log2j 简介Log4j是Apache下的一款开源的日志框架,通...

1. Log2j 简介

  • Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4j,可以控制日志信息输出到控制台、文件、甚至是数据库中。
  • 可以控制每一条日志的输出格式,通过定义日志的输出级别,更灵活的控制日志的输出过程,方便项目的调试。

2. 快速入门

  • 添加所需依赖
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>
@Test
public void testQuick() throws Exception {

    // 初始化配置信息,在入门案例中暂时不使用配置文件
    BasicConfigurator.configure();

    // 获取日志记录器对象
    Logger logger = Logger.getLogger(Log4jTest.class);
    // 日志记录输出
    logger.info("hello log4j");

	// 日志级别
	logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃并终止运行、
	
	logger.error("error"); // 错误信息,不会影响系统运行
	logger.warn("warn");  // 警告信息,可能会发生问题
	logger.info("info"); // 运行信息,数据连接、网络问题、I/O 操作等
	logger.debug("debug"); //调试信息,一般在开发中使用,记录程序变量参数传递信息等
	
	logger.trace("trace");  //追踪信息,记录程序所有的流程信息
}    

在这里插入图片描述

3. 日志的级别

  • 每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分
fatal 指出每个严重的错误事件将会导致应用程序的退出。
error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
warn 表明会出现潜在的错误情形。
info 一般和在粗粒度级别上,强调应用程序的运行全程。
debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
trace 是程序追踪,可以用于输出程序运行中的变量,显示执行的流程。
  • 还有两个特殊的级别:
    OFF,可用来关闭日志记录。
    ALL,启用所有消息的日志记录。

注:一般只使用4个级别,优先级从高到低为 ERROR > WARN > INFO > DEBUG

  • log4j.properties
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别为trace,使用的appender为console
log4j.rootLogger = trace,console
# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定日志消息的格式 layout
log4j.appender.console.layout = org.apache.log4j.SimpleLayout
public class Log4jTest {

    // 快速入门
    @Test
    public void testQuick() throws Exception {

        // 获取日志记录器对象
        Logger logger = Logger.getLogger(Log4jTest.class);
        // 日志记录输出
        logger.info("hello log4j");

        // 日志级别
        logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃并终止运行、

        logger.error("error"); // 错误信息,不会影响系统运行
        logger.warn("warn");  // 警告信息,可能会发生问题
        logger.info("info"); // 运行信息,数据连接、网络问题、I/O 操作等
        logger.debug("debug"); //调试信息,一般在开发中使用,记录程序变量参数传递信息等

        logger.trace("trace");  //追踪信息,记录程序所有的流程信息

    }

}

在这里插入图片描述

  • 自定义 logger 对象默认会继承 rootLogger,rootLogger 默认级别是最低的 trace
  • 开启 log4j 内置日志记录
// 开启 log4j 内置日志记录
LogLog.setInternalDebugging(true);

在这里插入图片描述

4. Log4j组件

  • Log4J 主要由 Loggers (日志记录器)、Appenders(输出端)和 Layout(日志格式化器)组成。

1、 Loggers 控制日志的输出级别与日志是否输出;
2、Appenders 指定日志的输出方式(输出到控制台、文件等);
3、Layout 控制日志信息的输出格式;

4.1 Loggers

  • 日志记录器,负责收集处理日志记录,实例的命名就是类的 full quailied name(类的全限定名)
  • Logger的名字大小写敏感,其命名有继承机制:例如:nameorg.apache.commonslogger 会继承 nameorg.apachelogger
  • Log4j 中有一个特殊的logger叫做“root”,它是所有logger的根,也就意味着其他所有的logger都会直接或间接地继承自root
  • root logger可以用Logger.getRootLogger()方法获取。但是,自 log4j 1.2 版以来, Logger 类已经取代了 Category 类。对于熟悉早期版本的log4j的人来说,Logger 类可以被视为 Category 类的别名。
    在这里插入图片描述

4.2 Appenders

  • Appender 用来指定日志输出到哪个地方,可以同时指定日志的输出目的地。Log4j 常用的输出目的地有以下几种:
    在这里插入图片描述

4.3 Layout

  • 布局器 Layout 用于控制日志输出内容的格式,可以使用各种需要的格式输出日志。Log4j 常用
    的Layout:
格式化器类型 作用
HTMLLayout 格式化日志输出为HTML表格形式
SimpleLayout 简单的日志输出格式化,打印的日志格式为(info - message)
PatternLayout 最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式

5. Layout的格式说明

  • log4j.properties 配置文件中,定义了日志输出级别与输出端,在输出端中分别配置日志的输出格式。
  • log4j 采用类似 C 语言的 printf 函数的打印格式格式化日志信息,具体的占位符及其含义如下:
%m 输出代码中指定的日志信息

%p 输出优先级,及 DEBUG、INFO 等

%n 换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n")

%r 输出自应用启动到输出该 log 信息耗费的毫秒数

%c 输出打印语句所属的类的全名

%t 输出产生该日志的线程全名

%d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}

%l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)

%F 输出日志消息产生时所在的文件名称

%L 输出代码中的行号

%% 输出一个 "%" 字符

  • 可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式。如:
%5c 输出category名称,最小宽度是5,category<5,默认的情况下右对齐

%-5c 输出category名称,最小宽度是5,category<5"-"号指定左对齐,会有空格

%.5c 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格

%20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉

6. Appender的输出

  • Appender的输出:控制台、文件、数据库

6.1 console

  • 案例:自定义输出的日志格式到控制台中
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别为 trace,使用的 apeender 为console
log4j.rootLogger = trace,console
# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
@Test
public void testQuick() throws Exception {

    // 获取日志记录器对象
    Logger logger = Logger.getLogger(Log4jTest.class);
    // 日志记录输出
    logger.info("hello log4j");

    // 日志级别
    logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃并终止运行、

    logger.error("error"); // 错误信息,不会影响系统运行
    logger.warn("warn");  // 警告信息,可能会发生问题
    logger.info("info"); // 运行信息,数据连接、网络问题、I/O 操作等
    logger.debug("debug"); //调试信息,一般在开发中使用,记录程序变量参数传递信息等

    logger.trace("trace");  //追踪信息,记录程序所有的流程信息

}

在这里插入图片描述

6.2 file

# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=trace,使用的 apeender 为=console
log4j.rootLogger = trace,console,file
# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n


# %m   输出代码中指定的日志信息
# %p   输出优先级,及 DEBUG、INFO 等
# %n   换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n")
# %r   输出自应用启动到输出该 log 信息耗费的毫秒数
# %c   输出打印语句所属的类的全名
# %t   输出产生该日志的线程全名
# %d   输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
# %l   输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
# %F   输出日志消息产生时所在的文件名称
# %L   输出代码中的行号
# %%   输出一个 "%" 字符


# 日志文件输出的 appender 对象
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.file.file = /logs/log4j.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8
  • 可以生成对应的日志文件
    在这里插入图片描述

  • 如果开启的日志对象每一条日志信息都输出到同一个日志文件当中,日志文件越来越多,不方便后期的管理。

  • 如果日志文件按照一定的规则将日志内容进行分开保存

  • 查看类 FileAppender 可以看到有两个实现类
    在这里插入图片描述

1、RollingFileAppender :根据文件的大小进行拆分的,如果超过一定数量就会拆分成多个文件

# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=trace,使用的 apeender 为=console
log4j.rootLogger = trace,rollingFile
# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n

# 按照文件大小拆分的 appender 对象
# 日志文件输出的 appender 对象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.rollingFile.file = /logs/log4j.log
# 指定日志文件的字符集
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志文件内容的大小
log4j.appender.rollingFile.maxFileSize = 1MB 
# 指定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex = 10
  • 遍历 1w 条打印的日志信息,当文件大小超过 1MB 时,文件就会被拆分成10个相同大小的文件,如果超过10个后就会按照时间进行覆盖

2、DailyFileAppender :按照时间的规则对文件进行拆分的

# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=trace,使用的 apeender 为=console
log4j.rootLogger = trace,dailyFile
# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n


# 按照时间规则拆分的 appender 对象
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyFile.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.dailyFile.file = /logs/log4j.log
# 指定日志文件的字符集
log4j.appender.dailyFile.encoding = UTF-8
# 指定日期拆分规则
log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss

6.3 JDBC Appender

  • 创建好日志文件输出所对应的表
CREATE TABLE `log` (
`log_id` int(11) NOT NULL AUTO_INCREMENT,
`project_name` varchar(255) DEFAULT NULL COMMENT '项目名',
`create_date` varchar(255) DEFAULT NULL COMMENT '创建时间',
`level` varchar(255) DEFAULT NULL COMMENT '优先级',
`category` varchar(255) DEFAULT NULL COMMENT '所在类的全名',
`file_name` varchar(255) DEFAULT NULL COMMENT '输出日志消息产生时所在的文件名称',
`thread_name` varchar(255) DEFAULT NULL COMMENT '日志事件的线程名',
`line` varchar(255) DEFAULT NULL COMMENT '行号',
`all_category` varchar(255) DEFAULT NULL COMMENT '日志事件的发生位置',
`message` varchar(4000) DEFAULT NULL COMMENT '输出代码中指定的消息',
PRIMARY KEY (`log_id`)
);
  • 在 pom 中导入 jdbc 依赖
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.29</version>
</dependency>
// 获取日志记录器对象
Logger logger = Logger.getLogger(Log4jTest.class);
// 日志记录输出
logger.info("hello log4j");


for (int i = 0; i < 10000; i++) {

    // 日志级别
    logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃并终止运行、

    logger.error("error"); // 错误信息,不会影响系统运行
    logger.warn("warn");  // 警告信息,可能会发生问题
    logger.info("info"); // 运行信息,数据连接、网络问题、I/O 操作等
    logger.debug("debug"); //调试信息,一般在开发中使用,记录程序变量参数传递信息等

    logger.trace("trace");  //追踪信息,记录程序所有的流程信息

}
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=trace,使用的 apeender 为=console
log4j.rootLogger = trace,logDB
# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n

#mysql
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
log4j.appender.logDB.Driver=com.mysql.cj.jdbc.Driver
log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
log4j.appender.logDB.User=root
log4j.appender.logDB.Password=root
log4j.appender.logDB.Sql=INSERT INTO log(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) \
values('xdr630','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

在这里插入图片描述

7. 自定义 Logger

  • 当自定义的级别为 info,输出日志文件时,rootLogger 的级别是 trace 就会被自定义 info 级别所覆盖,输出日志文件,同时也会输出到控制台中,因为 rootLogger 定义了输出到控制台中
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=trace,使用的 apeender为 console
log4j.rootLogger = trace,console

# 自定义 logger 对象设置
log4j.logger.com.xdr630 = info,file

# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n


# 日志文件输出的 appender 对象
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.file.file = /logs/log4j.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8

在这里插入图片描述

  • 自定义日志可以根据不同的业务场景来记录日志,如:自己编写的代码就保存到日志文件当中,第三方代码编写出现的问题就向控制台输出,错误级别设置为 error
# 指定 RootLogger 顶级父元素默认配置信息
# 指定日志级别=trace,使用的 apeender=console
log4j.rootLogger = trace,console

# 自定义 logger 对象设置
log4j.logger.com.xdr630 = info,file
log4j.logger.org.apache = error

# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n


# 日志文件输出的 appender 对象
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.file.file = /logs/log4j.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8

在这里插入图片描述

  • Logger 其实就是 Apache 提供的
@Test
public void testQuick() throws Exception {


    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.info("hello log4j");

    logger.fatal("fatal"); // 严重错误,一般会造成系统崩溃并终止运行、
    logger.error("error"); // 错误信息,不会影响系统运行
    logger.warn("warn");  // 警告信息,可能会发生问题
    logger.info("info"); // 运行信息,数据连接、网络问题、I/O 操作等
    logger.debug("debug"); //调试信息,一般在开发中使用,记录程序变量参数传递信息等
    logger.trace("trace");  //追踪信息,记录程序所有的流程信息


    Logger logger1 = Logger.getLogger(Logger.class); // Logger 其实就是 Apache 提供的

    logger1.fatal("fatal logger1 "); // 严重错误,一般会造成系统崩溃并终止运行、
    logger1.error("error logger1 "); // 错误信息,不会影响系统运行
    logger1.warn("warn logger1 ");  // 警告信息,可能会发生问题
    logger1.info("info logger1 "); // 运行信息,数据连接、网络问题、I/O 操作等
    logger1.debug("debug logger1 "); //调试信息,一般在开发中使用,记录程序变量参数传递信息等
    logger.trace("trace logger1 ");  //追踪信息,记录程序所有的流程信息
}
  • 可以看到 Apache 的日志级别是根据配置文件中的 error 级别以上的日志才会被输出,Apache 虽然没有配置再控制台输出,但父类配置了
    在这里插入图片描述

  • 在输出的日志文件中也能看到 com.xdr630 包下的 info 级别的日志情况
    在这里插入图片描述

  • 根据自定义的 logger ,可以对日志做到灵活输出的解决方案。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。