日志的使用

spring boot中如何配置https://blog.csdn.net/flysun3344/article/details/80555746

由于spring boot框架的特殊配置,所以无需向ssm框架一样,需要在配置文件中加载logback.xml,只要按照规范来命名就会自动加载

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

  • Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy

  • Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml

  • Log4j2:log4j2-spring.xml, log4j2.xml

  • JDK (Java Util Logging):logging.properties

配置路径:https://www.cnblogs.com/taiyonghai/p/9290641.html

java里面日志分为两部分一个门面、一个实现,我们所熟知的SLF4j、Log4j、Log4j2、Logback的日志组件slf4j是门面提供的统一的入口,具体实现由log4j、log4j2、logback来实现

log4j由于太老作者自己也不打算重构了所以放弃

log4j2是apach的一个项目很好,但支持上面略有欠缺所以放弃

logback是之前log4j的作者自己开源的一个新的log组件,做了大量的调整及优化,性能及使用性上都有很大的提高,再加上沉淀了很多年又完全实现了slf4j,所以被我们选中使用更多了解可以去它

logback的配置:https://www.jianshu.com/p/04065d8cb2a9;

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="false">
    <!-- 尽量别用绝对路径,如果带参数不同容器路径解释可能不同,以下配置参数在pom.xml里 -->
    <!--定义参数,后面可以通过${SERVER_NAME}使用-->
    <property name="SERVER_NAME" value="checkstand-service" />
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="logs" />
    <!-- 日志最大的历史 30天 -->
    <property name="MAX_HISTORY" value="30"></property>
    <!-- 日志文件大小 -->
    <property name="MAX_SIZE" value="100MB" /> <!-- 日志文件大小 -->

    <!--ConsoleAppender用于向控制台输出 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--定义控制台输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method():%L -%msg%n</Pattern>
        </encoder>
    </appender>

    <!--向文件输出日志内容的组件 日志文件输出 -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--定义日志滚动的策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--定义文件滚动时的文件名的格式-->
            <fileNamePattern>
                ${LOG_HOME}/paychstandservice.log.%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <!--设置为30天的时间周期,日志量最大20GB-->
            <maxHistory>${MAX_HISTORY}</maxHistory>
        </rollingPolicy>
        <!--定义输出格式-->
        <encoder>
            <pattern>%-20(%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread]) %-5level %logger{80} - %msg%n</pattern>
        </encoder>
    </appender>



    <!--root是默认的logger 这里设定输出级别是info,这个的作用是为下面的logger默认了引用配置的appender-->
    <!--当additivity="true"时,在默认引用,additivity="false"时则不引用-->
    <root level="info">
        <appender-ref ref="stdout" />
    </root>
    <!--如下面 additivity="true时,则会上面配置的<appender-ref ref="stdout" />也会对我生效-->
   <logger name="com.asiainfo.checkstand.core" level="info" additivity="true">
       <!--配置引用哪个appender-->
        <appender-ref ref="file" />
    </logger>
    <logger name="org.springframework" level="info" additivity="false">
        <appender-ref ref="stdout" />
    </logger>
    <logger name="com.asiainfo.checkstand.core.dao" level="TRACE" additivity="true">
        <appender-ref ref="file" />
    </logger>

</configuration>

配置详解

configuration节点相关属性

属性名称默认值介绍
debug false 要不要打印 logback内部日志信息,true则表示要打印。建议开启
scan true 配置发送改变时,要不要重新加载
scanPeriod 1 seconds 检测配置发生变化的时间间隔。如果没给出时间单位,默认时间单位是毫秒

configuration子节点介绍

1. contextName节点

设置日志上下文名称,后面输出格式中可以通过定义 %contextName 来打印日志上下文名称

2.property节点

用来设置相关变量,通过key-value的方式配置,然后在后面的配置文件中通过 ${key}来访问

3.appender 节点

日志输出组件,主要负责日志的输出以及格式化日志。常用的属性有name和class

属性名称默认值介绍
name 无默认值 appender组件的名称,后面给logger指定appender使用
class 无默认值 appender的具体实现类。常用的有 ConsoleAppender、FileAppender、RollingFileAppender

ConsoleAppender:向控制台输出日志内容的组件,只要定义好encoder节点就可以使用。

FileAppender:向文件输出日志内容的组件,用法也很简单,不过由于没有日志滚动策略,一般很少使用

RollingFileAppender:向文件输出日志内容的组件,同时可以配置日志文件滚动策略,在日志达到一定条件后生成一个新的日志文件。

appender节点中有一个子节点filter,配置具体的过滤器,比如上面的例子配置了一个内置的过滤器ThresholdFilter,然后设置了level的值为DEBUG。这样用这个appender输出日志的时候都会经过这个过滤器,日志级别低于DEBUG的都不会输出来。

在RollingFileAppender中,可以配置相关的滚动策略,具体可以看配置样例的注释。

4.logger以及root节点

root节点和logger节点其实都是表示Logger组件。个人觉的可以把他们之间的关系可以理解为父子关系,root是最顶层的logger,正常情况getLogger("name/class")没有找到对应logger的情况下,都是使用root节点配置的logger。

如果配置了logger,并且通过getLogger("name/class")获取到这个logger,输出日志的时候,就会使用这个logger配置的appender输出,同时还会使用rootLogger配置的appender。我们可以使用logger节点的additivity="false"属性来屏蔽rootLogger的appender。这样就可以不使用rootLogger的appender输出日志了。

关于logger的获取,一般logger是配置name的。我们再代码中经常通过指定的CLass来获取Logger,比如这样LoggerFactory.getLogger(Test.class);,其实这个最后也是转成对应的包名+类名的字符串com.kongtrio.Test.class。假设有一个logger配置的那么是com.kongtrio,那么通过LoggerFactory.getLogger(Test.class)获取到的logger就是这个logger。

也就是说,name可以配置包名,也可以配置自定义名称。

原文地址:https://www.cnblogs.com/cherishforchen/p/11396502.html