美文网首页
4.springboot 与日志

4.springboot 与日志

作者: MlLance | 来源:发表于2020-03-21 11:37 被阅读0次

    学习记录,仅供参考

    异步输出

    自动归档

    日志级别:

    • 所有支持的日志系统可以在springboot设置的记录器级别Environment(例如,application.properties通过使用)logging.level.<logger-name>=<level>,其中level为TRACE,DEBUG,INFO,WARN,ERROR,FATAL或OFF之一。该root记录器可以通过使用被配置logging.level.root。

    以下示例显示了中的潜在日志记录设置application.properties:

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

    也可以使用环境变量来设置日志记录级别。例如,LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG将设置org.springframework.web为DEBUG。

    日志门面(日志的抽象层):

    JCL(Jakarta commons logging) SLF4J(simple logging facade for java) jboss-logging
    日志实现:log4j JUL(java,util.logging) log4j2 logback
    使用:选择一个日志门面以及一个日志实现.例如slf4j 和 logback,
    SpringBoot使用的是JCL,SpringBoot默认使用的是SLF4J和logback;

    使用过程

    pom

    <dependency>
               <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
     </dependency>
    

    code

        Logger logger = LoggerFactory.getLogger(StudyController.class);
     @GetMapping("/testmyConfiguration")
        public String getTest1()
        {
            logger.trace("trade 級別1");
            logger.debug("debug 級別2");
            logger.info("info 級別3");
            logger.warn("warn 級別4");
            logger.error("error 級別5");
            return testProperties.getName();
        }
    

    配置

    我们可以在application.properties中指定日志的级别,需要加上当前的包名和类名,
    例如logging.level.com.study=trace
      默认配置:
      logging.file     logging.path    example    description
      none        none                只在控制台输出
      指定文件名      none        my.log      日志输出到my.log文件中
      none        指定目录      /var/log     输出当指定目录的spring.log文件中

    #指定当前类的日志级别
     2 logging.level.com.skukuqi=trace
     3 #当前项目下生成日志
     4 #logging.file=mylog.log
     5 #指定路径
     6 #logging.file=C:/Users/Administrator/Desktop/mylog.log
     7 #指定目录
     8 logging.path=C:/spring/log
     9 #指定在控制台输出的日志的格式 默认:时间 级别 线程ID --- 主线程  全类名 :内容 -5level 级别从左显示5个宽度
    10 logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} -%msg%n
    11 #指定文件中日志输出的格式
    12 logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} === [%thread] === %-5level === %logger{50} === %msg%n
    

    指定日志文件和日志profile功能(待学习)

    在类路径下放上每个日志框架自己的配置文件即可,SpringBoot就不使用他默认的自动配置了.以下给出默认配置的修改命名规范

    • Logback: logback-spring.xml logback-spring.groovy logback.xml logback.groovy
    • Log4j2 : log4j2-spring.xml log4j2.xml
    • jdk java util logging : logging.properties

    profile 功能:

    logback.xml:直接就被日志框架识别了.
    logback-spring.xml:日志框架不会直接识别,有springBoot加载,这样就可以使用到springProfile标签某段配置只在某个环境中生效

    <springProfile name="staging">
        <!-- configuration to be enabled when the "staging" profile is active -->
    </springProfile>
    
    <springProfile name="dev | staging">
        <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
    </springProfile>
    
    <springProfile name="!production">
        <!-- configuration to be enabled when the "production" profile is not active -->
    </springProfile>
    

    logback.xml:

     1 <!--scan:
     2 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
     3 scanPeriod:
     4 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
     5 debug:
     6 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
     7 <configuration scan="false" scanPeriod="60 seconds" debuf="false">
     8     <!--定义日志的根目录-->
     9     <property name="LOG_HOME" value="/app/log"/>
    10     <!--定义日志文件名称-->
    11     <property name="appName" value="skykuqi_springboot_logging"/>
    12     <!--ch.qos.logback.core.ConsoleAppender 表示控制台输出-->
    13     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    14         <!--日志输出格式:
    15             %d:表示日期时间;
    16             %thread:表示线程名;
    17             %-5level:级别从左显示5个字符宽度;
    18             %logger{50}:表示logger名字最长50个字符,否则按照句点分隔;
    19             %msg:日志消息;
    20             %n:换行
    21         -->
    22         <layout class="ch.qos.logback.classic.PatternLayout">
    23             <springProfile name="test">
    24                 <pattern>%d{HH:mm:ss} --- [%thread] --- %-5level %logger{36} - %msg%n</pattern>
    25             </springProfile>
    26             <springProfile name="!test">
    27                 <pattern>%d{HH:mm:ss} === [%thread] === %-5level %logger{36} - %msg%n</pattern>
    28             </springProfile>
    29         </layout>
    30     </appender>
    31     <!--日志文件最大的大小-->
    32     <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    33         <MaxFileSize>10MB</MaxFileSize>
    34     </triggeringPolicy>
    35     <!-- 日志输出级别 -->
    36     <root level="INFO">
    37         <appender-ref ref="STDOUT"/>
    38     </root>
    39 </configuration
    

    切换日志框架

    日志门面SLFJ + 具体实现(SLFJ集成相应的jar,以集成其他日志框架系统)
    当你需要替换其他日志框架,只需要去掉其他日志包,引入对应springboot的日志starter

    slf4j支持日志.png

    看spring-boot-start-logging 底层的依赖为logback-classic,log4j-to-slf4j,jul-to-slf4j,所以有相应的日志集成包,同一由slf4j 日志门面调用

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </dependency>
    
    <dependencies>
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.2.3</version>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-to-slf4j</artifactId>
          <version>2.12.1</version>
          <scope>compile</scope>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jul-to-slf4j</artifactId>
          <version>1.7.30</version>
          <scope>compile</scope>
        </dependency>
      </dependencies>
    

    使用logback使用需要和slf4j一起使用,所以总共需要添加依赖的包有slf4j-api.jar,logback-core.jar,logback-classic.jar,logback-access.jar这个暂时用不到所以不添加依赖了
    看springboot依赖:


    image.png image.png
    jul-to-slf4j&log4j-to-slf4j:
    slf4j:https://blog.csdn.net/yangzl2008/article/details/81503579 image.png image.png image.png
    image.png

    转换图:


    image.png
    实现:
    如何让系统中所有的日志都统一到slf4j

    1.将系统中其他日志框架先排除出去
    2.用中间包来替换原有的日志框架;
    3.我们导入slf4j其他的实现

    <configuration scan="false" scanPeriod="60 secondes" debuf="false" >
        <!--    定义日子的根目录-->
    <!--    <property name="LOG_HOME" value="/app/log"></property>-->
    <!--&lt;!&ndash;    定义日志文件名称&ndash;&gt;-->
    <!--    <property name="appName" value="lance_study_springboot_logging"></property>-->
        <!--ch.qos.logback.core.ConsoleAppender 表示控制台输出-->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!--        <layout class="ch.qos.logback.classic.PatternLayout">-->
    <!--            <springProfile name="prod">-->
    <!--            <pattern>-->
    <!--                %d{yyyy-MM-dd HH:mm:ss} === [%thread] === %-5level === %logger{50} === %msg%n-->
    <!--&lt;!&ndash;                %date [%thread] %-5level %logger{36} - %msg%n&ndash;&gt;-->
    <!--            </pattern>-->
    <!--            </springProfile>-->
    <!--        </layout>-->
            <encoder>
                <pattern>%date [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <appender name="lancetestlog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${Lance.HOME}/logs/cs4DomSsm/cs4DomSsm-gvvmcAssociateVoyage.log</file>
    <!--  日志文件分割个数-->
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <fileNamePattern>${Lance.HOME}/logs/cs4DomSsm/cs4DomSsm-gvvmcAssociateVoyage.log.%i</fileNamePattern>
                <minIndex>1</minIndex>
                <maxIndex>10</maxIndex>
            </rollingPolicy>
            <!--日志文件最大的大小-->
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>50MB</maxFileSize>
            </triggeringPolicy>
            <encoder>
                <pattern>%date [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <!-- 日志输出级别 -->
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
        </root>
    
       <!--  在对应的com.study包下输出设定level的log,例如info,会把info,warn,error -->
        <logger name="com.study" level="INFO" additivity="false">
                <appender-ref ref="lancetestlog" />
            </logger>
    </configuration>
    

    file2:logback

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <!-- 控制台打印日志的相关配置 --> 
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
        <!-- 日志格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%level] - %m%n</pattern>
        </encoder>
        <!-- 日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <!-- 过滤的级别 -->
          <level>WARN</level>
          <!-- 匹配时的操作:接收(记录) -->
          <onMatch>ACCEPT</onMatch>
          <!-- 不匹配时的操作:拒绝(不记录) -->
          <onMismatch>DENY</onMismatch>
        </filter>
      </appender>
      
      <!-- 文件保存日志的相关配置 --> 
      <appender name="ERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!-- 保存日志文件的路径 -->
        <file>logs/error.log</file>
        <!-- 日志格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n</pattern>
        </encoder>
        <!-- 日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <!-- 过滤的级别 -->
          <level>ERROR</level>
          <!-- 匹配时的操作:接收(记录) -->
          <onMatch>ACCEPT</onMatch>
          <!-- 不匹配时的操作:拒绝(不记录) -->
          <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <!-- 日志文件名格式 -->
          <fileNamePattern>error.%d{yyyy-MM-dd}.log</fileNamePattern>
          <!-- 最大保存时间:30天-->
          <maxHistory>30</maxHistory>
        </rollingPolicy>
      </appender>
      
      <!-- 基于dubug处理日志:具体控制台或者文件对日志级别的处理还要看所在appender配置的filter,如果没有配置filter,则使用root配置 -->
      <root level="debug">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="ERROR-OUT" />
      </root>
    </configuration>
    

    详细file3:logback

    <!--        scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。-->
    <!--            scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
    <!--            debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <!--    用来定义变量值,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。-->
        <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
        <property name="APP_Name" value="/home" />
        <!--     子节点<contextName>:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。  -->
        <contextName>${APP_Name}</contextName>
        <!-- 控制台打印日志的相关配置 -->
        <!--    负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名-->
        <!--    控制台输出-->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <!-- 日志格式 -->
            <encoder>
                <pattern>%date [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
            <!-- 日志级别过滤器 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <!-- 过滤的级别 -->
                <level>ERROR</level>
                <!-- 匹配时的操作:接收(记录) -->
                <onMatch>ACCEPT</onMatch>
                <!-- 不匹配时的操作:拒绝(不记录) -->
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!-- 文件保存日志的相关配置 -->
        <!--    RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点-->
        <appender name="lancetestlog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--        FileAppender:把日志添加到文件,有以下子节点:-->
            <!--              <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。-->
            <!--              <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。-->
            <!--              <encoder>:对记录事件进行格式化。(具体参数稍后讲解 )-->
            <!--              <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。-->
            <!-- 保存日志文件的路径 -->
            <file>${APP_Name}/logs/error.log</file>
            <!-- 日志格式 -->
            <encoder>
                <pattern>%date [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
    
            <!-- 日志级别过滤器 -->
            <!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
            <!--            &lt;!&ndash; 过滤的级别 &ndash;&gt;-->
            <!--            <level>TRACE</level>-->
            <!--            &lt;!&ndash; 匹配时的操作:接收(记录) &ndash;&gt;-->
            <!--            <onMatch>ACCEPT</onMatch>-->
            <!--            &lt;!&ndash; 不匹配时的操作:拒绝(不记录) &ndash;&gt;-->
            <!--            <onMismatch>DENY</onMismatch>-->
            <!--        </filter>-->
    
            <!--        当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类-->
    <!--        最新的log会在error.lgo-->
                    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                        <fileNamePattern>${APP_Name}/logs/error.log.%i</fileNamePattern>
                        <minIndex>1</minIndex>
                        <maxIndex>5</maxIndex>
                    </rollingPolicy>
                    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                        <maxFileSize>5MB</maxFileSize>
                    </triggeringPolicy>
    
    
            <!--         循环政策:基于时间创建日志文件 不能与<file>标签一起使用-->
    <!--        配置表示每天生成一个日志文件,保存7天的日志文件。-->
    <!--        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
    <!--            &lt;!&ndash; 日志文件名格式 &ndash;&gt;-->
    <!--            <fileNamePattern>${APP_Name}/logs/error.%d{yyyy-MM-dd}.log</fileNamePattern>-->
    <!--            &lt;!&ndash; 最大保存时间:7天&ndash;&gt;-->
    <!--            <maxHistory>7</maxHistory>-->
    <!--        </rollingPolicy>-->
        </appender>
    
        <!-- 基于dubug处理日志:具体控制台或者文件对日志级别的处理还要看所在appender配置的filter,如果没有配置filter,则使用root配置 -->
        <root level="TRACE">
            <appender-ref ref="STDOUT"/>
            <!--        <appender-ref ref="ERROR-OUT" />-->
        </root>
        <!--  在对应的包下输出设定level的log,例如info,会把info,warn,error -->
    <!--    子节点<loger>:用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。<loger>仅有一个name属性,一个可选的level和一个可选的additivity属性。
    可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger ;additivity: 是否向上级loger传递打印信息。默认是true。-->
        <logger name="com.study" level="INFO" additivity="false">
            <appender-ref ref="lancetestlog"/>
            <!--        是否控制台输出-->
            <!--            <appender-ref ref="STDOUT" />-->
        </logger>
    <!--常用logger配置-->
        <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
        <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
        <logger name="org.hibernate.SQL" level="DEBUG" />
        <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
        <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
    
        <!--myibatis log configure-->
        <logger name="com.apache.ibatis" level="TRACE"/>
        <logger name="java.sql.Connection" level="DEBUG"/>
        <logger name="java.sql.Statement" level="DEBUG"/>
        <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    
    </configuration>
    

    切换使用 log4j

    1.更改pom文件:
    在创建 SpringBoot 工程时,我们引入了 spring-boot-starter,其中包含了 spring-boot-starter-logging ,该依赖内容就是 SpringBoot 默认的日志框架 Logback ,所以我们在引入 log4j 之前,需要先排除该包的依赖,再引入 log4j 的依赖。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</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-log4j</artifactId>
    </dependency>
    

    之后我们可以使用 application.properties,其中的配置项之前有说,同样也是适用 Log4J 的。
    如果需要更高级的配置选择,必须要添加 Log4j 的配置文件了。我们在 classpath 的 resources下新建 log4j.properties 文件,这里简单示例一下:

    # 日志级别,日志追加程序列表...
    log4j.rootLogger=DEBUG,ServerDailyRollingFile,stdout
    #文件保存日志
    log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
    #文件保存日志日期格式
    log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd_HH
    #文件保存日志文件路径
    log4j.appender.ServerDailyRollingFile.File=/mnt/lunqi/demo/log4j.log
    #文件保存日志布局程序
    log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout
    #文件保存日志布局格式
    log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n
    #文件保存日志需要向后追加(false是测试的时候日志文件就清空,true的话就是在之前基础上往后写)
    log4j.appender.ServerDailyRollingFile.Append=false
    #控制台日志
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    #控制台日志布局程序
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    #控制台日志布局格式
    log4j.appender.stdout.layout.ConversionPattern=%d yyyy-MM-dd HH:mm:ss %p [%c] %m%n
    

    切换使用 log4j 引用于 作者:Lunqi
    链接:https://www.jianshu.com/p/969e47cefa78

    总结:

    • springboot 默认使用SLF4J + logback
    • 日志文件会在10Mb大小的时候被截断,产生新的日志文件,默认级别为:ERROR、WARN、INFO,并且与控制台输出一样,默认情况下会记录ERROR-level,WARN-level和INFO-level消息。可以使用该logging.file.max-size属性更改大小限制。除非logging.file.max-history已设置该属性,否则默认情况下将保留最近7天的轮转日志文件。日志档案的总大小可以使用设置上限logging.file.total-size-cap。当日志归档的总大小超过该阈值时,将删除备份。要在应用程序启动时强制清除日志存档,请使用该logging.file.clean-history-on-start属性
    • SpringBoot也把其他的日志都替换成了slf4j;
    • 如果我们要引入其他的框架,一定要把这个框架的默认日志依赖移除掉.
      使用介绍:https://blog.csdn.net/Stitch__/article/details/88377310
      日志管理:https://www.jianshu.com/p/969e47cefa78
      logback 官方文档: http://logback.qos.ch/documentation.html

    学习记录中......

    相关文章

      网友评论

          本文标题:4.springboot 与日志

          本文链接:https://www.haomeiwen.com/subject/yxfyyhtx.html