Log4j 2.0在開發中的進階使用詳解—SocketAppender的遠程輸出(五),log4j配置詳解
Log4j2的Appenders充分考慮了日誌事件的輸出、封裝以及過濾轉寄的可能,包括最基本的輸出到本地檔案、輸出到遠程主機,
對檔案進行封裝、注入,並且還能按照記錄檔的時間點、檔案大小等條件進行自動封存。
例如,想要將幾個不同源的日誌彙集到一起,可以用FlumeAppender;想要在LogEvent中注入資訊,
可以用RewriteAppender;想要讓系統按照設定的時間間隔自動封存日誌資訊,可以用RollingFileAppender
(每隔一定時間自動儲存一份新增的記錄檔,並按照時間戳記等指定格式命名);當產生安全層級達ERROR或FATAL的LogEvent時,
給維護人員發送郵件可用SMTPAppender;希望將日誌資訊寫到遠程主機的,可用SocketAppender;希望能夠按照RFC5424格式向遠程主機發送日誌資訊,
可用SyslogAppender等等。
SocketAppender
將log event輸出到一個遠程伺服器上(需指定伺服器名和連接埠號碼),資料可以以任意指定的格式經由TCP或UDP協議發送。
SocketAppender中比較重要的參數有:
⑴ host,String,指定伺服器的主機名稱。(必需)
⑵ immediateFlush,boolean,是否立即flush,還是等待緩衝到一定大小後在flush。
⑶ layout,Layout,log event輸出的格式。
⑷ port,integer,遠程伺服器堅挺log event的應用的連接埠號碼。
⑸ protocol,String,發送log event所使用的協議,"TCP" 或"UDP"。
⑹ reconnectionDelay,integer,當串連斷開時,延遲等待的ms數。
⑺ name,String ,Appender的名稱。
⑻ protocol,String,通訊協議 預設TCP。可選值 "TCP" (default), "SSL" or "UDP".
⑼ SSL,SslConfiguration,包含金鑰儲存區庫和信任存放庫的配置.
⑽ filter,Filter,一個過濾器來確定事件應該由這個Appender。 不止一個過濾器 可以通過使用一個CompositeFilter。
⑾ immediateFail,boolean,設定為true時,日誌事件不會等待嘗試重新串連,將立即如果失敗 通訊端是停用。
⑿ immediateFlush,boolean, 當該值設定成真時,預設情況下,每個寫將沖洗。 這將保證寫的資料 到磁碟,但可能會影響效能。
⒀ layout,Layout,LogEvent ,布局使用格式。 預設值是SerializedLayout。
⒁ reconnectionDelay,integer ,如果設定為值大於0,一個錯誤後SocketManager將嘗試重新串連 在指定的毫秒數後的伺服器。 如果串連失敗 將拋出一個異常(可以被應用程式如果ignoreExceptions是 設定為假)。
⒂ ignoreExceptions,boolean,預設值是真正的添加事件時,遇到了引起異常 內部記錄,然後忽略。 當設定為假將傳播到異常 調用者。 你必須設定這個假當封裝這個AppenderFailoverAppender。
Log Service器代碼(main方法):
package com.herman.log4j2.server;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class TestServer { public static void main(String[] args) throws IOException { ServerSocket socket = new ServerSocket(5000); while (true) { Socket client = socket.accept(); Thread t = new Thread(new LogRunner(client)); t.start(); }}}Log Service器代碼(Runnable線程):
package com.herman.log4j2.server;import java.io.IOException;import java.io.InterruptedIOException;import java.io.ObjectInputStream;import java.net.Socket;public class LogRunner implements Runnable{ private ObjectInputStream ois; public LogRunner(Socket client) { try { this.ois = new ObjectInputStream(client.getInputStream()); } catch (Exception e) { e.printStackTrace(); } } public void run() { try { while (true) { Object obj= ois.readObject(); System.out.println(obj.toString()); } } catch(java.io.EOFException e) { //讀取的時候到達尾端拋出的異常,屏蔽掉 } catch(java.net.SocketException e) { } catch(InterruptedIOException e) { Thread.currentThread().interrupt(); } catch(IOException e) { } catch (Exception e) { e.printStackTrace(); } finally { } }}用戶端xml配置(log4j2.xml):
<?xml version="1.0" encoding="UTF-8"?><Configuration> <!-- Appenders 輸出目的地 --> <Appenders> <!-- 配置日誌輸出檔案名字 追加讀寫 host地址 連接埠 --> <Socket name="A1" host="localHost" port="5000"> <!-- 輸出格式 序列布局--> <SerializedLayout/> </Socket> <!-- 控制台輸出 --> <Console name="STDOUT" target="SYSTEM_OUT"> <!-- 輸出格式 布局--> <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> </Console> </Appenders> <Loggers> <!-- debug層級 --> <Root level="debug"> <AppenderRef ref="A1"/> <AppenderRef ref="STDOUT"/> </Root> </Loggers></Configuration>用戶端測試代碼:
package com.herman.log4j2.test;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;/** * @see log4j 2.0 簡單的配置使用一個檔案Appender * @author Herman.Xiong * @date 2014年7月21日 14:32:55 */public class Test2 {/** * 配置記錄層級為debug,輸出位置為控制台和檔案 */private static Logger log = LogManager.getLogger(Test2.class);public static void main(String[] args) {log.trace("trace");log.debug("debug");log.info("info");log.warn("warn");log.error("error");log.fatal("fatal");log.trace("trace");log.debug("debug");log.info("info");log.warn("warn");log.error("error");log.fatal("fatal");log.exit();}}輸出效果:
Logger=com.herman.log4j2.test.Test2 Level=DEBUG Message=debugLogger=com.herman.log4j2.test.Test2 Level=INFO Message=infoLogger=com.herman.log4j2.test.Test2 Level=WARN Message=warnLogger=com.herman.log4j2.test.Test2 Level=ERROR Message=errorLogger=com.herman.log4j2.test.Test2 Level=FATAL Message=fatalLogger=com.herman.log4j2.test.Test2 Level=DEBUG Message=debugLogger=com.herman.log4j2.test.Test2 Level=INFO Message=infoLogger=com.herman.log4j2.test.Test2 Level=WARN Message=warnLogger=com.herman.log4j2.test.Test2 Level=ERROR Message=errorLogger=com.herman.log4j2.test.Test2 Level=FATAL Message=fatal
歡迎大家關注我的個人部落格!!!!
如有不懂,疑問或者欠妥的地方,請加QQ群:135430763 進行反饋,共同學習!
賜教log4j的詳細使用步驟
log4j的設定檔有衝突, 是否在你的classpath裡面有其他的log4j的配置?
log4j 還允許日誌記錄請求列印到多個輸出目的地,按 log4j 的叫法是輸出源。一個記錄器可以有多個輸出源。一條log資訊如果可被這個記錄器處理,則該記錄器會把這條資訊送往每個它所擁有的輸出源,以及階層中更進階的輸出源。例如,根記錄器以控制台作為輸出源,則所有可被紀錄的日誌都將至少列印到控制台。
配置日誌資訊輸出源,其文法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.option = valueN Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(檔案)
org.apache.log4j.DailyRollingFileAppender(每天產生一個記錄檔)
org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)
org.apache.log4j.WriterAppender(將日誌資訊以流格式發送到任意指定的地方)
org.apache.log4j.SocketAppender (Socket)
org.apache.log4j.NtEventLogAppender (NT的Event Log)
org.apache.log4j.JMSAppender (電子郵件)
請注意,可以通過覆蓋預設行為,這樣就不再附加累積的輸出源:
log4j.additivity.loggerName=false注意,不要把一個輸出源附加到多個記錄器上,否則會得到“Attempted to append to closed appender named xxx”的資訊。
jsp中log4jproperties是什檔案?
Apache為我們提供了一個強有力的日誌操作包-Log4j。 作為Apache的開源項目,Log4j可以使我們很好的控制日誌資訊輸送的目的地是控制台、檔案、GUI組件、甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護進程等;也可以方便的使我們控制每一條日誌的輸出格式;通過定義每一條日誌資訊的層級,我們能夠更加細緻地控制日誌的產生過程。最令人感興趣的就是,這些可以通過一個設定檔來靈活地進行配置,而不需要修改應用的代碼
在實際編程時,要使Log4j真正在系統中運行事先還要對設定檔進行定義。定義步驟就是對Logger、Appender及Layout的分別使用。Log4j支援兩種設定檔格式,一種是XML格式的檔案,一種是java properties(key=value)【Java特性檔案(鍵=值)】。(這裡只說明properties檔案)
-----------------------------------------------------------------------------------------------------------------------------
1、配置根Logger
其文法為:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
level : 是日誌記錄的優先順序,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的層級。Log4j建議只使用四個層級,優先順序從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這裡定義的層級,您可以控制到應用程式中相應層級的日誌資訊的開關。比如在這裡定 義了INFO層級,則應用程式中所有DEBUG層級的日誌資訊將不被列印出來。appenderName: 就是指定日誌資訊輸出到哪個地方。您可以同時指定多個輸出目的地。
例如:log4j.rootLogger=info,A1,B2,C3
--------------------------------------------------------------------------------------------------------------------------------
2、配置日誌資訊輸出目的地
其文法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class //
"fully.qualified.name.of.appender.class" 可以指定下面五個目的地中的一個:
1.org.apache.log4j.ConsoleAppender(控制台)
2.org.apache.log4j.FileAppender(檔案)
3.org.apache.log4j.DailyRollingFileAppender(每天產生一個記錄檔)
4.org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)
5.org.apache.log4j.WriterAppender(將日誌資訊以流格式發送到任意指定的地方)
1.ConsoleAppender選項
Threshold=WARN:指定日誌訊息的輸出最低層次。
......餘下全文>>