Log4j日誌集中管理
阿新 • • 發佈:2019-01-26
最近遇到這樣一個問題,公司線上有中、日、美三種語言的專案,隸屬於不同的三臺伺服器,且每個專案都通過雙節點配置,現想實現日誌的統一管理,即將所有日誌輸入到同一臺伺服器上,然後進行統一記錄、管理、分析。最終,通過log4j的SocketAppender進行了實現:
執行/opt/log4j-server-12444/startup.sh 啟動服務。
執行/opt/log4j-server-12444/shutdown.sh 停止服務。
catalina.sh 檔案:
配置檔案在conf/lcf/generic.lcf,裡面的配置與web中的一樣,只是沒有root根日誌。
log的配置名稱要與web中的一致,否則會導致伺服器端的日誌無法列印。
在web中新加SQL表log的時候,需要在伺服器的generic.lcf中加上。
一、客戶端的配置:
客戶端的配置比較簡單,只需要告訴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 檔案:
log4j的伺服器,也需要一個伺服器段的配置檔案,這裡用的是conf/log4jserver.properties,其中一些配置與客戶端的配置檔案大同小異(就是web專案中的log4j.properties),主要的是伺服器端配置客戶端的log。#!/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"
配置檔案在conf/lcf/generic.lcf,裡面的配置與web中的一樣,只是沒有root根日誌。
log的配置名稱要與web中的一致,否則會導致伺服器端的日誌無法列印。
在web中新加SQL表log的時候,需要在伺服器的generic.lcf中加上。