1. 程式人生 > >使用logback實現日誌記錄

使用logback實現日誌記錄

在開發中列印內容,使用 System.out.println() 和 Log4j 應當是人人皆知的方法了。  其實在開發中我們不建議使用 System.out 因為大量的使用 System.out 會增加資源的消耗。  而Log4j 更為靈活在效能上也相比 System.out 要高,我們可以配置輸出級別,可以指定多個日誌檔案分別記錄不同的日誌。  使用 System.out 是在當前執行緒執行的,寫入檔案也是寫入完畢後才繼續執行下面的程式。而使用Log工具不但可以控制日誌是否輸出,怎麼輸出,它的處理機制也是通知寫日誌,繼續執行後面的程式碼不必等日誌寫完。  如非必要,建議大家不要使用控制檯輸出,因為控制檯輸出沒有優先順序會顯得輸出太亂。
個人推薦使用 SLF4J(Simple Logging Facade For Java)的logback來輸出日誌,Logback是log4j框架的作者開發的新一代日誌框架,它效率更高、能夠適應諸多的執行環境,同時天然支援SLF4J。 本章概要 1、原始碼概要; 2、通過預設配置實現日誌記錄; 3、配置不同環境下的日誌等級應用; 4、控制檯日誌輸出; 5、檔案日誌輸出; 6、war包部署嚴重; 7、不同部署環境下生成日誌檔案路徑; 8、高階特性非同步記錄; 9、日誌輸出儲存至DB(兩種配置連線方式); 先跟蹤下springboot預設的配置,在sprint-boot-1.4.0.RELEASE.jar包下,如下截圖,

其中,自定義的配置檔案路徑通過檢視原始碼如下(在DefaultLogbackConfiguration下也有部分預設屬性設定):
下面給出實踐案例: 1、採用SpringBoot預設配置: <?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <logger name="org.springframework.web" level="DEBUG"/> <logger name="com.shf.springboot" level="DEBUG"/>
</configuration> 注:紅色部分為自定義的需要日誌記錄的包路徑。 以上可以include預設的日誌記錄配置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> Spring Boot的日誌系統預先定義了一些系統變數: PID,當前程序ID{LOG_FILE},Spring Boot配置檔案(application.properties|.yml)中logging.file的值  ${LOG_PATH}, Spring Boot配置檔案中logging.path的值  同時預設情況下包含另個appender——一個是控制檯,一個是檔案,分別定義在console-appender.xml和file-appender.xml中。同時對於應用的日誌級別也可以通過application.properties進行定義: logging.level.org.springframework.web=DEBUGlogging.level.org.springboot.sample=TRACE 這樣相當於我們在logback.xml 中配置的對應的日誌級別。名稱以logging.level開頭,後面跟要輸入日誌的包名。 * 如果在 logback.xml 和 application.properties 中定義了相同的配置(如都配置了 org.springframework.web)但是輸出級別不同,則實際上 application.properties 的優先順序高於 logback.xml * 2、在之前的啟動自執行程式碼中新增如下測試程式碼: logger.debug(">>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作<<<<<<<<<<<<<"); logger.debug(">>>>>>>>>>>>>>>111111111111111111111111111111<<<<<<<<<<<<<"); 啟動服務驗證:
3、之前也進行實踐,在springboot中,我們可以根據不同環境來定義一些引數的設定等,那麼此時我們可以設定不同的日誌輸出,在 logback-spring.xml 中使用 springProfile 節點來定義,方法如下:  注意檔名稱不是logback.xml,想使用spring擴充套件profile支援,要以logback-spring.xml命名: 3.1、首先修改啟動類中日誌的列印如下: logger.debug("DEBUG>>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作<<<<<<<<<<<<<"); logger.debug("DEBUG>>>>>>>>>>>>>>>111111111111111111111111111111<<<<<<<<<<<<<"); logger.info("INFO>>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作<<<<<<<<<<<<<"); logger.info("INFO>>>>>>>>>>>>>>>111111111111111111111111111111<<<<<<<<<<<<<"); 3.2、建立logback-spring.xml配置: <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <logger name="org.springframework.web" level="DEBUG"/> <logger name="com.shf.springboot" level="TRACE"/> <springProfile name="production"> <logger name="com.shf.springboot" level="DEBUG" /> </springProfile> <springProfile name="dev"> <logger name="com.shf.springboot" level="INFO" /> </springProfile> </configuration> 3.3、此時我們設定的dev環境下僅列印INFO級別的日誌:
3.4、我們簡單的修改下配置,我們列印日誌級別設定為DEBUG: <springProfile name="production"> <logger name="com.shf.springboot" level="INFO" /> </springProfile> <springProfile name="dev"> <logger name="com.shf.springboot" level="DEBUG" /> </springProfile>
淺析: 1、根據3.3和3.4兩次的實驗驗證說明,我們克薏發現配置的springProfile 生效,會在不同的環境下應用不同的level; 2、此時我們用到了DEBUG和INFO兩個級別的設定,DEBUG級別低於INFO,故DEBUG下能夠列印INFO級別資訊。( Logger可以被分配級別。級別包括:TRACE、DEBUG、INFO、WARN和ERROR,定義於ch.qos.logback.classic.Level類。程式會列印高於或等於所設定級別的日誌,設定的日誌等級越高,打印出來的日誌就越少。如果設定級別為INFO,則優先順序高於等於INFO級別(如:INFO、 WARN、ERROR)的日誌資訊將可以被輸出,小於該級別的如DEBUG將不會被輸出。為確保所有logger都能夠最終繼承一個級別,根logger總是有級別,預設情況下,這個級別是DEBUG。) 4、ConsoleAppender:控制檯輸出是最常見的日誌輸出方式 4.1、配置logback-spring.xml如下,刪除預設配置,新增自定義配置: <?xml version="1.0" encoding="UTF-8"?> <configuration> <springProfile name="production"> <logger name="com.shf.springboot" level="INFO" /> </springProfile> <springProfile name="dev"> <!-- 日誌輸出的優先順序在appender基礎上,但對於定義的包路徑其輸出級次的優先順序高於root --> <logger name="com.shf.springboot.runner.MyStartupRunner1" level="DEBUG" /> </springProfile> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{36} - %msg%n</Pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level><!-- 第一級過濾列印顯示級次的日誌級別 --> </filter> </appender> <!-- 此處對於下面對映的appender再次進行日誌級別的過濾,此時過濾僅在appender基礎上進行,故小於等於appender級次即可。 --> <!-- 如果定義了<logger name="com.s***" level="DEBUG" />則對應包路徑下的日誌輸出級別以logger為更高優先順序,同時也是在appender基礎上進行過濾. 非定義的包路徑仍然採用此root定義的level --> <root level="INFO"> <appender-ref ref="STDOUT"/> </root> </configuration> 淺析encoder: <encoder>表示對日誌進行編碼:
  • %d{yyyy-MM-dd HH:mm:ss.SSS}——日誌輸出時間
  • %thread——輸出日誌的程序名字,這在Web應用以及非同步任務處理中很有用
  • %5level——日誌級別,並且使用5個字元靠右對齊
  • %logger{36}——日誌輸出者的名字
  • %msg——日誌訊息
  • %n——平臺的換行符
4.2、修改啟動自執行類方法如下:; @Component @Order(value=1) public class MyStartupRunner1 implements CommandLineRunner { public static Logger logger = LoggerFactory.getLogger(MyStartupRunner1.class); @Override public void run(String... arg0) throws Exception { logger.debug("DEBUG>>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作<<<<<<<<<<<<<"); logger.debug("DEBUG>>>>>>>>>>>>>>>111111111111111111111111111111<<<<<<<<<<<<<"); logger.info("INFO>>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作<<<<<<<<<<<<<"); logger.info("INFO>>>>>>>>>>>>>>>111111111111111111111111111111<<<<<<<<<<<<<"); } } @Component @Order(value=2) public class MyStartupRunner2 implements CommandLineRunner { public static Logger logger = LoggerFactory.getLogger(MyStartupRunner2.class); @Override public void run(String... arg0) throws Exception { logger.debug("DEBUG>>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作<<<<<<<<<<<<<"); logger.debug("DEBUG>>>>>>>>>>>>>>>222222222222222222222222222222<<<<<<<<<<<<<"); logger.info("INFO>>>>>>>>>>>>>>>服務啟動執行,執行載入資料等操作<<<<<<<<<<<<<"); logger.info("INFO>>>>>>>>>>>>>>>222222222222222222222222222222<<<<<<<<<<<<<"); } } 4.3、檢視控制檯列印:
輸出的內容對應了我們設定的pattern,並且此時系統預設的均只輸出INFO級別,僅有通過logger設定的路徑下debug、info均列印。 4.4、稍作修改: <configuration> <springProfile name="production"> <logger name="com.shf.springboot" level="INFO" /> </springProfile> <springProfile name="dev"> <!-- 日誌輸出的優先順序在appender基礎上,但對於定義的包路徑其輸出級次的優先順序高於root --> <logger name="com.shf.springboot.runner.MyStartupRunner1" level="INFO" /> </springProfile> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{36} - %msg%n</Pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level><!-- 第一級過濾列印顯示級次的日誌級別 --> </filter> </appender> <!-- 此處對於下面對映的appender再次進行日誌級別的過濾,此時過濾僅在appender基礎上進行,故小於等於appender級次即可。 --> <!-- 如果定義了<logger name="com.s***" level="DEBUG" />則對應包路徑下的日誌輸出級別以logger為更高優先順序,同時也是在appender基礎上進行過濾. 非定義的包路徑仍然採用此root定義的level --> <root level="DEBUG"> <appender-ref ref="STDOUT"/> </root> </configuration>
輸出所有的debug、info級別的日誌,同時通過logger設定的路徑下僅輸出INFO級別。 4.5、再次修改: <configuration> <springProfile name="production"> <logger name="com.shf.springboot" level="INFO" /> </springProfile> <springProfile name="dev"> <!-- 日誌輸出的優先順序在appender基礎上,但對於定義的包路徑其輸出級次的優先順序高於root --> <logger name="com.shf.springboot.runner.MyStartupRunner1" level="DEBUG" /> </springProfile> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{36} - %msg%n</Pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level><!-- 第一級過濾列印顯示級次的日誌級別 --> </filter> </appender> <!-- 此處對於下面對映的appender再次進行日誌級別的過濾,此時過濾僅在appender基礎上進行,故小於等於appender級次即可。 --> <!-- 如果定義了<logger name="com.s***" level="DEBUG" />則對應包路徑下的日誌輸出級別以logger為更高優先順序,同時也是在appender基礎上進行過濾. 非定義的包路徑仍然採用此root定義的level --> <root level="DEBUG"> <appender-ref ref="STDOUT"/> </root> </configuration>
此時輸出的日誌僅為INFO級別的。 注:通過上述的4.3、4.4、4.5不同的配置對應了不同的列印,很好的驗證了配置中註釋的部分,其優先順序管理。此時我們還用到了過濾器ThresholdFilter,此過濾器為臨界值過濾器。常用過濾器: ThresholdFilter:臨界值過濾器,過濾掉低於指定臨界值的日誌。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;當日志級別低於臨界值時,日誌會被拒絕。 LevelFilter:級別過濾器,根據日誌級別進行過濾。如果日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。有以下子節點: <level>:設定過濾級別 <onMatch>:用於配置符合過濾條件的操作 <onMismatch>:用於配置不符合過濾條件的操作 EvaluatorFilter: 求值過濾器,評估、鑑別日誌是否符合指定條件。有一下子節點: <evaluator>: 鑑別器,常用的鑑別器是JaninoEventEvaluato,也是預設的鑑別器,它以任意的java布林值表示式作為求值條件,求值條件在配置檔案解釋過成功被動態編譯,布林值表示式返回true就表示符合過濾條件。evaluator有個子標籤<expression>,用於配置求值條件。 <onMatch>:用於配置符合過濾條件的操作 <onMismatch>:用於配置不符合過濾條件的操作 4.6、在configuration 中除了子節點 appender、logger、root外我們還會進行如下配置: <configuration scan="true" scanPeriod="60 second" debug="false"> 其中: scan:當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true scanPeriod:設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘 debug:當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。 5、RollingFileAppender常見的日誌輸出到檔案,隨著應用的執行時間越來越長,日誌也會增長的越來越多,將他們輸出到同一個檔案並非一個好辦法。RollingFileAppender用於切分檔案日誌: 5.1、新增配置如下: <appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>data/log/app.log</File> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>log.%d{yyyy-MM-dd}.log</FileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%5level] [%thread] %logger{36} - %msg%n</Pattern> <charset>UTF-8</charset> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="STDOUT"/> <appender-ref ref="dailyRollingFileAppender"/><!-- 不新增則無法生成日誌檔案--> </root> 注: 5.1.1、日誌檔案的儲存路徑:data/log/app.log
5.1.2、rollingPolicy的定義,上例中log.%d{yyyy-MM-dd}.log定義了日誌的切分方式——把每一天的日誌歸檔到一個檔案中,30表示只保留最近30天的日誌,以防止日誌填滿整個磁碟空間。同理,可以使用%d{yyyy-MM-dd_HH-mm}來定義精確到分的日誌切分方式。 5.1.3、發出一個請求,檢視日誌內容:
6、採用war包進行部署測試驗證: 在WINDOWS下部署應用啟動服務發現會中文亂碼,
正是由於WINDOWS下系統編碼為GBK,故需要調整配置中控制檯輸出的charset為GBK,此時控制檯顯示即可正常。
7、Logback不建議採用相對路徑配置日誌檔案的路徑,此時我們採用的相對路徑對於不同環境下其日誌檔案究竟在什麼路徑下呢: 7.1、Eclipse中:
7.2、通過jar方式啟動:
7.3、通過常規容器tomcat部署啟動服務:
8、非同步記錄日誌(AsyncAppender):在多執行緒場景下,會出現阻塞死鎖,可以通過非同步方式記錄日誌。AsyncAppender並不處理日誌,只是將日誌緩衝到一個BlockingQueue裡面去,並在內部建立一個工作執行緒從佇列頭部獲取日誌,之後將獲取的日誌迴圈記錄到附加的其他appender上去,從而達到不阻塞主執行緒的效果。因此AsynAppender僅僅充當事件轉發器,必須引用另一個appender來做事。修改配置如下即可: <!-- 非同步輸出 --> <appender name="ASYNC" class= "ch.qos.logback.classic.AsyncAppender"> <!-- 不丟失日誌.預設的,如果佇列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌,故設定為0 --> <discardingThreshold>0</discardingThreshold> <!-- 更改預設的佇列的深度,該值會影響效能.預設值為256 --> <queueSize>512</queueSize> <!-- 新增附加的appender,最多隻能新增一個 --> <appender-ref ref ="dailyRollingFileAppender"/> </appender> <root level="DEBUG"> <appender-ref ref="ASYNC"/> <appender-ref ref="STDOUT"/> </root> 9、Logback同樣提供了直接將日誌儲存至DB的功能: 9.1、修改POM檔案新增相關依賴包,主要是資料庫連線驅動以及連線池依賴: <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.1</version> </dependency> <!-- jdbc driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.13</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc41</artifactId> <version>4.1</version> </dependency> 9.2、配合logback-spring.xml,新增DBAppender配置(方式一:sql資料庫+DriverManagerConnectionSource): <!--日誌非同步到資料庫 --> <appender name="DB" class="ch.qos.logback.classic.db.DBAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!--日誌非同步到資料庫 --> <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"> <driverClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverClass> <url>jdbc:sqlserver://127.0.0.1:1433;DatabaseName=cloudsea</url> <user>sa</user> <password></password> </connectionSource> </appender> <root level="DEBUG"> <appender-ref ref="DB"/> <appender-ref ref="ASYNC"/> <appender-ref ref="STDOUT"/> </root> 9.3、此時啟動服務,檢視控制檯以及資料庫: 9.3.1、控制檯會有如下提示:
故在此目錄下新增對應jar依賴包。 9.3.2、此提醒並未影響日誌的記錄
所有通過臨界值過濾高於等於INFO級別的均自動儲存至資料庫。此時我們將缺失的依賴包放置需要的目錄重啟服務,此時控制檯無上述warn,資料庫日誌記錄增加:
9.4、在9.2中我們採用的書sql+DriverManagerConnectionSource方式,本次我們採用mysql+DataSourceConnectionSource+c3p0方式驗證: 9.4.1、修改我們的logback-spring.xml: <!--日誌非同步到資料庫 --> <appender name="DB" class="ch.qos.logback.classic.db.DBAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!--日誌非同步到資料庫 --> <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource"> <!--連線池 --> <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"> <driverClass>com.mysql.jdbc.Driver</driverClass> <jdbcUrl>jdbc:mysql://127.0.0.1:3306/springboot1</jdbcUrl> <user>root</user> <password>root</password> </dataSource> </connectionSource> </appender> 9.4.2、啟動服務驗證結果,一切正常:
注: 1、如果我們啟動服務無異常,且確認資料庫執行也正常,但資料庫無日誌記錄,則有可能是資料庫表結構不匹配,具體的表結構可以在
中直接提取在資料庫執行即可。 2、本案例採用INFO級別作為臨界值過濾,減少大量DEBUG級別記錄,具體可以根據實際業務需要決定。 3、應用場景中我們可以將日誌資料庫與業務資料庫分離,同時也可以通過擴充套件自定義的Appender(繼承UnsynchronizedAppenderBase)實現mongodb日誌的收集。

相關推薦

使用logback實現日誌記錄

在開發中列印內容,使用 System.out.println() 和 Log4j 應當是人人皆知的方法了。  其實在開發中我們不建議使用 System.out 因為大量的使用 System.out 會增加資源的消耗。  而Log4j 更為靈活在效能上也相比 System.o

SLF4J + logback 實現日誌輸出和記錄

-- .com 保持 不存在 default stat 我們 fix jar包 一、SLF4J   SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。在使用SLF4J的時候,不

logback+slf4j實現日誌記錄

SLF4J 它不是一個真正的日誌實現,是一個抽象層,執行後臺使用任意一個日誌類庫,只需要更換依賴包和配置檔案。 LogBack + slf4j 依賴: <dependency> <groupId>org.slf4j</groupId&

python內置函數print輸出到文件,實現日誌記錄的功能

imp inpu 函數 rgs print top args txt war # bulid time 2018-6-22 import os import time def log(*args, **kwargs): # *kargs 為了通用 可不傳 ru

slf4j+logback實現日誌存放到不同檔案

為了方便檢視和歸檔:  不同包的日誌可能要放到不同的檔案中,如service層和dao層的日誌;  不同日誌級別:除錯、資訊、警告和錯誤等也要分檔案輸出。  一、根據包輸出,通過logger的name屬性指定不同的包  

C#實現日誌記錄 支援按日期多檔案儲存

日誌記錄類LogHelper,支援按照日期儲存,儲存的資訊帶時間資訊,具體的日誌內容如下: 2016-12-08 23:56:45:787 [Notice]sadfsafasfffffffffffffffffffffffffffffffffffffffff 2016-12-08 2

ssm框架搭建-整合logback實現日誌管理(spring5.0)

ssm(spring+springmvc+mybatis)框架搭建:整合mybatis-generato程式碼生成器,很純淨的基本搭建。 搭建環境:idea+Tomcat 8+jdk 8    用Maven進行管理 1.專案結構: 2.檔案對應說明,在readme裡

AOP之獲取Controller請求(Request)、返回(Response)引數、報錯資訊實現日誌記錄

需求:為系統中所有的提交,修改,刪除等等操作(除查詢以外的所有操作)做日誌記錄,記錄的內容包括:請求引數,返回引數,如果報錯就儲存報錯資訊。日誌要新增一個日誌型別。 方案:最好的選擇就是用註解標記切點,用AOP實現此需求。 一、準備 版本: J

Java基礎(九):logback實現日誌按天和大小切分

【前言】        專案中每天會列印很多日誌,有時候進行排錯開啟一個大的日誌檔案(我們有一個系統的線上日誌檔案大小已經超過20G)是一件很可怕的事情;對日誌進行按天的切分是一件非常有必要的事情。 【日誌按天切分】          一、在application.pr

Spring Aop+註解實現日誌記錄

系統業務操作日誌記錄是每個系統必不可少的一部分,但通常的做法是在每個需要記錄日誌的地方,呼叫新增日誌的Service方法,這樣做主要是顯的麻煩。 我們可以使用Spring AOP結合註解來實現這一功能。 1、首先定義一個註解類,如下: @Target(

SpringBoot使用logback實現日誌按天滾動

需求 日誌按天滾動分割info和error日誌輸出到不同檔案為什麼使用Logback 在這裡,我不去深究的討論各個日誌框架的優劣,網上的對比文章實在太多了。我只說以下幾點理由。 Logback是Log4j的升級版,作者為同一個人,作者不想再去改Log4j,所以寫了Logb

Spring AOP實現日誌記錄(Aspect)

一、Aop術語 切面(Aspect):在Spring AOP中,切面可以使用通用類或者在普通類中以@Aspect 註解(@AspectJ風格)來實現 連線點(Joinpoint):在Spring AOP中一個連線點代表一個方法的執行 通知(Advice):在切面的某個特定的連線點(Joinp

ssm框架整合AOP,實現日誌記錄功能

在ssm框架中,實現一個切面日誌功能,起碼要掌握的知識有四點: 以下是自己之前做的一個專案,希望對你們有幫助 1:先定義一個自定義註解類 @Target({METHOD, TYPE}) @Retention(RetentionPolicy.RUNTIME) @In

Spring Boot自定義註解+AOP實現日誌記錄

訪問Controller列印的日誌效果如下:*********************************Request請求*************************************** ClassName : com.xxx.app.xxx.a

使用自定義註解+Spring AOP 實現日誌記錄

使用自定義註解+Spring切面 實現日誌記錄 在平常的專案程式設計中,我們會經常使用到日誌,用來記錄各種事件.但是,有些日誌記錄套路實在是太像了,我們不得不要寫很多遍. 比如在Spring中,我們要使用日誌記錄每個controller的訪問和結束時間,該怎

java動態代理詳解,並用動態代理和註解實現日誌記錄功能

動態代理的概念       動態代理是程式在執行過程中自動建立一個代理物件來代替被代理的物件去執行相應的操作,例如, 我們有一個已經投入執行的專案中有一個使用者DAO類UserDao用來對User物件進行資料庫的增刪改查操作,但是有一天,要求在對使用者的增刪改查操作時記錄相

SSM中 實現日誌記錄(AOP+log4j2)

本人使用: 整合開發環境:idea 專案管理工具:maven 資料庫:oracle 框架:Spring+SpringMVC+myBatis 主要步驟: 在pom.xml中引入外掛依賴 log4j2.xml檔案配置 web.xml檔案配置 編寫日誌管理類LogI

Spring MVC使用攔截器實現日誌記錄

spring記錄日誌有兩種,一種是通過AOP,另一種是通過攔截器interceptor,這裡選擇的是攔截器interceptor:  一、Interceptor實現類 SpringMVC 中的Interceptor 攔截請求是通過HandlerInterceptor 來

Spring註解實現日誌記錄

之前總結寫了一篇通過XML配置的方式,切面程式設計實現日誌記錄的功能demo http://blog.csdn.net/weiweiai123456/article/details/38561085 可參考http://blog.csdn.net/heirenheiren/

Spring AOP 基於註解實現日誌記錄+自定義註解

一、寫一個自定義註解        註解中包括配置方法所在模組名稱,以及功能名稱,當然我們在註解裡可以自定義。import java.lang.annotation.Documented; import java.lang.annotation.ElementType; im