1. 程式人生 > >SpringBoot配置log4j輸出日誌

SpringBoot配置log4j輸出日誌

1、SpringBoot日誌輸出

springboot也可以用logback日誌輸出,但之前用了段時間,感覺還是沒有log4j的方便,可以設定每天輸出一個日誌。

2、SpringBoot配置log4j

Springboot配置log4j主要包括兩個步驟:第一步,新增log4j.properties配置檔案;第二步,初始化配置檔案。

2.1、配置log4j檔案

接下來看看具體的操作方法,新增log4j.properties配置檔案,配置檔案新增的路徑是工程中的src/main/resources下面,如下圖:

這裡寫圖片描述

配置檔案內容:

#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=info,error,CONSOLE,DEBUG

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender     
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout     
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n     
      
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout     
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = info   
log4j.appender.info.append=true   
#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info

log4j.logger.error=error  
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout     
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = error   
log4j.appender.error.append=true   
#log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error
log4j.appender.error.File=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_error

log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout     
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG   
log4j.appender.DEBUG.append=true   
#log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug
log4j.appender.DEBUG.File=/Users/dddd/Documents/testspace/pms-api-services/logs/debug/api_services_debug

### Debug
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

上述log4j.properties檔案中,當前配置為線下開發模式,若部署線上環境,需要釋放掉註釋語句,並註釋線下配置語句。

#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info

其中log4j.appender.info.File屬性指明瞭輸出日誌檔案的型別及路徑和檔名,型別為info級別,路徑為/Users/dddd/Documents/testspace/pms-api-services/logs/info/,輸出的檔名為api_services_info。

日誌配置檔案中設定了三個級別的日誌輸出:info、error、debug,這些級別的日誌輸出,需要在java類中做相應的控制。

上述日誌配置每天會產生一個新的日誌檔案。

2.2、初始化log4j配置

springboot啟動是通過main入口函式,所以需要在main入口函式中設定log4j初始化。

public class App {
	
	private static final Logger logger = LoggerFactory.getLogger(App.class);	
	
	@Value("${server.port}")
	private int port;
	@Value
("${server.sessionTimeout}") private int sessionTimeout; static { try{ // 初始化log4j String log4jPath = ""; if(Constant.LOG_MODE == 1){ // 配置線上地址 log4jPath = App.class.getClassLoader().getResource("").getPath()+"pms-api-services/config/log4j.properties"; logger.info("Log4j線上生產模式初始化。。。"); }else{ // 配置本地地址 log4jPath = App.class.getClassLoader().getResource("").getPath()+"log4j.properties"; logger.info("Log4j線下開發模式初始化。。。"); } logger.info("初始化Log4j。。。。"); logger.info("path is "+ log4jPath); PropertyConfigurator.configure(log4jPath); }catch (Exception e){ logger.error(e.toString()); } } public static void main(String[] args) { final String[] temp = args; logger.info("oops: main入口函式編碼-" +System.getProperty("file.encoding")); if(Constant.LOG_MODE == 0){ SpringApplication.run(App.class, args); logger.info("oops: 線下開發測試"); }else{ logger.info("oops:" + args[0]); } if(ArrayUtils.isNotEmpty(args)) { // 如果你的應用程式,執行後不自動退出,那麼處理start時不要執行正常的程式碼,否則在部署測試 appctl.sh 的時候,會一直等待程序退出 if(args[0].equals("startup")) { new Thread( new Runnable(){ public void run(){ System.out.println("啟動Mythread子執行緒"); logger.info("啟動Mythread子執行緒"); SpringApplication.run(App.class, temp); } }).start(); System.out.println("program startup"); logger.info("program startup"); }else if(args[0].equals("stop")) { System.out.println("program stop"); logger.info("program stop"); }else if(args[0].equals("restart")) { System.out.println("program restart"); logger.info("program restart"); }else if(args[0].equals("status")) { System.out.println("program status"); logger.info("program status"); } } }

其中static程式碼片段就是完成初始化工單,本例中以我之前的工程作為參考,具體的路徑還需依據每個人自己工程的實際路徑來設定。

3、log4j日誌輸出結果

線上伺服器日誌目錄

這裡寫圖片描述

info資料夾中的日誌

這裡寫圖片描述

以上有什麼錯誤的地方,歡迎大家指正。

4、優化配置

為了使配置更加靈活,對log4j.properties檔案進行了優化,如下:

log4j.rootLogger=${log.root}

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
      
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = info
log4j.appender.info.append=true
log4j.appender.info.File=${log.base}/pms-api-services/logs/info/api_services_info

log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = error
log4j.appender.error.append=true
log4j.appender.error.File=${log.base}/pms-api-services/logs/error/api_services_error

log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG
log4j.appender.DEBUG.append=true
log4j.appender.DEBUG.File=${log.base}/pms-api-services/logs/debug/api_services_debug

### Debug
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

與之相應的main函式新增如下程式碼,同時去掉static程式碼塊:

System.setProperty("log.root",Constant.LOG_ROOT_DAILY);			

System.setProperty("log.base",Constant.LOG_PATH_DAILY);

未來的開發工作中建議直接使用logback,目前log4j配置需要為線下、日常、預發、生產4個環境分別指定輸出路徑,比較折騰,使用logback指定一個相對路徑即可,4個環境通用,比較省事。