1. 程式人生 > >Log4j 實現日誌統一管理

Log4j 實現日誌統一管理

現 工作中遇到這樣一個場景同一臺 伺服器上 部署了兩個專案 這兩個需要同時按照一種規則向同一個檔案寫日誌。首先嚐試 兩個專案自己寫自己的,即
兩個專案都通過相同的配置檔案寫同一個檔案。一小時更換一個檔案。配置主要片段為

log4j.logger.logcase=INFO,localFile
log4j.appender.localFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.localFile.File=/home/kptech/log/orderinfo
log4j.appender.localFile.DatePattern
= yyyyMMddHH'.txt' log4j.appender.localFile.encoding=UTF-8 log4j.appender.localFile.layout=org.apache.log4j.PatternLayout

web.xml 裡也要增加相應配置 並且放在springcontextlistenner之前

    <context-param>      
       <param-name>log4jConfigLocation</param-name>      
       <param-value>
/WEB-INF/classes/log4j.properties</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>

相應程式碼中輸出

private static Logger logcase = Logger.getLogger("logcase");

logcase.info(sb.toString());

但是這樣兩個專案同時啟動,看似沒有問題 比如按照上面的配置 兩個專案都可以像 orderinfo 檔案裡寫資料。 但是到了小時切換的時候,只有一個專案能取到 像 當前日誌檔案orderinfo 寫的許可權。 另外一個只能 向 前一個小時的檔案裡寫如 現在是14:13 那麼 一個專案只會往繼續orderinfo2017013011.txt 裡繼續寫。顯然這種方式行不通,當到了整點切換檔案的時候只有一個能拿到對當前檔案orderinfo的寫許可權

最後再瞭解了socketappender 之後決定用此方法來實現。如果是log4j 1版本建議採用最高版本1.2.7
具體實現過程有兩點
1.在伺服器上單獨啟動一個執行緒開啟一個埠 監聽日誌
2.伺服器上的專案配置socketappender 來寫即可

具體實現過程

啟動java 程序建議使用supervisor設為守護程序。
具體指令 
java -cp log4j-1.2.17.jar org.apache.log4j.net.SocketServer 4560 log4jserver.properties lcf/
說明:log4jserver.properties 是此 log4j 監聽程序的日誌配置
lcf/ 資料夾下的配置檔案預設會讀取generic.lcf 檔案。這是接收到客戶端寫請求的配置。
 4560 是指定埠

log4jserver.properties
log4j.rootCategory=INFO,globalfile
log4j.logger.org.apache.log4j.net.SocketServer=INFO,serverFile
log4j.additivity.org.apache.log4j.net.SocketServer=false
log4j.appender.serverFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.serverFile.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.serverFile.encoding=UTF-8
log4j.appender.serverFile.File=/home/kptech/log/log4jserver/log4jserver.log
log4j.appender.serverFile.layout=org.apache.log4j.PatternLayout
log4j.appender.serverFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n

log4j.appender.globalfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.globalfile.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.globalfile.encoding=UTF-8
log4j.appender.globalfile.File=/home/kptech/log/global/global.log
log4j.appender.globalfile.layout=org.apache.log4j.PatternLayout
log4j.appender.globalfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n
generic.lcf
log4j.logger.logcase=INFO,localFile
log4j.appender.localFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.localFile.File=/home/kptech/log/orderinfo
log4j.appender.localFile.DatePattern = yyyyMMddHH'.txt'
log4j.appender.localFile.encoding=UTF-8
log4j.appender.localFile.layout=org.apache.log4j.PatternLayout

專案中配置如下即可 這裡只要保持 log4j.logger.logcase一致即可。
log4j.logger.logcase = INFO , orderinfo
log4j.appender.orderinfo=org.apache.log4j.net.SocketAppender
log4j.appender.orderinfo.Port=4560
log4j.appender.orderinfo.RemoteHost=localhost
log4j.appender.orderinfo.ReconnectionDelay=1000
log4j.appender.orderinfo.LocationInfo=true

以上實現
即成功滿足了我們的需求,一小時滾動一個檔案,同一物理機多個專案同時寫一個檔案。