zoukankan      html  css  js  c++  java
  • 7_Log

    一. 引言

    1.1 日志介绍

    • 用于记录系统中发生的各种事件. 记录的位置常见的有: 控制台, 磁盘文件等

    1.2 日志级别

    • 日志级别由低到高
      • TRACE, DEBUG, INFO, WARN, ERROR, FATAL

    1.3 日志的作用

    • 通过日志观察, 分析项目的运行情况(项目维护)
    • 通过日志分析用户的使用情况(大数据分析)
    • ...

    二. 解决方案1

    2.1 Log4j + Commons-Logging

    2.1.1 导入依赖
    • 项目中导入Log4j 和 Commons-Logging的依赖
    <!--log4j-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <!--commons-logging-->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    
    2.1.2 基本使用
    • Log4j + Commons-Logging基本API
    package com.dz.test;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.junit.Test;
    
    public class LogTest {
        //日志对象
        private Log log = LogFactory.getLog(LogTest.class);
        @Test
        public void test() {
            log.trace("hello trace");
            log.debug("hello debug");
            log.info("hello info");
            log.warn("hello warn");
            log.error("hello error");
            log.fatal("hello fatal");
        }
    }
    
    2.1.3 配置信息
    • 定义配置文件 log4j.xml
    #占位符
    %p: 输出优先级, 即 DEBUG, INFO, WARN, ERROR, FATAL
    %r: 输出自应用启动到输出该log信息耗费的毫秒数
    %c: 输出所在类的全名
    %t: 输出产生该日志事件的线程名
    %n: 输出一个回车换行符
    %d: 输出日志时间点的日期或时间, 默认格式为ISO8601, 也可以在其后指定格式, 比如: %d{yyyy-MM-dd HH:mm:ss,SSS}, 输出类似: 	2021-01-01 15:26:37,945 
    %l: 输出日志事件的发生位置, 包括类名, 发生的线程, 以及在代码中的行数. 举例: Testlo4.main(TestLog4.java:10)
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration PUBLIC "-//LOGGER"
            "http://org/apache/log4j/xml/log4j.dtd">
    <log4j:configuration>
    
        <!--输出到控制台-->
        <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
            <!--输出格式-->
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
            </layout>
        </appender>
        <!--输出到文件-->
        <appender name="myFile1" class="org.apache.log4j.RollingFileAppender">
            <param name="File" value="d:/log/hello1.log"/><!--文件位置-->
            <param name="Append" value="true"/><!--是否选择追加-->
            <param name="MaxFileSize" value="1kb"/><!--文件最大字节数-->
            <param name="MaxBackupIndex" value="2"/><!--新文件数量-->
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
            </layout>
        </appender>
        <!--输出到文件-->
        <appender name="myFile2" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="d:/log/daily.log"/><!--文件位置-->
            <param name="Append" value="true"/><!--是否选择追加-->
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
            </layout>
        </appender>
        <!--根logger的设置-->
        <root>
            <!--优先级设置 all < trace < debug < info < warn < error < fatal < off-->
            <priority value="debug"/>
            <appender-ref ref="myConsole"/>
            <appender-ref ref="myFile1"/>
            <appender-ref ref="myFile2"/>
        </root>
    </log4j:configuration>
    

    三. 解决方案2

    3.1 Logback + SLF4j

    3.1.1 导入依赖
    • 项目中导入依赖
    <!--logback依赖, 还会传递 slf4j 和 logback-core-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
        <scope>test</scope>
    </dependency>
    
    3.1.2 基本使用
    • Logback + SLF4j 基本API
    package com.dz.test;
    
    import org.junit.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    public class LogTest {
        //需要输出日志的类, 可以创建一个log属性
        private Logger log = LoggerFactory.getLogger(LogTest.class);
        @Test
        public void test() throws InterruptedException {
            
            log.trace("hello trace");
            log.debug("hello debug 张三");
            log.info("hello info 张三");
            log.warn("hello warn 张三");
            log.error("hello error 张三");
            //注意: logback中没有fatal日志
        }
    }
    
    3.1.3 配置信息
    • 定义 logback.xml
    #占位符
    %d{yyyy-MM-dd HH:mm:ss,SSS}: 日期
    %5p: 日志级别, 5位字符长度显示, 如果内容占不满5位则内容右对齐并在左侧补空格
    %-5p: 5位字符长度显示日志级别, 如果内容占不满5位则内容左对齐并在右侧补空格, -代表左对齐
    %logger: 日志所在包和类
    %M: 日志所在方法名
    %L: 日志所在代码行
    %m: 日志正文
    %n: 换行
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!--scan: 当此属性设置为true时, 配置文件如果发生改变, 将会被重新加载, 默认值为true-->
    <!--scanPeriod: 设置检测配置文件是否有修改时间的时间间隔, 如果没有给出时间单位, 默认单位是毫秒.
     当scan为true时, 此属性生效, 默认的时间间隔为1分钟-->
    <!--debug: 当此属性设置为true时, 将打印出logback内部日志信息, 实时查看logback运行状态. 默认值为false-->
    <configuration scan="true" scanPeriod="60 seconds" debug="true">
        <!--定义变量, 可通过 ${log.path}和${CONSOLE_LOG_PATTERN} 得到变量值-->
        <property name="log.path" value="d:/log"/>
        <property name="CONSOLE_LOG_PATTERN"
                  value="%d{yyyy-MM-dd HH:mm:ss.SSS} |-{%-5p} in %logger.%M[line-%L] -%m%n"/>
    
        <!--输出到控制台-->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <!--Threshold=即是最低日志级别, 此appender输出大于等于对应级别的日志
                (当然还要满足root中定义的最低级别)
            -->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>debug</level>
            </filter>
            <encoder>
                <!--日志格式(引用变量)-->
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                <!--设置字符集-->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
        <!--追加到文件中-->
        <appender name="file1" class="ch.qos.logback.core.FileAppender">
            <file>${log.path}/hello.log</file>
            <encoder>
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            </encoder>
        </appender>
        <!--滚动追加到文件中-->
        <appender name="file2" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--正在记录的日志文件的路径及文件名-->
            <file>${log.path}/logback.log</file>
            <!--日志文件输出格式-->
            <encoder>
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                <charset>UTF-8</charset><!--设置字符集-->
            </encoder>
            <!--日志记录器的滚动策略, 按日期,按大小记录
                文件超过最大尺寸后, 会创建文件, 然后新的日志文件中继续写入
                如果日期变更, 也会新建文件, 然后在新的日志文件中写入当天日志
            -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--新建文件后, 原日志改名为如下: %i=文件序号, 从0开始-->
                <fileNamePattern>${log.path}/logback-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <!--每个日志文件的最大体量-->
                <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>1kb</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--日志文件保留天数 1=只保留昨天的归档日志文件, 不设置则保留所有日志-->
                <maxHistory>1</maxHistory>
            </rollingPolicy>
        </appender>
    
        <root level="trace">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="file1"/>
            <appender-ref ref="file2"/>
    
        </root>
    </configuration>
    
  • 相关阅读:
    LeetCode 227. Basic Calculator II
    LeetCode 224. Basic Calculator
    LeetCode 103. Binary Tree Zigzag Level Order Traversal
    LeetCode 102. Binary Tree Level Order Traversal
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode 169. Majority Element
    LeetCode 145. Binary Tree Postorder Traversal
    LeetCode 94. Binary Tree Inorder Traversal
    LeetCode 144. Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/MRASdoubleZ/p/14785948.html
Copyright © 2011-2022 走看看