日志門面 | 日志實現 |
---|---|
Log4j、JUL、Log4j2、Logback |
日志門面:SLF4J
日志實現:Logback
SpringBoot:底層是Spring框架,Spring框架默認是用JCL;
SpringBoot選用SLF4J和Logback.
2、SLF4J使用
以后開發的時候,日志記錄。日志記錄方法的調用,不應直接調用日志的實現類,而是調用日志抽象層的方法。
應該給系統里倒入slf4j的jar和logback的實現jar。
1 import org.slf4j.Logger; 2 import org.slf4j.LoggerFactory; 3 4 public class HelloWorld { 5 public static void main(String[] args) { 6 Logger logger = LoggerFactory.getLogger(HelloWorld.class); 7 logger.info("Hello World"); 8 } 9 }
每一個日志的實現框架都有自己的配置文件。使用slf4j以后,配置文件還是做成日志實現框自己本身的配置文件。
3、遺留問題
框架A:
(slf4j+logback):Spring(commons-logging)、Hibernate(jboss-logging)、Mybatis、xxx
統一:統一使用slf4j+logback
如何讓系統中的日志統一到slf4j:
1、將系統中的其它日志框架先排除出去
2、用中間包來替換所有的日志框架
3、我們倒入slf4j的其它實現
日志級別:
trace > debug > info > warn > error
The following example shows potential(默認的、潛在的) logging settings in application.properties:
1 logging.level.root=WARN 2 logging.level.org.springframework.web=DEBUG 3 logging.level.org.hibernate=ERROR
日志在yml中的相關配置:
logging.level.com.itcast=info
logging.path=日志保存的位置
logging.file=D:/logging.log 日志的文件包含路徑
logging.pattern.console=console: %d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n 控制台輸出日志的格式
logging.pattern.file: %d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n 在指定文件中日志輸出格式
logging.file |
logging.path |
Example | Description |
---|---|---|---|
(none) | (none) | Console only logging. | |
Specific file | (none) | my.log |
Writes to the specified log file. Names can be an exact location or relative to the current directory. |
(none) | Specific directory | /var/log |
Writes spring.log to the specified directory. Names can be an exact location or relative to the current directory. |
Depending on your logging system, the following files are loaded:
使用springboot加載不同方式的日志實現方式,需要使用的配置文件名稱如下,存放位置在項目根目錄下,舉例logback.xml
Logging System | Customization |
---|---|
Logback | logback-spring.xml , logback-spring.groovy , logback.xml , or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
logback.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 3 scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。 4 scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒當scan為true時,此屬性生效。默認的時間間隔為1分鍾。 5 debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。 6 --> 7 <configuration scan="false" scanPeriod="60 seconds" debug="false"> 8 <!-- 定義日志的根目錄 --> 9 <property name="LOG_HOME" value="/app/log" /> 10 <!-- 定義日志文件名稱 --> 11 <property name="appName" value="atguigu-springboot"></property> 12 <!-- ch.qos.logback.core.ConsoleAppender 表示控制台輸出 --> 13 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> 14 <!-- 15 日志輸出格式: 16 %d表示日期時間, 17 %thread表示線程名, 18 %-5level:級別從左顯示5個字符寬度 19 %logger{50} 表示logger名字最長50個字符,否則按照句點分割。 20 %msg:日志消息, 21 %n是換行符 22 --> 23 <layout class="ch.qos.logback.classic.PatternLayout"> 24 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> 25 </layout> 26 </appender> 27 28 <!-- 滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件 --> 29 <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> 30 <!-- 指定日志文件的名稱 --> 31 <file>${LOG_HOME}/${appName}.log</file> 32 <!-- 33 當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名 34 TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。 35 --> 36 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 37 <!-- 38 滾動時產生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進行日志滾動 39 %i:當文件大小超過maxFileSize時,按照i進行文件滾動 40 --> 41 <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern> 42 <!-- 43 可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每天滾動, 44 且maxHistory是365,則只保存最近365天的文件,刪除之前的舊文件。注意,刪除舊文件是, 45 那些為了歸檔而創建的目錄也會被刪除。 46 --> 47 <MaxHistory>365</MaxHistory> 48 <!-- 49 當日志文件超過maxFileSize指定的大小是,根據上面提到的%i進行日志文件滾動 注意此處配置SizeBasedTriggeringPolicy是無法實現按文件大小進行滾動的,必須配置timeBasedFileNamingAndTriggeringPolicy 50 --> 51 <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 52 <maxFileSize>100MB</maxFileSize> 53 </timeBasedFileNamingAndTriggeringPolicy> 54 </rollingPolicy> 55 <!-- 日志輸出格式: --> 56 <layout class="ch.qos.logback.classic.PatternLayout"> 57 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern> 58 </layout> 59 </appender> 60 61 <!-- 62 logger主要用於存放日志對象,也可以定義日志類型、級別 63 name:表示匹配的logger類型前綴,也就是包的前半部分 64 level:要記錄的日志級別,包括 TRACE < DEBUG < INFO < WARN < ERROR 65 additivity:作用在於children-logger是否使用 rootLogger配置的appender進行輸出, 66 false:表示只用當前logger的appender-ref,true: 67 表示當前logger的appender-ref和rootLogger的appender-ref都有效 68 --> 69 <!-- hibernate logger --> 70 <logger name="com.atguigu" level="debug" /> 71 <!-- Spring framework logger --> 72 <logger name="org.springframework" level="debug" additivity="false"></logger> 73 74 75 76 <!-- 77 root與logger是父子關系,沒有特別定義則默認為root,任何一個類只會和一個logger對應, 78 要么是定義的logger,要么是root,判斷的關鍵在於找到這個logger,然后判斷這個logger的appender和level。 79 --> 80 <root level="info"> 81 <appender-ref ref="stdout" /> 82 <appender-ref ref="appLogAppender" /> 83 </root> 84 </configuration>
You need to either use logback-spring.xml
or define a logging.config
property.
使用logging-spring.xml這種方式,可以根據不同配置環境配置日志的輸出方式。
1 <springProfile name="staging"> 2 <!-- configuration to be enabled when the "staging" profile is active --> 3 </springProfile> 4 5 <springProfile name="dev, staging"> 6 <!-- configuration to be enabled when the "dev" or "staging" profiles are active --> 7 </springProfile> 8 9 <springProfile name="!production"> 10 <!-- configuration to be enabled when the "production" profile is not active --> 11 </springProfile>
案例:
1 <layout class="ch.qos.logback.classic.PatternLayout"> 2 <springProfile name="dev"> 3 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> 4 </springProfile> 5 </layout>
--------------------------------------------------------------------------------------------------------------------------------------------------------
相關文檔網頁支持:
1 1、https://docs.spring.io/spring-boot/docs/1.5.20.RELEASE/reference/htmlsingle/#howto-logging 3 2、https://www.slf4j.org/manual.html 5 3、https://www.slf4j.org/legacy.html