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级别的日志。

  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/duyinqiang/p/5696534.html
Copyright © 2011-2022 走看看