zoukankan      html  css  js  c++  java
  • 十四、Spring Boot 日志记录 SLF4J

    在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了。 
    其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增加资源的消耗。 
    而Log4j 更为灵活在性能上也相比 System.out 要高,我们可以配置输出级别,可以指定多个日志文件分别记录不同的日志。 
    使用 System.out 是在当前线程执行的,写入文件也是写入完毕后才继续执行下面的程序。而使用Log工具不但可以控制日志是否输出,怎么输出,它的处理机制也是通知写日志,继续执行后面的代码不必等日志写完。 
    如非必要,建议大家不要使用控制台输出,因为控制台输出没有优先级会显得输出太乱。

    个人推荐使用 SLF4J(Simple Logging Facade For Java)的logback来输出日志,其比log4j 要好,因为他效率更高。

    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>

    这样就定义了一个 捕获 org.springframework.web 的日志,日志级别是 DEBUG,上面引用的base.xml 文件内容为:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!--
    Base logback configuration provided for compatibility with Spring Boot 1.1
    -->
    
    <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的日志系统预先定义了一些系统变量:

    PIDID{LOG_FILE},Spring Boot配置文件(application.properties|.yml)中logging.file的值 
    ${LOG_PATH}, Spring Boot配置文件中logging.path的值 
    同时默认情况下包含另个appender——一个是控制台,一个是文件,分别定义在console-appender.xml和file-appender.xml中。同时对于应用的日志级别也可以通过application.properties进行定义:

    logging.level.org.springframework.web=DEBUG
    logging.level.org.springboot.sample=TRACE

    这样相当于我们在logback.xml 中配置的对应的日志级别。名称以logging.level开头,后面跟要输入日志的包名。

    * 如果在 logback.xml 和 application.properties 中定义了相同的配置(如都配置了 org.springframework.web)但是输出级别不同,则实际上 application.properties 的优先级高于 logback.xml *

    我们既然使用了maven来管理项目,我们就可以根据不同环境来定义不同的日志输出,在 logback-spring.xml 中使用 springProfile 节点来定义,方法如下: 
    注意文件名称不是logback.xml,想使用spring扩展profile支持,要以logback-spring.xml命名

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

    如上我们默认为 org.springboot.sample 定义了TRACE级别的输出,下面又定义两个 springProfile ,分别是 dev 和 staging,输出级别分别是 DEBUG 和 INFO 
    我们可以启动服务的时候指定 profile (如不指定使用默认),如指定staging 的方式为:

     java -jar myapp.jar --spring.profiles.active=staging

    下面介绍两种常用的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> 

    表示对日志进行编码

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

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

     10:12:51.012 [threadName] 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的定义,上例中rest-demo.%d{yyyy-MM-dd}.log定义了日志的切分方式——把每一天的日志归档到一个文件中,30表示只保留最近30天的日志,以防止日志填满整个磁盘空间。同理,可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。

    Sentry

    Sentry是一个统一的日志跟踪平台,在传统的日志管理中,都是在服务器上通过tail, vim等工具查看日志,并且不同的日志位置也个不相同,而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>

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

    总结

    在Spring Boot 中记录日志只需两步: 
    1、在 src/main/resources 下面创建logback.xml 文件,并按上面讲述的进行配置。 
    或者使用最简单的方法在 application 配置文件中配置。 
    2、在Java代码中创建实例,并在需要输出日志的地方使用。

    // 在Java类中创建 logger 实例
    private static final Logger logger = LoggerFactory.getLogger(SpringBootSampleApplication.class);
    // 在方法中使用日志输出,如
    public void logTest() {
        logger.debug("日志输出测试 Debug");
        logger.trace("日志输出测试 Trace");
        logger.info("日志输出测试 Info");
    }
  • 相关阅读:
    Java和.NET(C#)的开发用到的技术对比总结
    Sql 调优总结
    10分钟开发 GPS 应用,了解一下
    windows 命令行操作 Mysql 数据库
    【C# 复习总结】类、继承和接口
    【C#复习总结】探究各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字
    【C#复习总结】析构函数
    【C#复习总结】垃圾回收机制(GC)2
    【C#复习总结】垃圾回收机制(GC)1
    设计原则总结
  • 原文地址:https://www.cnblogs.com/chenliangcl/p/7346275.html
Copyright © 2011-2022 走看看