日誌,程式設計師的小本本
阿新 • • 發佈:2021-01-08
日誌的基本配置
匯入依賴
移除starter包中的原本的日誌依賴,都是在父級pom.xml中配置。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!--排除springboot預設的日誌依賴 後期自己整合--> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>
增加新的依賴
<!--日誌配置--> <!--引入日誌依賴 抽象層 與 實現層--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency>
日誌properties配置
#建立 log4j.properties 並且放到資原始檔目錄 src/main/resources log4j.rootLogger=DEBUG,stdout,file log4j.additivity.org.apache=true #第一個地方stdout 輸出控制檯 log4j.appender.stdout=org.apache.log4j.ConsoleAppender #標準的輸出資訊 log4j.appender.stdout.threshold=INFO log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n #以檔案形式滾動輸出 log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.appender.file.Threshold=INFO log4j.appender.file.append=true #日誌的輸出路徑 log4j.appender.file.File=d:/log/wxshare/mylog.log
日誌的其他介紹
log4j日誌輸出格式一覽: %c 輸出日誌資訊所屬的類的全名 %d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy-MM-dd HH:mm:ss },輸出類似:2002-10-18- 22:10:28 %f 輸出日誌資訊所屬的類的類名 %l 輸出日誌事件的發生位置,即輸出日誌資訊的語句處於它所在的類的第幾行 %m 輸出程式碼中指定的資訊,如log(message)中的message %n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n” %p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL。如果是呼叫debug()輸出的,則為DEBUG,依此類推 %r 輸出自應用啟動到輸出該日誌資訊所耗費的毫秒數 %t 輸出產生該日誌事件的執行緒名 #設定日誌輸出的等級為debug,低於debug就不會輸出了 #設定日誌輸出到兩種地方,分別叫做stdout和file 控制檯輸出和檔案輸出 log4j.rootLogger=DEBUG,stdout,file log4j.additivity.org.apache=true #第一個地方stdout, 輸出到控制檯 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.threshold=INFO #設定輸出格式%5p [%t] (%F:%L) - %m%n #寬度是5的優先等級 執行緒名稱 (檔名:行號) - 資訊 回車換行 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n #以檔案形式滾動輸出 log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.appender.file.Threshold=INFO log4j.appender.file.append=true log4j.appender.file.File=d:/log/wxshare/mylog.log
測試介面
這個是controller類
//這句話放在任何一個需要列印日誌的類中 controller 或者一些service的地方
final static Logger logger = LoggerFactory.getLogger(TestController.class); @GetMapping("logtest") public void logTest() { logger.debug("debug"); logger.info("info"); logger.warn("warn"); logger.error("error"); }
測試介面
這裡try it out一下,測試這個介面的目的還是為了在控制檯中能看到對應的日誌資訊
Service日誌管理-切面技術aspectJ
依賴匯入
老樣子,還是在父級pom.xml中進行配置
<!--配置springaop,日誌監控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
配置
properties裡面可以加入一個sql的監控,可以輸出sql查詢時候的語句
#配置sql列印
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
需要切面的包結構
建立一個測試service層的介面TestService
public interface TestService { public void logTest(int seconds); }
建立實現類TestServiceImpl
package com.wt.service.impl; import com.wt.service.TestService; import org.springframework.stereotype.Service; @Service public class TestServiceImpl implements TestService { @Override public void logTest(int seconds) { try { Thread.sleep(1000*seconds); } catch (InterruptedException e) { e.printStackTrace(); } } }
API模組
1、在api模組中進行aop切點的操作和測試介面的開發
2、配置類aspect的開發
package com.wt.aspect; import com.wt.controller.TestController; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Aspect //spring的aop實現底層是aspectj框架管理 @Component public class ServiceLogAspect { final static Logger log = LoggerFactory.getLogger(TestController.class); @Around("execution(* com.wt.service.impl..*.*(..))") public Object recordTimeLog(ProceedingJoinPoint joinPoint)throws Throwable { //使用日誌輸出 列印格式:某一個類(目標service),某一個方法(service執行方法) log.info("===開始執行{}.{}=====" // ,joinPoint.getTarget().getClass(), joinPoint.getSignature().getName() ); //記錄開始時間 long begin = System.currentTimeMillis(); //執行目標 Object result = joinPoint.proceed(); //記錄結束時間 long end = System.currentTimeMillis(); long takeTime = end - begin; if(takeTime>3000) { log.error("=====執行結束,耗時間{}毫秒======",takeTime); }else if(takeTime>2000) { log.warn("======執行結束,耗時{}毫秒====", takeTime); }else { log.info("====執行結束, 耗時{}毫秒======",takeTime); } return result; } }
3、測試介面controller的開發
final static Logger logger = LoggerFactory.getLogger(TestController.class); @Resource private TestService testService; /*這裡是service切面日誌測試*/ @GetMapping("/logErrorTest") public void logErrorTest() { testService.logTest(3); }
測試
這個訪問了,會休眠3秒以後才會響應頁面,我們這個測試主要是想檢視超過三秒以後,打印出來的錯誤資訊。
這個就是控制檯列印的資訊,訪問到service的方法,同時執行了切面的方法
這個日誌還有個超級舒服的方式可以去檢視,就在本地檔案。
上面這個路徑是我在日誌檔案中配置的,這個是api模組下的