springboot之旅第三篇-日誌

来源:https://www.cnblogs.com/yuanqinnan/archive/2019/04/03/10651924.html
-Advertisement-
Play Games

一、前言 日誌對於一個系統的重要性不言而喻,日誌能幫我們快速定位線上問題,市場上存在非常多的日誌框架,比較常見的有 JUL,JCL,Log4j,Log4j2,Logback、SLF4j、jboss-logging等。 spring-boot-starter-logging採用了slf4j+logba ...


一、前言

日誌對於一個系統的重要性不言而喻,日誌能幫我們快速定位線上問題,市場上存在非常多的日誌框架,比較常見的有 JUL,JCL,Log4j,Log4j2,Logback、SLF4j、jboss-logging等。

spring-boot-starter-logging採用了slf4j+logback的形式,SLF4j(Simple Logging Facade for Java)是日誌門面(日誌抽象介面),logback是日誌實現。我們開發的時候,日誌記錄方法的調用,不應該來直接調用日誌的實現類,而是調用日誌抽象層裡面的方法。

這裡我們想到一個問題,我們的系統也會依賴其他框架,比如Spring、Hibernate, 這些框架本身也存在自己的日誌框架,但我們需要做到使用slf4j進行輸出,這個可以通過適配器模式來實現的,首先我們排除原先框架使用的日誌,然後用中間包來替換原有的日誌框架,這個中間包去實現原先日誌框架的API,這樣我們只需要導入slf4j轉換包的依賴就可以解決。如圖

二、日誌使用

日誌的使用非常簡單,只要用LogFactory.getLog(getClass()) 獲取日誌,然後記錄信息。

Log log = LogFactory.getLog(getClass());
log.trace("這是trace日誌");
log.debug("這是debug日誌");
log.info("這是info日誌");
log.warn("這是warn日誌");
log.error("這是error日誌");

日誌級別由低到高,並且可以調整日誌級別,日誌就只會在這個級別以上(包括自己)的日誌生效。springboot的預設級別是info, 我們可以針對包進行調整

logging.level.com.yuanqinnan=trace

除了級別配置外,還有兩個比較重要的配置,路徑格式

路徑有兩個配置方式:

#當前項目下生成springlog.log
#logging.file=springboot.log
#完整的路徑名稱
logging.file=G:/springboot.log
#創建路徑,由springboot生成預設的文件
logging.path=G:/springlog

這兩個是衝突配置,兩個都寫的話以logging.file為主。

我們可以對日誌的輸出進行格式配置:

#在控制台輸出的日誌的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日誌輸出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n

具體參數:

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

springboot的日誌都有自己的預設文件,如果需要用自己的日誌配置,只要增加一個相同文件,那麼就會使用我們自己配置的文件。

Logging SystemCustomization
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

springboot推薦使用logback-spring.xml來進行配置。

SpringBoot的有高級Profile功能,如:

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
      可以指定某段配置只在某個環境下生效
</springProfile>

日誌的基本內容就是這些,另附上日誌的一些常用配置供參考:

<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新載入,預設值為true。
scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
debug:當此屬性設置為true時,將列印出logback內部日誌信息,實時查看logback運行狀態。預設值為false。
-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
    <!-- 定義日誌的根目錄 -->
    <property name="LOG_HOME" value="/app/log" />
    <!-- 定義日誌文件名稱 -->
    <property name="appName" value="appName"></property>
    <!-- ch.qos.logback.core.ConsoleAppender 表示控制台輸出 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--
        日誌輸出格式:
            %d表示日期時間,
            %thread表示線程名,
            %-5level:級別從左顯示5個字元寬度
            %logger{50} 表示logger名字最長50個字元,否則按照句點分割。 
            %msg:日誌消息,
            %n是換行符
        -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </layout>
    </appender>

    <!-- 滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其他文件 -->  
    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 指定日誌文件的名稱 -->
        <file>${LOG_HOME}/${appName}.log</file>
        <!--
        當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名
        TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--
            滾動時產生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進行日誌滾動 
            %i:當文件大小超過maxFileSize時,按照i進行文件滾動
            -->
            <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 
            可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每天滾動,
            且maxHistory是365,則只保存最近365天的文件,刪除之前的舊文件。註意,刪除舊文件是,
            那些為了歸檔而創建的目錄也會被刪除。
            -->
            <MaxHistory>365</MaxHistory>
            <!-- 
            當日誌文件超過maxFileSize指定的大小是,根據上面提到的%i進行日誌文件滾動 註意此處配置SizeBasedTriggeringPolicy是無法實現按文件大小進行滾動的,必須配置timeBasedFileNamingAndTriggeringPolicy
            -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日誌輸出格式: -->     
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
        </layout>
    </appender>

    <!-- 
        logger主要用於存放日誌對象,也可以定義日誌類型、級別
        name:表示匹配的logger類型首碼,也就是包的前半部分
        level:要記錄的日誌級別,包括 TRACE < DEBUG < INFO < WARN < ERROR
        additivity:作用在於children-logger是否使用 rootLogger配置的appender進行輸出,
        false:表示只用當前logger的appender-ref,true:
        表示當前logger的appender-ref和rootLogger的appender-ref都有效
    -->
    <!-- hibernate logger -->
    <logger name="com.yuanqinnan" level="debug" />
    <!-- Spring framework logger -->
    <logger name="org.springframework" level="debug" additivity="false"></logger>



    <!-- 
    root與logger是父子關係,沒有特別定義則預設為root,任何一個類只會和一個logger對應,
    要麼是定義的logger,要麼是root,判斷的關鍵在於找到這個logger,然後判斷這個logger的appender和level。 
    -->
    <root level="info">
        <appender-ref ref="stdout" />
        <appender-ref ref="appLogAppender" />
    </root>
</configuration> 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JMS消息服務介紹和使用場景 什麼是JMS JMS : Java Message Service(Java消息服務),Java平臺中關於面向消息中間件的介面. 重點在於介面,介面就意味著與JDBC類似,僅僅有聲明,沒有實現,具體的實現交給廠商. 介面本身是一種與廠商無關的API. 使用場景 每一種技 ...
  • 什麼是this this是一個const指針,存的是 當前對象 的地址,指向 當前對象 ,通過this指針可以訪問類中的所有成員。 當前對象是指正在使用的對象,比如 ,`a`就是當前對象。 關於this 1. 每個對象都有this指針,通過this來訪問自己的地址。 2. 每個成員函數都有一個指針形 ...
  • 首先是拉去鏡像(或者直接創建容器自然會拉去) 創建容器 啟動 查看日誌 可以看到由於我的伺服器只有2G記憶體導致啟動因為記憶體不足無法啟動,修改啟動的記憶體大小 重新啟動ES 測試 ...
  • // 設置 restTemplate FormHttpMessageConverter 編碼方式 @Configurationpublic class RestTemplateConfig { @Bean RestTemplate restTemplate(){ SimpleClientHttpRe ...
  • 1.XML基礎: XML全稱為eXtensible Markup Language;即可擴展標記型語言,同HTML一樣使用標簽來操作。它的可擴展性體現在標簽可以由自己定義,可以是中文標簽。 XML用途: 同HTML一樣可用於顯示數據,但是不是XML的主要用途。XML我們多用來存儲數據。 應用: 1) ...
  • 再議Java中的static關鍵字 java中的static關鍵字在很久之前的一篇博文中已經講到過了,感興趣的朋友可以參考:《Java中的static關鍵字解析》。 今天我們再來談一談static關鍵字,這次我們側重講述static關鍵字的一些使用場景和方式,以下是本文目錄大綱: 一.static關 ...
  • 1. Hystrix概念設計 1.1. 大綱 1.2. 基本的容錯模式 1.3. 斷路器模式 1.4. 艙壁隔離模式 1.5. 容錯理念 1. 凡事依賴都可能失敗 2. 凡事資源都有限制 3. 網路並不可靠 4. 延遲是應用穩定性殺手 1.6. 彈性理念 1.7. 攜程案例(2015) 1.8. D ...
  • 引言 ZooKeeper是中典型的pub/sub模式的分散式數據管理與協調框架,開發人員可以使用它進行分散式數據的發佈與訂閱。另外,其豐富的數據節點類型可以交叉使用,配合Watcher事件通知機制,可以應用於分散式都會涉及的一些核心功能:數據發佈/訂閱、Master選舉、命名服務、分散式協調/通知、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...