日志框架Log4j的使用

夏弘义
2023-12-01

Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4J,可以控制日志信息输出到控制台、文件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程,这些功能都可以通过一个配置文件进行灵活配置,不需要修改相应代码,方便项目的调试。

一、使用步骤:

1. 导入log4j相关jar包
2. 编写log4j配置文件
命名为 log4j.properties,放在 src 根目录下

log4j.rootLogger=debug, consoleAppender, fileAppender

# 输出源为控制台的相关配置
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.ImmediateFlush=true
log4j.appender.consoleAppender.Target=System.out
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n

# 输出源为文件的相关配置
log4j.appender.fileAppender=org.apache.log4j.FileAppender
log4j.appender.fileAppender.ImmediateFlush = true
log4j.appender.fileAppender.Append=true
log4j.appender.fileAppender.File=./log4j-log.log
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d %5p %c{1}:%L - %m%n
log4j.appender.fileAppender.encoding=UTF-8

3. 在代码中获取日志对象

package com.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// 测试类
public class Log4JTest {

    // 方式一:使用log4j的api来获取日志的对象
    // 弊端:如果以后我们更换日志的实现类,那么下面的代码就需要跟着改(不推荐使用)
    // private static final Logger LOGGER = Logger.getLogger(Log4JTest.class);

    // 方式二:使用slf4j里面的api来获取日志的对象
    // 好处:如果以后更换日志的实现类,那么下面的代码不需要跟着修改(推荐使用)
    private static final Logger logger = LoggerFactory.getLogger(Log4JTest.class);

    public static void main(String[] args) {
        logger.debug("debug级别的日志");
        logger.info("info级别的日志");
        logger.warn("warn级别的日志");
        logger.error("error级别的日志");
        /*
        2022-8-17 15:32:46,965 main DEBUG Log4JTest:24 - debug级别的日志
        2022-8-17 15:32:46,973 main  INFO Log4JTest:25 - info级别的日志
        2022-8-17 15:32:46,973 main  WARN Log4JTest:26 - warn级别的日志
        2022-8-17 15:32:46,974 main ERROR Log4JTest:27 - error级别的日志
         */
    }
}

4. 按照级别设置记录日志信息

  • Loggers(记录器):设定日志级别,常见的五个级别排序是DEBUG < INFO < WARN < ERROR < FATAL,规则为只输出级别不低于所设定级别的日志信息。

  • Appenders(输出源):日志要输出的地方,例如org.apache.log4j.ConsoleAppender(控制台)、org.apache.log4j.FileAppender(文件)。

    # 1. ConsoleAppener输出到控制台
    # 控制台输出Appender
    log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
    # 使用自定义日志格式化器
    log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
    # 自定义日志格式
    log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
    # 指定该Appender只的日志级别,优先级大于全局日志级别
    log4j.appender.systemOut.Threshold = DEBUG
    # 默认值是true,所有的消息都会被立即输出 
    log4j.appender.systemOut.ImmediateFlush = TRUE
    # 默认值System.out,输出到控制台(err为红色,out为黑色)
    log4j.appender.systemOut.Target = System.out
    #指定日志编码 
    log4j.appender.systemOut.encoding=UTF-8
    
    # 2. FileAppender输出到文件中
    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
    
    #3. RollingFileAppender按照文件大小拆分
    # 按照文件大小拆分的 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/log4j1.log
    # 指定日志文件的字符集
    log4j.appender.rollingFile.encoding = UTF-8
    # 指定日志文件内容的大小
    log4j.appender.rollingFile.maxFileSize = 1MB
    # 指定日志文件的数量
    log4j.appender.rollingFile.maxBackupIndex = 10
    
    # 4. DailyRollingFileAppender按时间拆分文件
    # 按照时间规则拆分的 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/log4j2.log
    # 指定日志文件的字符集
    log4j.appender.dailyFile.encoding = UTF-8
    # 指定日期拆分规则 只能根据-分割,不支持:(冒号),'.'yyyy-MM-dd-HH-mm-ss 每秒分隔,'.'yyyy-MM-dd-HH 按小时分隔
    log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss
    
    # 5.JDBCAppender日志信息保存到数据库
    #mysql
    log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
    log4j.appender.logDB.Driver=com.mysql.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('itcast','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
    
  • Layouts(布局):日志输出的格式,可以根据自己的喜好来规定日志输出的格式,org.apache.log4j.PatternLayout 可以灵活指定布局模式,org.apache.log4j.SimpleLayout 包含日志信息的级别和信息字符串,org.apache.log4j.TTCCLayout 包含日志产生的时间、线程、类别等信息

二、配置文件解释

  • 配置根Logger
    格式——log4j.rootLogger=日志级别, appenderName1, appenderName2, …
    日志级别——OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL 或者自定义的级别。
    appenderName:指定日志信息输出到哪里,可以同时指定多个输出路径,用逗号隔开。

  • ConsoleAppender配置项
    ImmediateFlush=true——表示所有消息会被立刻输出,设为false则不输出,默认为true。
    Target=System.err——默认值为System.out。

  • FileAppender 配置项
    ImmediateFlush=true——表示所有消息会被立刻输出,设为false则不输出,默认为true。
    Append=false——true 表示将消息添加到指定文件中,原来的消息不覆盖,false 则将消息覆盖指定的文件内容,默认值是 true。
    File=D:/logs/logging.log4j——指定将消息输出到指定路径的 logging.log4j 文件中。

  • PatternLayout 配置项
    ConversionPattern=%m%n——设定以怎样的格式显示消息。

    %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
    %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921
    %r: 输出自应用启动到输出该log信息耗费的毫秒数
    %c: 输出日志信息所属的类目,通常就是所在类的全名
    %t: 输出产生该日志事件的线程名
    %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。
    %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    %%: 输出一个"%"字符
    %F: 输出日志消息产生时所在的文件名称
    %L: 输出代码中的行号
    %m: 输出代码中指定的消息,产生的日志具体信息
    %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
    
 类似资料: