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個環境通用,比較省事。