Log4j 2.0在開發中的高級使用詳解—SocketAppender的遠程輸出(五)
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。
日誌服務器代碼(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(); } } }日誌服務器代碼(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=debug Logger=com.herman.log4j2.test.Test2 Level=INFO Message=info Logger=com.herman.log4j2.test.Test2 Level=WARN Message=warn Logger=com.herman.log4j2.test.Test2 Level=ERROR Message=error Logger=com.herman.log4j2.test.Test2 Level=FATAL Message=fatal Logger=com.herman.log4j2.test.Test2 Level=DEBUG Message=debug Logger=com.herman.log4j2.test.Test2 Level=INFO Message=info Logger=com.herman.log4j2.test.Test2 Level=WARN Message=warn Logger=com.herman.log4j2.test.Test2 Level=ERROR Message=error Logger=com.herman.log4j2.test.Test2 Level=FATAL Message=fatal歡迎大家關注我的個人博客!!!!
如有不懂,疑問或者欠妥的地方,請加QQ群:135430763 進行反饋,共同學習!
最後更新:2017-04-03 05:39:29