Log4j

本文详细介绍了Log4j组件的使用,包括Loggers、日志级别、Appenders和Layouts。Log4j提供了控制台、文件、按日期和大小滚动的日志输出方式,以及自定义日志格式。此外,还讨论了日志门面SLF4J,它是Java日志访问的标准API,允许灵活地绑定不同的日志实现框架,如log4j。通过SLF4J,可以方便地管理和迁移项目的日志框架。
摘要由CSDN通过智能技术生成

Log4j组件

  • Loggers,日志记录器,控制日志的输出级别与日志是否输出;
    • 日志级别:
            logger.fatal("fatal");//严重错误,一般会造成系统崩溃并终止运行
            logger.error("error");//错误信息,不会影响系统运行
            logger.warn("warn");//警告信息,可能会发生错误
            logger.info("info");//运行信息,数据连接,网络连接,IO操作等
            logger.debug("debug");//调试信息,一般在开发中使用,记录程序变量参数传递信息等
            logger.trace("trace");//追踪信息,记录程序所有的流程信息
  • Appenders,输出端,指定日志的输出方式,输出控制台,文件等;
    • 1)ConsoleAppender, 将日志输出到控制台;
    • 2)FileAppender,将日志输出到文件;
    • 3)DailyRollingFileAppender,将日志输出到一个日志文件,并且每天输出到一个新的文件;
    • 4)RollingFileAppender,将日志信息输出到一个日志文件,并且指定文件的大小尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件;
    • 5)JDBCAppender,将日志信息保存到数据库中;
  • Layout,日志格式化器,控制日志信息的输出格式;
    • 1)HTMLLayout,格式化日志输出为HTML表格形式;
    • 2)SimpleLayout,简单的日志输出格式化,打印的日志格式为(info-message);
    • 3)PattenLayout,最强大的格式化器,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转化格式;

Layout配置日志信息

初始化日志信息:
加载配置文件resources/log4j.properties

# 指定RootLogger顶级父元素默认配置信息
# 指定日志级别 = trace,使用的 appender = console
log4j.rootLogger = trace,console

# 指定**控制台**日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender

# 自定义消息格式 Patternlayout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n

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

输出结果示例

log4j.appender.console.layout.conversionPattern = %r [%p] %t %l  %d{yyyy-MM-dd HH:mm:ss} - %m%n

0 [INFO] main org.example.AppTest.myTest(AppTest.java:18)  2021-07-18 10:33:30 - hello logging:

Appender 配置

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

按照文件大小拆分

#          按照文件大小拆分的appender对象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = %r [%p] %t %l  %d{yyyy-MM-dd HH:mm:ss} - %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

按照日期拆分

#          指定日志文件日志输出的 appender
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyFile.layout.conversionPattern = %r [%p] %t %l  %d{yyyy-MM-dd HH:mm:ss} - %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

日志门面技术

日志门面:JCL 和slf4j
SLF4j,(Simple Logging Facade For Java),主要是为Java日志访问提供一套标准、规范的ApI框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架。
日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j、logback),中间使用桥接器完成桥接。

JCL示例:

    <dependency>//导包,默认使用的日志框架是JUK
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.0.3</version>
    </dependency>
    <dependency>//想要使用哪种日志框架,就导入哪种
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>
public class AppTest 
{
//调用JCL记录日志
    @Test
    public void shouldAnswerWithTrue(){
        Log log = LogFactory.getLog(AppTest.class);
        log.info("hello jcl");
    }
}

slf4j示例:

slf4j内置日志框架简单使用

<!--      日志门面-->
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
<!--      内置的简单实现-->
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.7.25</version>
    </dependency>
public class AppTest 
{
    public static final Logger LOGGER = LoggerFactory.getLogger(AppTest.class);
    @Test
    public void shouldAnswerWithTrue(){
         LOGGER.error("error");
         LOGGER.warn("waring");
         LOGGER.info("info");
         //使用占位符输出日志信息
        String name = "it";
        Integer age = 14;
        LOGGER.info("用户:{},{}",name,age);
        //将系统的异常信息输出
        try {
            int i = 1/0;//Ctrl+Alt+t
        } catch (Exception e) {
            //e.printStackTrace();
            LOGGER.error("出现异常:",e);
        }

    }
}

slf4j可以绑定的日志框架图
slf4j可
使用slf4j绑定日志的实现:
使用流程:

  • 1)添加slf4j-api依赖
  • 2)使用slf4j的API在项目中进行统一的日志记录
  • 3)绑定具体的日志实现框架:
    • 3.1)绑定已经实现了slf4j的日志框架,直接添加对应的依赖
    • 3.2)绑定没有实现slf4j的日志框架,先添加日志的适配器,再添加实现类的依赖
  • 4)slf4j有且仅有一个日志实现框架的绑定(如果出现多个默认使用第一个依赖日志实现)
绑定log4j示例:
       <dependency>
            <!--日志门面-->
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
        <dependency>
            <!--适配器-->
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <!--实现框架-->
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
public class AppTest 
{
    public static final Logger LOGGER = LoggerFactory.getLogger(AppTest.class);
    @Test
    public void shouldAnswerWithTrue(){
         LOGGER.error("error");
         LOGGER.warn("waring");
         LOGGER.info("info");
         //使用占位符输出日志信息
        String name = "it";
        Integer age = 14;
        LOGGER.info("用户:{},{}",name,age);
        //将系统的异常信息输出
        try {
            int i = 1/0;//Ctrl+Alt+t
        } catch (Exception e) {
            //e.printStackTrace();
            LOGGER.error("出现异常:",e);
        }

    }
}

桥接器

解决的是项目中的日志遗留问题,当系统中存在以前的日志API,可以通过桥接转换到slf4j的实现,
步骤:
1)先去除之前老的日志框架的依赖
2)添加slf4j 提供的桥接组件
3)为项目添加slf4j的具体实现
桥接器使用示例:之前采用log4j实现,现在使用slf4j+slf4j-simple实现;

        <dependency>
            <!--日志门面-->
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j -->
        <dependency>
            <!-- log4j桥接器-->
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <!-- slf4j-simple内置实现-->
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
        </dependency>
public class AppTest {
    @Test
    public void myTest() {
        //开启log4j内置日志记录
        LogLog.setInternalDebugging(true);
        //初始化配置信息
        //BasicConfigurator.configure();
        //获取日志记录器对象
        org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(AppTest.class);
        //日志记录输出
        logger.info("hello logging:");
        //日志级别
        logger.fatal("fatal");//严重错误,一般会造成系统崩溃并终止运行
        logger.error("error");//错误信息,不会影响系统运行
        logger.warn("warn");//警告信息,可能会发生错误
        logger.info("info");//运行信息,数据连接,网络连接,IO操作等
        logger.debug("debug");//调试信息,一般在开发中使用,记录程序变量参数传递信息等
        logger.trace("trace");//追踪信息,记录程序所有的流程信息

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值