java日志框架之Log4j

文章目录

  • 1、Log4j简介
  • 2、Log4j组件介绍
  • 3、Log4j入门使用
  • 4、Log4j自定义配置文件输出日志
    • 4.1、输出到控制台
    • 4.2、输出到文件
    • 4.3、输出到数据库
  • 5、Log4j自定义配置文件拆分日志
    • 5.1、按照文件大小进行拆分
    • 5.2、按照日期进行拆分
  • 6、自定义配置文件中的logger

1、Log4j简介

  • Log4j是Apache的一个开源项目
  • 可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等
  • 也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
  • 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码

2、Log4j组件介绍

  • 主要由Loggers (日志记录器)Appenders(输出控制器)Layout(日志格式化器) 组成。
  • Loggers:控制日志的输出以及输出级别(JUL做日志级别Level)
  • Appenders: 指定日志的输出方式(输出到控制台、文件等)
  • Layout: 控制日志信息的输出格式

Loggers

  • 日志记录器,负责收集处理日志记录,实例的命名就是类的全限定名,如com.xc.log4j.XX, Logger的名字大小写敏感
  • 命名有继承机制;例如:name为com.xc.log4j的logger会继承 name为com.xc
  • 上辈所做的日志属性设置,会直接的影响到子辈
  • Log4J中有一个特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都会直接 或者间接地继承自root
  • root logger可以用Logger.getRootLogger()方法获取
  • 关于日志级别信息,例如DEBUG、INFO、WARN、ERROR…级别是分大小的,DEBUG < INFO < WARN < ERROR,分别用来指定这条日志信息的重要程度

Appenders

  • ConsoleAppender将日志输出到控制台
  • FileAppender将日志输出到文件中
  • DailyRollingFileAppender将日志输出到一个日志文件,并且每天输出到一个新的文件
  • RollingFileAppender将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
  • JDBCAppender把日志信息保存到数据库中

Layouts

  • HTMLLayout:格式化日志输出为HTML表格形式
  • SimpleLayout:简单的日志输出格式化,打印的日志格式如默认INFO级别的消息
  • PatternLayout:最强大的格式化组件,可以根据自定义格式输出日志,如果没有指定转换格式, 就是用默认的转换格式

日志输出格式说明:

  • %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字符,就从左边交远销出的字符截掉

3、Log4j入门使用

Log4j提供了8个级别的日志输出

  • ALL 最低等级 用于打开所有级别的日志记录
  • TRACE 程序推进下的追踪信息,这个追踪信息的日志级别非常低,一般情况下是不会使用的
  • DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要是配合开发,在开发过程中打印一些重要的运行信息
  • INFO 消息的粗粒度级别运行信息
  • WARN 表示警告,程序在运行过程中会出现的有可能会发生的隐形的错误
  • ERROR 系统的错误信息,发生的错误不影响系统的运行 一般情况下,如果不想输出太多的日志,则使用该级别即可
  • FATAL 表示严重错误,它是那种一旦发生系统就不可能继续运行的严重错误
  • OFF 最高等级的级别,用户关闭所有的日志记录

导包

import org.apache.log4j.Logger;

pom依赖

<dependency>
    <groupId>log4jgroupId>
    <artifactId>log4jartifactId>
    <version>1.2.17version>
dependency>
@Test
public void test01(){
    //加载初始化配置
    BasicConfigurator.configure();
    //初始化源码,需要设置Appender(输出方式)和Layout(输出格式)
//        public static void configure() {
//            Logger root = Logger.getRootLogger();
//            root.addAppender(new ConsoleAppender(new PatternLayout("%r [%t] %p %c %x - %m%n")));
//        }
    Logger logger = Logger.getLogger(Log4jTest.class);

    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

输出结果:

Connected to the target VM, address: '127.0.0.1:56633', transport: 'socket'
0 [main] FATAL com.xc.mylog.Log4jTest  - fatal信息
2 [main] ERROR com.xc.mylog.Log4jTest  - error信息
2 [main] WARN com.xc.mylog.Log4jTest  - warn信息
2 [main] INFO com.xc.mylog.Log4jTest  - info信息
2 [main] DEBUG com.xc.mylog.Log4jTest  - debug信息
Disconnected from the target VM, address: '127.0.0.1:56633', transport: 'socket'

Process finished with exit code 0

由结果可知默认级别为debug

4、Log4j自定义配置文件输出日志

Loader.getResource(“log4j.properties”)源码默认从类路径找

4.1、输出到控制台

java日志框架之Log4j_第1张图片

@Test
public void test02(){
	//自定义配置文件设置Appender(输出方式)和Layout(输出格式)
    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

输出结果:

[FATAL     ][main][2022-06-22 22:20:54,362][com.xc.mylog.Log4jTest.test02(Log4jTest.java:121)]fatal信息
[ERROR     ][main][2022-06-22 22:20:54,364][com.xc.mylog.Log4jTest.test02(Log4jTest.java:122)]error信息
[WARN      ][main][2022-06-22 22:20:54,364][com.xc.mylog.Log4jTest.test02(Log4jTest.java:123)]warn信息
[INFO      ][main][2022-06-22 22:20:54,365][com.xc.mylog.Log4jTest.test02(Log4jTest.java:124)]info信息
[DEBUG     ][main][2022-06-22 22:20:54,365][com.xc.mylog.Log4jTest.test02(Log4jTest.java:125)]debug信息
[TRACE     ][main][2022-06-22 22:20:54,365][com.xc.mylog.Log4jTest.test02(Log4jTest.java:126)]trace信息

Process finished with exit code 0

4.2、输出到文件

java日志框架之Log4j_第2张图片

@Test
public void test03(){
	//输出到文件对于追加,默认是true
    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

输出结果:

java日志框架之Log4j_第3张图片

4.3、输出到数据库

创建表结构:(字段的制定可以根据需求进行调整)

CREATE TABLE tbl_log(
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(255) DEFAULT NULL COMMENT '项目名称',
    createTime varchar(255) DEFAULT NULL COMMENT '创建时间',
    level varchar(255) DEFAULT NULL COMMENT '日志级别',
    category varchar(255) DEFAULT NULL COMMENT '所在类的全路径',
    fileName varchar(255) DEFAULT NULL COMMENT '文件名称',
    message varchar(255) DEFAULT NULL COMMENT '日志消息',
    PRIMARY KEY(id)
)

java日志框架之Log4j_第4张图片

@Test
public void test04(){
	//将日志持久化到数据库表中
    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

输出结果:

java日志框架之Log4j_第5张图片

5、Log4j自定义配置文件拆分日志

5.1、按照文件大小进行拆分

覆盖文件的策略是,按照时间来进行覆盖,原则就是保留新的,覆盖旧的

java日志框架之Log4j_第6张图片

@Test
public void test05(){
    Logger logger = Logger.getLogger(Log4jTest.class);
    for (int i = 0; i < 10000; i++) {
         logger.fatal("fatal信息");
         logger.error("error信息");
         logger.warn("warn信息");
         logger.info("info信息");
         logger.debug("debug信息");
         logger.trace("trace信息");
     }
}

输出结果:

第一次执行:

java日志框架之Log4j_第7张图片
第二次执行:根据修改时间可看出所有的日志已经被覆盖过一次了

java日志框架之Log4j_第8张图片

5.2、按照日期进行拆分

java日志框架之Log4j_第9张图片

@Test
public void test05(){
	//根据日期拆分
    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

java日志框架之Log4j_第10张图片
我这里通过修改本地时间,执行三次得到的结果

当天日志都会记录在log4j.log里面,过完今天,则加日期后缀,而log4j.log又开始记录新的一天的日志

6、自定义配置文件中的logger

  • 以前创建出来的Logger对象,默认都是继承rootLogger的
  • 也可以自定义logger,让其他logger来继承这个logger

java日志框架之Log4j_第11张图片

  • 如果根节点的logger和自定义父logger配置的输出位置是不同的,则取二者的并集,配置的位置都会进行输出操作
  • 如果二者配置的日志级别不同,以按照我们自定的父logger的级别输出为主
  • 就是为了针对不同系统信息做更加灵活的输出操作

你可能感兴趣的:(java基础,log4j,java,apache)