• 日志体系


    1.1 总体概览

    日志门面

    日志门面定义了一组日志的接口规范,它并不提供底层具体的实现逻辑。Apache Commons Logging 和 Slf4j 就属于这一类。

    日志实现

    日志实现则是日志具体的实现,包括日志级别控制、日志打印格式、日志输出形式(输出到数据库、输出到文件、输出到控制台等)。Log4jLog4j2Logback 以及 Java Util Logging 则属于这一类。

         

         将日志门面和日志实现分离其实是一种典型的门面模式,这种方式可以让具体业务在不同的日志实现框架之间自由切换,而不需要改动任何代码,开发者只需要掌握日志门面的 API 即可。

         日志门面是不能单独使用的,它必须和一种具体的日志实现框架相结合使用。

     

    2.1 Spring Boot 日志配置

    Spring Boot 的日志系统会自动根据 classpath 下的内容选择合适的日志配置,在这个过程中首选 Logback。

    如果开发者需要修改日志级别,只需要在 application.properties 文件中通过 logging.level 前缀+包名 的形式进行配置即可,例如下面这样:

    logging.level.org.springframework.web=debug
    logging.level.org.hibernate=error

    如果你想将日志输出到文件,可以通过如下配置指定日志文件名:

    logging.file.name=javaboy.log

    logging.file.name 可以只指定日志文件名,也可以指定日志文件全路径,例如下面这样:

    logging.file.name=/Users/sang/Documents/javaboy/javaboy.log

    如果你只是想重新定义输出日志文件的路径,也可以使用 logging.file.path 属性,如下:

    logging.file.path=/Users/sang/Documents/javaboy


    ======精细配置
    • logging.logback.rollingpolicy.file-name-pattern:日志归档的文件名,日志文件达到一定大小之后,自动进行压缩归档。
    • logging.logback.rollingpolicy.clean-history-on-start:是否在应用启动时进行归档管理。
    • logging.logback.rollingpolicy.max-file-size:日志文件大小上限,达到该上限后,会自动压缩。
    • logging.logback.rollingpolicy.total-size-cap:日志文件被删除之前,可以容纳的最大大小。
    • logging.logback.rollingpolicy.max-history:日志文件保存的天数。


    2.2 Logback 配置

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
        <logger name="org.springframework.web" level="DEBUG"/>
    </configuration>

    2.2.2 输出到文件

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/defaults.xml" />
        <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
        <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
        <root level="INFO">
            <appender-ref ref="FILE" />
        </root>
    </configuration>

    2.3 Log4j 配置

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

    Log4j2 的配置就比较容易了,在 reources 目录下新建 log4j2.xml 文件,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration status="warn">
        <properties>
            <Property name="app_name">logging</Property>
            <Property name="log_path">logs/${app_name}</Property>
        </properties>
        <appenders>
            <console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="[%d][%t][%p][%l] %m%n" />
            </console>
            <RollingFile name="RollingFileInfo" fileName="${log_path}/info.log"
                         filePattern="${log_path}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
                <Filters>
                    <ThresholdFilter level="INFO" />
                    <ThresholdFilter level="WARN" onMatch="DENY"
                                     onMismatch="NEUTRAL" />
                </Filters>
                <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
                <Policies>
                    <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                    <SizeBasedTriggeringPolicy size="2 MB" />
                </Policies>
                <DefaultRolloverStrategy compressionLevel="0" max="10"/>
            </RollingFile>
            <RollingFile name="RollingFileWarn" fileName="${log_path}/warn.log"
                         filePattern="${log_path}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
                <Filters>
                    <ThresholdFilter level="WARN" />
                    <ThresholdFilter level="ERROR" onMatch="DENY"
                                     onMismatch="NEUTRAL" />
                </Filters>
                <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
                <Policies>
                    <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                    <SizeBasedTriggeringPolicy size="2 MB" />
                </Policies>
                <DefaultRolloverStrategy compressionLevel="0" max="10"/>
            </RollingFile>

            <RollingFile name="RollingFileError" fileName="${log_path}/error.log"
                         filePattern="${log_path}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
                <ThresholdFilter level="ERROR" />
                <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
                <Policies>
                    <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                    <SizeBasedTriggeringPolicy size="2 MB" />
                </Policies>
                <DefaultRolloverStrategy compressionLevel="0" max="10"/>
            </RollingFile>
        </appenders>
        <loggers>
            <root level="info">
                <appender-ref ref="Console" />
                <appender-ref ref="RollingFileInfo" />
                <appender-ref ref="RollingFileWarn" />
                <appender-ref ref="RollingFileError" />
            </root>
        </loggers>
    </configuration>
    《==============》log4j

    Log4j三大组件:
    Logger:日志写出器,负责供客户端代码调用,用于输入日志信息。Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger称为Root,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法或Logger.getLogger(Class class)方法获得。

    appender:配属日志写出目的地,输出日志信息到指定位置。Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。

    Layout:控制Log信息的输出方式,也就是格式化输出的信息。
     

    log4j支持将数据输出:

    org.apache.log4j.ConsoleAppender (控制台)

    org.apache.log4j.FileAppender (文件)

    org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)

    org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个 新的文件)

    org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)

    如果需要输出日志信息到多个目的地,配置多个appender

    log4j支持数据输出格式:

    org.apache.log4j.HTMLLayout (以 HTML 表格形式布局)

    org.apache.log4j.PatternLayout (可以灵活地指定布局模式)

    org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串)

    org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)

    PatternLayout参数说明

    用户自定义日志输出格式类似于printf的输出类型,其中:

    %m 输出代码中指定的消息

       %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)






  • 相关阅读:
    java并发5-volatile关键字解析
    java并发4-单例设计方法
    Java并发3-多线程面试题
    JAVA并发2
    JAVA并发
    2015第27周三Java内存模型
    同一时候使用windows和linux系统
    深入浅出Windows BATCH
    DrawText的使用
    redmine忘记username和password
  • 原文地址:https://www.cnblogs.com/KL2016/p/16490675.html
Copyright © 2020-2023  润新知