Log4j

作者: 索伦x | 来源:发表于2019-01-07 18:54 被阅读0次

    日志的好处:

    1. 方便调试
    2. 便于发现系统运行过程中的错误
    3. 存储业务数据,便于后期分析

    Log4j 简介

    Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、数据库等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。支持不同的class, package, 日志级别输出到不同目的地。
    Log4j有6种不同的log级别,按照等级从低到高依次为:TRACE、DEBUG、INFO、WARN、ERROR、FATAL.
    Log4j支持两种格式的配置文件:properties和xml。包含三个主要的组件:Logger、appender、Layout。

    Log4j 日志级别

    为了方便对于日志信息的输出显示,对日志内容进行了分级管理。日志级别由高到低,共分 6 个级别:

    • fatal(致命的)
    • error
    • warn
    • info
    • debug
    • trace(堆栈)

    为什么要对日志进行分级

    无论是将日志输出到控制台,还是文件,其输出都会降低程序的运行效率。但由于调试、运行维护的需要,客户的要求等原因,需要进行必要的日志输出。这时就必须要在代码中加入日志输出语句。

    这些输出语句若在程序运行时全部执行, 则势必会降低运行效率。例如, 使用 System.out.println() 将信息输出到控制台,则所有的该输出语句均将执行。会大大降低程序的执行效率。而要使其不输出,唯一的办法就是将这些输出语句逐个全部删除。这是个费时费力的过程。

    将日志信息进行分级管理,便可方便的控制信息输出内容及输出位置:哪些信息需要输出,哪些信息不需要输出,只需在一个日志输出控制文件中稍加修改即可。而代码中的输出语句不用做任何修改。

    从这个角度来说,代码中的日志编写,其实就是写大量的输出语句。只不过,这些输出语句比较特殊,它们具有级别,在程序运行期间不一定被执行。它们的执行是由另一个控制文件控制。

    Slf4j 简介

    slf4j 的全称是 Simple Loging Facade For Java,即它仅仅是一个为 Java 程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如 JDBC 一样,只是一种规则而已。所以单独的 slf4j 是不能工作的,必须搭配其他具体的日志实现方案,比如 apache 的 org.apache.log4j.Logger,JDK 自带的 java.util.logging.Logger 以及 log4j 等。
    slf4j 、log4j、logback 这三个框架都是同一个作者ceki 开发的,作者说 log4j 太烂,不想修改了,因此开发了 升级版的 log4j,也就是 logback

    使用slf4j绑定日志系统的优势

    软件工程的角度。抽象,解耦,便于维护。可以参考一下上面的例子。
    语法设计角度。slf4j有{}占位符,而log4j需要用“+”来连接字符串,既不利于阅读,同时消耗了内存(heap memory)。

    POM

    继续之前的项目,pom.xml 配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.funtl</groupId>
        <artifactId>hello-spring</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.3.17.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.25</version>
            </dependency>
        </dependencies>
    </project>
    

    创建 log4j.properties 配置文件

    在 src/main/resources 目录下创建名为 log4j.properties 的属性配置文件

    log4j.rootLogger=INFO, console, file
    
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n
    
    log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.file.File=logs/log.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.A3.MaxFileSize=1024KB
    log4j.appender.A3.MaxBackupIndex=10
    log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n
    

    日志配置相关说明:

    • log4j.rootLogger:根日志,配置了日志级别为 INFO,预定义了名称为 console、file 两种附加器
    • log4j.appender.console:console 附加器,日志输出位置在控制台
    • log4j.appender.console.layout:console 附加器,采用匹配器布局模式
    • log4j.appender.console.layout.ConversionPattern:console 附加器,日志输出格式为:日期 日志级别 [类名] - 消息换行符
    • log4j.appender.file:file 附加器,每天产生一个日志文件
    • log4j.appender.file.File:file 附加器,日志文件输出位置 logs/log.log
    • log4j.appender.file.layout:file 附加器,采用匹配器布局模式
    • log4j.appender.A3.MaxFileSize:日志文件最大值
    • log4j.appender.A3.MaxBackupIndex:最多纪录文件数
    • log4j.appender.file.layout.ConversionPattern:file 附加器,日志输出格式为:日期 日志级别 [类名] - 消息换行符
    • 日志输出规则说明
    %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL  
    %r 输出自应用启动到输出该log信息耗费的毫秒数  
    %c 输出所属的类目,通常就是所在类的全名  
    %t 输出产生该日志事件的线程名  
    %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”  
    %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921  
    %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
    

    测试日志输出
    创建一个测试类,并测试日志输出效果,代码如下:

    package com.funtl.hello.spring;                                               
                                                                                  
    import org.slf4j.Logger;                                                      
    import org.slf4j.LoggerFactory;                                               
                                                                                  
    public class MyTest {                                                         
                                                                                  
        public static final Logger logger = LoggerFactory.getLogger(MyTest.class);
                                                                                  
        public static void main(String[] args) {                                  
            logger.info("slf4j for info");                                        
            logger.debug("slf4j for debug");                                      
            logger.error("slf4j for error");                                      
            logger.warn("slf4j for warn");                                        
                                                                                  
            String message = "Hello SLF4J";                                       
            logger.info("slf4j message is : {}", message);                        
        }                                                                         
    }        
    

    附:占位符说明

    打日志的时候使用了 {} 占位符,这样就不会有字符串拼接操作,减少了无用 String 对象的数量,节省了内存。并且,记住,在生产最终日志信息的字符串之前,这个方法会检查一个特定的日志级别是不是打开了,这不仅降低了内存消耗而且预先降低了 CPU 去处理字符串连接命令的时间。

    相关文章

      网友评论

          本文标题:Log4j

          本文链接:https://www.haomeiwen.com/subject/lckprqtx.html