Log4j 2.0在開發中的高階使用詳解—SocketAppender的遠端輸出(五)
對檔案進行封裝、注入,並且還能按照日誌檔案的時間點、檔案大小等條件進行自動封存。
例如,想要將幾個不同源的日誌彙集到一起,可以用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 進行反饋,共同學習!
相關文章
- Log4j 2.0在開發中的高階使用詳解—配置簡單的控制檯輸出(三)
- Log4j 2.0在開發中的高階使用詳解—配置簡單的檔案輸出(四)
- Log4j 2.0在開發中的高階使用詳解—介紹篇(一)
- Log4j 2.0在開發中的高階使用詳解—預設級別(二)
- Log4j 2.0在開發中的高階使用詳解—讀取配置檔案(六)
- Nmap在實戰中的高階用法(詳解)
- 詳解Vue中watch的高階用法Vue
- vue元件詳解(五)——元件高階用法Vue元件
- 詳解Java中的IO輸入輸出流!Java
- 研發流程在敏捷開發中的詳解敏捷
- TypeScript在React高階元件中的使用技巧TypeScriptReact元件
- Kotlin——高階篇(二):高階函式詳解與標準的高階函式使用Kotlin函式
- Hyperf 2.0 釋出!想象的開端!
- ? Hyperf 2.0 釋出!想象的開端!
- PyCharm使用技巧:Raspberry Pi的遠端開發PyCharm
- 閉包詳解二:JavaScript中的高階函式JavaScript函式
- LINUX開發使用的3個遠端工具Linux
- Jmeter(四十四) - 從入門到精通高階篇 - Jmeter遠端啟動(本地執行+遠端執行)(詳解教程)JMeter
- xargs在linux中的使用詳解Linux
- SSH遠端埠轉發實戰詳解
- Java後端高階開發面試技巧解析Java後端面試
- MongoDB的mongostat命令輸出詳解MongoDB
- 遠端教育系統開發中的誤區
- Hibernate 使用log4j輸出日誌
- git 遠端操作詳解Git
- Nginx高階功能詳解Nginx
- 詳談基於JSON的高階AJAX開發技術JSON
- RxJava 2.0 使用詳解RxJava
- 在樹莓派上開發SpringBoot 之使用VSCode遠端開發樹莓派Spring BootVSCode
- 詳解Linux中SSH遠端訪問控制Linux
- vnc遠端安裝,在Linux中vnc遠端安裝的教程VNCLinux
- ASP.NET 2.0中的頁面輸出快取ASP.NET快取
- java專案中eclipse控制檯輸出log4j的資訊JavaEclipse
- .NET Petshop詳解(五):petshop輸出快取設定 (轉)快取
- iOS 元件化開發(一):遠端私有庫的基本使用iOS元件化
- vue 2.0開發專案中stylus 的配置和使用Vue
- 初識遠端開發,使用Jetbrains IDE進行遠端開發解決筆記本記憶體不夠的問題AIIDE筆記記憶體
- [譯]標準化Keras:TensorFlow 2.0中的高階API指南KerasAPI