1. 程式人生 > >Log4j日誌集中管理

Log4j日誌集中管理

最近遇到這樣一個問題,公司線上有中、日、美三種語言的專案,隸屬於不同的三臺伺服器,且每個專案都通過雙節點配置,現想實現日誌的統一管理,即將所有日誌輸入到同一臺伺服器上,然後進行統一記錄、管理、分析。最終,通過log4j的SocketAppender進行了實現:

一、客戶端的配置:

客戶端的配置比較簡單,只需要告訴log4j需要監聽哪個遠端伺服器的哪個埠即可。直接在log4j.properties裡直接配置就好。
#linux 環境下的日誌儲存路徑
LOG_PATH = /data/ligang/
#windows 環境下的日誌儲存路徑
#LOG_PATH = e:/ligang/
#上線時需確保LOG_PATH為Linux環境下的路徑
 
#輸出列印格式
sqlLogFormat = %d{yyyy-MM-dd HH:mm:ss}- %p %t %c (line:%L) : %n%m%n

#SQL-LOG的檔案大小
sqlMaxFileSize = 5MB
 
#SQL-LOG檔案翻滾數量
sqlMaxBackupIndex=100
#--------------------------------------------------------------
#Log4j Client Configure , Log4j 客戶端配置

#SQLLog伺服器閥值級別
sqlServerThreshold = INFO
#Remote Server IP  遠端Log伺服器IP
serverIP = 172.17.3.135
#Remote Server Port 遠端Log 伺服器埠
serverPort = 12444
 
#The LocationInfo option takes a boolean value.
#If true, the information sent to the remote host will include location information. 
#開啟列印位置資訊
locationInfo = true
#The ReconnectionDelay option takes a positive integer representing
#the number of milliseconds to wait between each failed connection attempt to the server.
#Setting this option to zero turns off reconnection capability.
#10seconds
 
#當連結不上伺服器時,10秒後會嘗試連線。 當為0時,不會重複連線
reconnectionDelay = 10000
#--------------------------------------------------------------
#root log root主日誌,所有日誌都會列印到rootCategory。除非其他日誌物件設定了 additivity = false
log4j.rootCategory=INFO, console, rootLog
# 給主日誌新增一個控制檯輸出列印的物件
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 控制檯中輸出列印的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 控制檯輸出列印的每一行樣式
log4j.appender.console.layout.ConversionPattern= %p - [%t] %C.%M : %m%n
 
# 給主日誌新增一個向檔案輸出列印的物件
# RollingFileAppender 按檔案大小翻滾。 DailyRollingFileAppender 按日期翻滾。 此配置都使用了前者.
log4j.appender.rootLog=org.apache.log4j.RollingFileAppender
# 日誌輸出路徑
log4j.appender.rootLog.File=${LOG_PATH}root-Log/root-log.log
# 格式
log4j.appender.rootLog.layout=org.apache.log4j.PatternLayout
# 每一行列印的樣式,此處引數按照C語言中的列印規則。
log4j.appender.rootLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}- %p %t %c (line:%L) - %m%n%n
# 日誌檔案大小
log4j.appender.rootLog.MaxFileSize=102400KB
# 翻滾日誌儲存的個數
log4j.appender.rootLog.MaxBackupIndex=20
 
# 設定 com.ptengine包下的DEBUG級別及以上可以列印輸出
log4j.logger.com.ptengine=INFO
# 設定該包下的 WARN 級別及以上可以列印輸出
log4j.logger.com.opensymphony.oscache=WARN
log4j.logger.org.apache.commons=WARN
log4j.logger.org.apache.struts=WARN
log4j.logger.org.springframework=WARN
log4j.logger.org.apache.velocity=WARN
#--------------------------------------------------------------
#allSQL log 此日誌儲存所有關於 insert、update、delete的SQL語句。
#無論這個表存在與否,只要系統執行了更新SQL都會被列印到此日誌。
#--------------------------------------------------------------
#使用者表userSQL log
# user --> 配置名稱。可通過此名稱獲得一個Log物件。 要與表名保持一致。
# userSQL 配置項 ,userServer userlog在log4j伺服器的配置
log4j.logger.user = INFO,userSQL,userServer
# 不在root日誌中輸出
log4j.additivity.user = false
# 為userSQL配置一個向日志文件輸出的物件
log4j.appender.userSQL=org.apache.log4j.RollingFileAppender
# 日誌檔案的路徑,在新增新表配置的時候需保持此格式user-SQL/user-SQL-log.log
log4j.appender.userSQL.File=${LOG_PATH}table/user-SQL/user-SQL-log.log
# 日誌檔案內容輸出格式
log4j.appender.userSQL.layout=org.apache.log4j.PatternLayout
# 每一行日誌的輸出樣式
log4j.appender.userSQL.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}- %p %t %c (line:%L) : %n%m%n
# 日誌檔案大小,到達5120kb後,日誌會向將內容翻滾到其他檔案中
log4j.appender.userSQL.MaxFileSize=5120KB
# 儲存翻滾的檔案數量
log4j.appender.userSQL.MaxBackupIndex=100

#Log4j的伺服器日誌配置
log4j.appender.userServer=org.apache.log4j.net.SocketAppender
log4j.appender.userServer.RemoteHost=${serverIP}
log4j.appender.userServer.Port=${serverPort}
log4j.appender.userServer.LocationInfo=${locationInfo}
log4j.appender.userServer.ReconnectionDelay=${reconnectionDelay}
log4j.appender.userServer.Threshold = ${sqlServerThreshold}

#其他需加日誌的表同user表一樣配置

二、日誌伺服器的配置:

日誌伺服器需要單獨啟動一個java程序,接收客戶端給自己傳送的socket請求。Log4j提供了org.apache.log4j.net.SocketServer類,直接執行其main函式就行了。需要一直後臺執行,所以在這用到了startup、shutdown倆個shell指令碼。將log4j-server-12444上傳到/opt目錄下並解壓。
執行/opt/log4j-server-12444/startup.sh  啟動服務。
執行/opt/log4j-server-12444/shutdown.sh  停止服務。
catalina.sh 檔案:
#!/bin/bash 
#當前指令碼所在絕對路徑
basepath=`dirname $0`"/"
#埠 
LISTEN_PORT=12444
#服務端log4j配置檔案 
SERVER_CONFIG="$basepath"conf/log4jserver.properties
#客戶端的配置 
CLIENT_CONFIG_DIR="$basepath"conf/lcf/
   
#Java程式所在的目錄(classes的上一級目錄) 
APP_HOME="$basepath"lib
#需要啟動的Java主程式(main方法類) 
APP_MAINCLASS=org.apache.log4j.net.SocketServer 
    
#拼湊完整的classpath引數,包括指定lib目錄下所有的jar 
CLASSPATH=$APP_HOME/log4j-1.2.17.jar
  
#JDK所在路徑 
JAVA_HOME=/opt/jdk1.6.0_25
#執行程式啟動所使用的系統使用者
RUNNING_USER=ligang
    
#java虛擬機器啟動引數 
JAVA_OPTS="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"
log4j的伺服器,也需要一個伺服器段的配置檔案,這裡用的是conf/log4jserver.properties,其中一些配置與客戶端的配置檔案大同小異(就是web專案中的log4j.properties),主要的是伺服器端配置客戶端的log。
配置檔案在conf/lcf/generic.lcf,裡面的配置與web中的一樣,只是沒有root根日誌。
      log的配置名稱要與web中的一致,否則會導致伺服器端的日誌無法列印。
      在web中新加SQL表log的時候,需要在伺服器的generic.lcf中加上。

三、javaweb端:

通過org.apache.commons.logging.Log和org.apache.commons.logging.LogFactory進行控制日誌的輸入。