日志框架是任何一套系統中不可獲取的部分,我們需要通過日志來記錄用戶的有效操作。
JUL: JDK 自帶的Logging
(實現太過簡陋,對開發者不友好)
JCL: Jakarta Commons Loggin(Apache)
()
Log4j:
(作者是ceki,Log4j是作者選擇放棄而推薦Logback)
Log4j2:
(Apache,過於先進,開源框架對其支持有限,最大的優勢是高於Log4j的超高性能)
Logback:
(作者是
ceki
,真正意義上的Log4j2)
SLF4j:
(作者是
ceki
,
jboss-logging:
(誕生之初就不是為了服務大眾,也沒有收到青睞)
簡單的日志示例
一個簡單的日志示例:
import org.slf4j.Logger; @RunWith(SpringRunner.class) // 指定上下文,讓日志運行於Spring環境 @SpringBootTest public class LoggerTest { private final Logger logger = LoggerFactory.getLogger(LoggerTest.class); @Test public void test1() { logger.debug("debug..."); logger.info("info..."); logger.error("error..."); } }
輸出結果:
之所以沒有打印debug的內容是因為系統默認打印info以上的內容,那么系統有哪些層級呢?
查看系統的層級
ctrl + N (windows) 查找類:
從上面的代碼我們可以看到我們需要用到LoggerFactory.getLogger(類名),才能讓輸出的時候打印出本類的類名。這樣每次都要配置就非常麻煩,那么我們可以借助一個小插件,來優化這個過程。
lombok插件 —— 這個插件不僅可以幫我們簡化getter,setter方法的編寫,還能幫我們減少很多代碼的編寫,也能幫助我們優化日志的使用,具體安裝及配置見如下連接:
lombok在idea中安裝以及使用
利用lombok優化后,代碼如下:
@RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class LoggerTest { @Test public void test1() { String name = "imooc"; String password = "123456"; log.debug("debug..."); log.info("info..."); log.info("name: {}, password: {}", name, password); log.error("error..."); } }
運行結果如下:
Logback的配置
通過修改Logback的配置,可以個性化完成我們的日志需求,也能實現上面講過的各種功能。
配置的Logback的文件
appilcation.yml (配置簡單,功能簡單)
logback-spring.xml
(配置復雜,功能強大)
假設我們有以下兩個需求:
區分info和error日志
每天產生一個日志文件
具體配置過程
配置application.yml
logging:
pattern:
# console: "%d - %msg%n" # 指定控制到輸出格式,但日志文件可以看到詳細信息
# path: /var/log/tomcat/ # 指定輸出路徑
file: /var/log/tomcat/sell.log #指定輸出文件
level: debug #指定日志級別
level:
com.dante.imooc.sell.LoggerTest: debug #指定某一類的日志級別
application.yml只能簡單的配置一些指定路徑,如果我們需要完成更復雜的目標,就需要更詳細的配置。
配置logback-spring.xml指定不同level的日志到不同的文件,並且按時間滾動。
1.resources目錄下新建logback-spring.xml文件
2.進行日志輸出配置,配置示例如下:
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> <Layout class="ch.qos.logback.classic.PatternLayout"> <pattern> %d - %msg%n </pattern> </Layout> </appender> <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <!--禁止--> <onMatch>DENY</onMatch> <!--接受--> <onMismatch>ACCEPT</onMismatch> <!--命中ERROR就DENY,沒有命中ERROR就ACCEPT--> <!--filter三種操作,DENY(禁止),NEUTRAL(中立),ACCEPT(接受): 分別對應拒絕,忽略,接受--> </filter> <encoder> <pattern> %msg%n </pattern> </encoder> <!--滾動策略--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路徑--> <fileNamePattern>/var/log/tomcat/sell/info.%d.log</fileNamePattern> </rollingPolicy> </appender> <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> </encoder> <!--滾動策略--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路徑--> <fileNamePattern>/var/log/tomcat/sell/error.%d.log</fileNamePattern> </rollingPolicy> </appender> <root level="info"> <appender-ref ref="consoleLog"/> <appender-ref ref="fileInfoLog"/> <appender-ref ref="fileErrorLog"/> </root> </configuration>
3.關於配置的細節可以參照依賴庫“
org.springframework.boot.logging.logback”的下列文件:
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>
defaults.xml <?xml version="1.0" encoding="UTF-8"?> <!-- Default logback configuration provided for import, equivalent to the programmatic initialization performed by Boot --> <included> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <appender name="DEBUG_LEVEL_REMAPPER" class="org.springframework.boot.logging.logback.LevelRemappingAppender"> <destinationLogger>org.springframework.boot</destinationLogger> </appender> <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/> <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/> <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/> <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/> <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/> <logger name="org.crsh.plugin" level="WARN"/> <logger name="org.crsh.ssh" level="WARN"/> <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/> <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/> <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="WARN"/> <logger name="org.springframework.boot.actuate.endpoint.jmx" additivity="false"> <appender-ref ref="DEBUG_LEVEL_REMAPPER"/> </logger> <logger name="org.thymeleaf" additivity="false"> <appender-ref ref="DEBUG_LEVEL_REMAPPER"/> </logger> </included>
file-appender.xml <?xml version="1.0" encoding="UTF-8"?> <!-- File appender logback configuration provided for import, equivalent to the programmatic initialization performed by Boot --> <included> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> <file>${LOG_FILE}</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>${LOG_FILE}.%i</fileNamePattern> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> </included>
console-appender.xml <?xml version="1.0" encoding="UTF-8"?> <!-- Console appender logback configuration provided for import, equivalent to the programmatic initialization performed by Boot --> <included> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender> </included>
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
