zoukankan      html  css  js  c++  java
  • Spring Boot Logback应用日志

    日志对于应用程序来说是非常重要的,Spring框架本身集成了不少其他工具,我们自身的应用也会使用到第三方库,所以我们推荐在Spring应用中使用SLF4J/Logback来记录日志。

    SLF4J与Logback简介

    SLF4J——Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logginglog4jlogbackcommons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的binding。

    Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。

    Spring Boot Logging

    Spring Boot实现了一套日志系统——它能够根据类路径上的内容来决定使用哪一种日志框架,logback是最优先的选择。配置了logback.xml可以利用Spring Boot提供的默认日志配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/base.xml"/>
        <logger name="org.springframework.web" level="DEBUG"/>
    </configuration>

    这样就定义了一个<logger>捕获org.springframework.web的日志,日志级别是DEBUGbase.xml内容如下:

    <included>
        <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/console-appender.xml" />
        <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE" />
        </root>
    </included>

    Spring Boot的日志系统预先定义了一些系统变量:

    • ${PID},当前进程ID
    • ${LOG_FILE},Spring Boot配置文件中logging.file的值
    • ${LOG_PATH}, Spring Boot配置文件中logging.path的值

    同时默认情况下包含另个appender——一个是控制台,一个是文件,分别定义在console-appender.xmlfile-appender.xml中。同时对于应用的日志级别也可以通过application.properties进行定义:

    logging.level.org.springframework.web=DEBUG
    logging.level.org.hibernate=ERROR

    这等价于在logback.xml配置appender的日志级别。

    ConsoleAppender

    Logback使用appender来定义日志输出,在开发过程中最常用的是将日志输出到控制台:

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <Pattern>.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n</Pattern>
      </encoder>
      <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>TRACE</level>
      </filter>
    </appender>

    <encoder>表示对日志进行编码:

    • %d{HH:mm:ss.SSS}——日志输出时间
    • %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
    • %-5level——日志级别,并且使用5个字符靠左对齐
    • %logger{36}——日志输出者的名字
    • %msg——日志消息
    • %n——平台的换行符

    在这种格式下一条日志的输出结果如下:

    0:12:51.012 [qtp231719230-45] DEBUG o.c.d.r.util.LoggingResponseFilter

    RollingFileAppender

    另一种常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender用于切分文件日志:

    <appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>/data/log/app.log</File>
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <FileNamePattern>rest-demo.%d{yyyy-MM-dd}.log</FileNamePattern>
        <!-- keep 30 days' worth of history -->
        <maxHistory>30</maxHistory>         
      </rollingPolicy>
      <encoder>
        <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
      </encoder>        
    </appender>

    其中重要的是rollingPolicy的定义,上例中<FileNamePattern>rest-demo.%d{yyyy-MM-dd}.log</FileNamePattern>定义了日志的切分方式——把每一天的日志归档到一个文件中,<maxHistory>30</maxHistory>表示只保留最近30天的日志,以防止日志填满整个磁盘空间。同理,可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。

    Sentry

    Sentry是一个统一的日志跟踪平台,在传统的日志管理中,都是在服务器上通过tailvim等工具查看日志,并且不同的日志位置也个不相同,而Sentry则是将这些日志(主要是错误日志)通过统一的接口收集起来,并且提供跟踪、管理的功能,使得应用程序的错误、Bug能够即时被解决。

    Sentry提供了Java库——Raven Java,Java应用程序能够在捕获异常后将其发送到Sentry服务器中,另一方面它包含了各类日志框架的支持,以Logbakc为例:

    <dependency>
        <groupId>net.kencochrane.raven</groupId>
        <artifactId>raven-logback</artifactId>
        <version>6.0.0</version>
    </dependency>

    logback.xml中定义appender

    <configuration>
        <appender name="Sentry" class="net.kencochrane.raven.logback.SentryAppender">
            <dsn>https://publicKey:secretKey@host:port/1?options</dsn>
            <tags>tag1:value1,tag2:value2</tags>
            <!-- Optional, allows to select the ravenFactory -->
            <!--<ravenFactory>net.kencochrane.raven.DefaultRavenFactory</ravenFactory>-->
        </appender>
        <root level="warn">
            <appender-ref ref="Sentry"/>
        </root>
    </configuration>

    我们推荐在这个<appender>中加入<filter>用于过滤ERROR级别的日志。

  • 相关阅读:
    大白带你侃JAVA——封装的概述及好处
    什么是面向对象?(通俗易懂)
    方法和数组就是这么简单!
    Java开发环境不再需要配置classpath!
    Logback中使用TurboFilter实现日志级别等内容的动态修改
    Logback中如何自定义灵活的日志过滤规则
    Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题
    Spring Boot中如何扩展XML请求和响应的支持
    Spring Cloud Finchley版中Consul多实例注册的问题处理
    为Spring Cloud Config插上管理的翅膀
  • 原文地址:https://www.cnblogs.com/duyinqiang/p/5696536.html
Copyright © 2011-2022 走看看