java之springboot中的日誌

logback配置詳解:https://www.jianshu.com/p/1ded57f6c4e3

  •  
  • logback-classic:log4j的一個改良版本,同時實現了slf4j的接口;
  1. <!--這個依賴直接包含了 logback-core 以及 slf4j-api的依賴-->
    <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-classic</artifactId>
      
    </dependency>
    

     

springBoot日誌處理:日誌框架UCL、JUL、slf4j、logback、log4j;springboot默認支持的有slf4j、logback;

springboot默認幫我們配置好了,直接使用就可以了;

springboot默認的日誌級別是info,只打印info級別只之後的信息,也可以在配置文件中配置日誌級別logging.level.主配置類多所在的包=日誌級別;

吧日誌保存在文件中:要配置logging.file=保存日誌文件的位置,(相對於文件的根路徑),也可以設置絕對路徑.文件夾用logging.path=文件夾位置,並且默認的文件名叫spring.log;

修改日誌的格式:1.日誌顯示在控制檯,logging.pattern.console=%d{yyyy-MM-dd } [%thread] %-5level  %logger{50} -%msg %n;2.日誌顯示在文件中,logging.pattern.file=%d{yyyy-MM-dd } [%thread] %-5level  %logger{50} -%msg %n。

如果你即想完全掌控日誌配置,但又不想用logback.xml作爲Logback配置的名字,application.yml可以通過logging.config屬性指定自定義的名字:

logging.config=classpath:logging-config.xml

Spring Boot 的日誌支持依賴是 spring-boot-starter-logging,默認使用slf4j+logback的方式來記錄日誌.

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

在控制檯中可看到 spring boot 默認打印出的啓動日誌,不過默認的打印級別爲 INFO.Logback 支持 TRACE, DEBUG, INFO, WARN, ERROR 日誌級別,優先級關係爲 TRACE < DEBUG < INFO < WARN < ERROR , 我們可以在 application.properties 配置文件中更改打印日誌級別.

***通用修改:
logging.level.root=DEBUG
還可以指定包的日誌級別:
logging.level.org.springframework=INFO


***代碼中使用:
Logger logger= LoggerFactory.getLogger(DemoApplication.getClass());
logger.debug("debug日誌");

		logger.info("info日誌");

		logger.warn("warn日誌");

		logger.error("error日誌");


***使用屬性 logging.pattern.console 和 logging.pattern.file 可以分別自定義控制檯日誌和文件日誌的格式

#控制檯顯示日誌的格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{5}- %msg%n

#文件顯示日誌的格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm} [%thread] %-5level %logger- %msg%n

%d: 日期實踐
%thread: 線程名
%-5level:級別從左顯示5個字符寬度
%logger{5}:表示logger名字最長5個字符,否則按照句點分割。
%msg:日誌消息
%n:換行


***日誌保存(優先輸出 logging.file)
logging.path 可以指定日誌保存目錄,但不能指定輸出的文件名,且默認名爲spring.log
logging.path=/Users/HaokeMaster/Desktop/sts 
 logging.file 指定具體的路徑:
logging.file=/Users/HaokeMaster/Desktop/sts/my.log

***
# 當文件超過 10Mb 時,歸檔壓縮
logging.file.max-size=10Mb
# 日誌文件最多保存3天
logging.file.max-history=3
# 用於滾動的日誌文件名的模式
logging.pattern.rolling-file-name=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz


***

日誌服務在ApplicationContext 創建之前就被初始化了,並不是採用Spring的配置文件進行控制。

那我們來如何進行自定義配置日誌呢。springboot爲我們提供了一個規則,按照規則組織配置文件名,就可以被正確加載:

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://blog.csdn.net/weixin_38361347/article/details/86707149

<?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>

  <!-- 基於debug處理日誌:具體控制檯或者文件對日誌級別的處理還要看所在appender配置的filter,如果沒有配置filter,則使用root配置 -->
  <root level="debug">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="ERROR-OUT" />
  </root>
</configuration>

一:根節點<configuration>包含的屬性:

scan:

當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。

scanPeriod:

設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。

例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <!-- 其他配置省略-->  
</configuration>  

 

onMatch和onMismatch都有三個屬性值,分別爲Accept、DENY和NEUTRAL

分別介紹這兩個配置項的三個屬性值:

onMatch="ACCEPT" 表示匹配該級別及以上
onMatch="DENY" 表示不匹配該級別及以上
onMatch="NEUTRAL" 表示該級別及以上的,由下一個filter處理,如果當前是最後一個,則表示匹配該級別及以上
onMismatch="ACCEPT" 表示匹配該級別以下
onMismatch="NEUTRAL" 表示該級別及以下的,由下一個filter處理,如果當前是最後一個,則不匹配該級別以下的
onMismatch="DENY" 表示不匹配該級別以下的
 

 logback配置非常詳細的解釋:https://blog.csdn.net/qq_36850813/article/details/83092051

<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
<!--兩個屬性 key:標識此<timestamp> 的名字;datePattern:設置將當前時間(解析配置文件的時間)轉換爲字符串的模式,遵循java.txt.SimpleDateFormat的格式。其他地方可以引用-->
 <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/> 
   <!--  用來定義變量值的標籤,後面可以通過${app.name}使用-->-->
    <property name="log.path" value="/Users/HaokeMaster/Desktop/sts"/>
    <!-- 配置日誌的格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="%yellow%(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%line)"/>


<!-- 輸出到控制檯 -->
    <appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
        <!--  這裏的變量就是上面定義的格式 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </layout>
    </appender>
    
    <!-- 輸出到文件 -->
    <!--獲取比info級別高(包括info級別)但除error級別的日誌-->
    <appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--定義了一個過濾器,在LEVEL之下的日誌輸出不會被打印出來-->
        <!--這裏定義了INFO,也就是控制檯不會輸出比INFO級別小的日誌-->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
<!--定義輸出格式-->
        <encoder>
       
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
            <!-- 設置字符集 -->
          <charset>UTF-8</charset>
        </encoder>
 
        <!--按時間滾動日誌策略,當達到一定條件後重新生成新的日誌文件-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--定義文件滾動時的文件名的格式-->
            <fileNamePattern>${log.path}/info/%d.log</fileNamePattern>
            <!-- 日誌文件保留天數 -->
            <maxHistory>30</maxHistory>
           <!--  最大存儲 -->
           <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
    </appender>
    
    <appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
        </encoder>
        <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路徑-->
            <fileNamePattern>${log.path}/error/%d.log</fileNamePattern>
            <maxHistory>30</maxHistory>
             <!--  最大存儲 -->
           <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!-- 開發環境的日誌配置 -->
    <springProfile name="dev">
   <!--對於類路徑以 com.example.logback 開頭的Logger,輸出級別設置爲warn,並且只輸出到控制檯-->
    <!--這個logger沒有指定appender,它會繼承root節點中定義的那些appender-->
    <logger name="com.example.logback" level="warn"/>

    <!--通過 LoggerFactory.getLogger("mytest") 可以獲取到這個logger-->
    <!--由於這個logger自動繼承了root的appender,root中已經有stdout的appender了,自己這邊又引入了stdout的appender-->
    <!--如果沒有設置 additivity="false" ,就會導致一條日誌在控制檯輸出兩次的情況-->
    <!--additivity表示要不要使用rootLogger配置的appender進行輸出-->
    <logger name="mytest" level="info" additivity="false">
        <appender-ref ref="stdout"/>
    </logger>

    <!--由於設置了 additivity="false" ,所以輸出時不會使用rootLogger的appender-->
    <!--但是這個logger本身又沒有配置appender,所以使用這個logger輸出日誌的話就不會輸出到任何地方-->
    <logger name="mytest2" level="info" additivity="false"/>

    <!-- 必須有的子節點,root是默認的logger 這裏設定輸出級別是info,日誌會通過往這兩個appender裏面寫>root可以包含多個appender,標識這個appender將會添加到這個loger
    <root level="INFO">
        <appender-ref ref="CONSOLE-LOG" />
        <appender-ref ref="INFO-LOG" />
        <appender-ref ref="ERROR-LOG" />
    </root>
    </springProfile>

    
    <springProfile name="pro">
 <!-- 在com.example.config包下面打印WARN級別的日誌 -->
    <logger name="com.example" level="WARN"/>
    <root level="info">
        <appender-ref ref="CONSOLE-LOG" />
        <appender-ref ref="INFO-LOG" />
        <appender-ref ref="ERROR-LOG" />
    </root>
    </springProfile>
</configuration>

 

***依賴重複的報錯:https://blog.csdn.net/a704397849/article/details/98487404

排除spring-boot-starter-logging依賴,

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
			
		<!-- 排除包引起的衝突 -->
	<exclusions>
        <exclusion>這一個可以不排除
            <artifactId>logback-core</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
        <exclusion>這個必須排除
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
     </exclusions>
		</dependency>
  <!--全局排除spring-boot-starter-logging內的所有依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>*</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

 

如何快速正確的解決類似重複依賴的問題。

  • 1 pom.xml中選中exclusion,右鍵 -> Maven -> Show Dependencies
  • 2.crtl + f 打開搜索,然後輸入搜索內容 logback-classic或者其他需要搜索的內容.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章