手把手教你用java實現syslog訊息的收發,學不會你打我嘍!
阿新 • • 發佈:2020-03-29
>大家好,我是道哥,專注於後端java開發,喜歡寫作和分享。如果覺得文章對你有用,那就點個讚唄!如果能轉發那是對道哥最大的支援!
## syslog的定義
>見文知義,syslog,從英文名字上可以看出是指系統日誌。
>以下內容摘自百度百科:
Syslog常被稱為系統日誌或系統記錄,是一種用來在網際網路協議(TCP/IP)的網上中傳遞記錄檔訊息的標準。這個詞彙常用來指涉實際的syslog 協議,或者那些提交syslog訊息的應用程式或資料庫。
syslog協議屬於一種主從式協議:syslog傳送端會發送出一個小的文字訊息(小於1024位組)到syslog接收端。接收端通常名為“syslogd”、“syslog daemon”或syslog伺服器。系統日誌訊息可以被以UDP協議及╱或TCP協議來發送。
可見syslog支援UDP、TCP協議傳輸,可以從源機器(syslog client)傳送到目標伺服器(syslog server)。
一般來說,系統的一些日誌會記錄在/var/log/目錄的不同檔案下,許可權相關、記錄相關、操作相關等分別會記錄在該資料夾下的不同目錄。
接下來我們學習一下怎麼用java語言實現syslog的收發。
## 引入maven依賴
很慶幸,我們站在巨人的肩上,有現成的maven依賴可以直接使用,不用去一句一句的翻譯c語言對syslog server及client的實現。其實根本的實現原理也比較簡單,網路通訊麼,萬般都是基於socket,可見最簡單的socket通訊在網路通訊的地位上是多麼的高。
[syslog的maven依賴連結不同版本列表](https://mvnrepository.com/artifact/org.graylog2/syslog4j),我們可以隨便使用一個版本,建議還是使用最新版本吧。
```java
```
## syslog server端
syslog4j包內已經有現成的SyslogMain類,給我們舉例怎麼去使用這個maven包,大神們真是貼心啊,怕你不會用,專門給你寫好了示例,示例比較長,感興趣的可以去看看大神的示例,看看一個簡單的示例都能寫的這麼豐富多彩和適用性強。
>知道大家都是大忙人了,更多的時候,都是希望程式碼直接拿來就能用了,這裡道哥給大家簡化了一下程式碼。
整體思路非常簡單,以下幾個關鍵點:
1. 指定syslog server的通訊協議UDP或TCP,就像兩個人相親一樣,一個用英語,一個用漢語,那肯定溝通不了啊,那中間人得乾著急啊。
2. server和client端要定義一致的host和port。大哥,你去相親的時候,得協商好見面時間和地點啊,不然你難道要滿大街的去問,Hi,美女,你是來和我相親的麼。
3. 啟動server執行緒。大神已經幫你封裝好了,server的執行緒以系統守護程序的形式啟動。帥哥美女你們兩個只管好好聊天,聯絡感情。
4. sleep一會哦,這個非常重要,但不要理解歪了,這個是讓系統睡一會,哈哈,主要是保證這個server的jvm程序暫時不要退出,退出了,你就等不到你的約會物件了哦,更別提接下來的溝通交流了。
```java
public class MySyslogServer {
private static final String HOST = "127.0.0.1";
private static final int PORT = 32376;
private void receiveSyslogMessage() throws InterruptedException {
SyslogServerIF server = SyslogServer.getInstance(SyslogConstants.UDP);
SyslogServerConfigIF config = server.getConfig();
config.setHost(HOST);
config.setPort(PORT);
config.addEventHandler(new SyslogServerSessionEventHandlerIF() {
@Override
public Object sessionOpened(SyslogServerIF syslogServerIF, SocketAddress socketAddress) {
return null;
}
@Override
public void event(Object o, SyslogServerIF syslogServerIF, SocketAddress socketAddress,
SyslogServerEventIF syslogServerEventIF) {
System.out.println("receive from:" + socketAddress + "\tmessage" + syslogServerEventIF.getMessage());
}
@Override
public void exception(Object o, SyslogServerIF syslogServerIF, SocketAddress socketAddress, Exception e) {
}
@Override
public void sessionClosed(Object o, SyslogServerIF syslogServerIF, SocketAddress socketAddress, boolean b) {
}
@Override
public void initialize(SyslogServerIF syslogServerIF) {
}
@Override
public void destroy(SyslogServerIF syslogServerIF) {
}
});
SyslogServer.getThreadedInstance(SyslogConstants.UDP);
Thread.sleep(100000);
}
public static void main(String[] args) throws InterruptedException {
new MySyslogServer().receiveSyslogMessage();
}
}
```
## syslog client端
syslog的傳送端也是類似的,需要與server端統一通訊協議,host及port。
然後就是盡情的撩妹了,不對,是盡情的溝通了。
```java
public class MySyslogClient {
private static final String HOST = "127.0.0.1";
private static final int PORT = 32376;
public void generate() {
SyslogIF syslog = Syslog.getInstance(SyslogConstants.UDP);
syslog.getConfig().setHost(HOST);
syslog.getConfig().setPort(PORT);
StringBuffer buffer = new StringBuffer();
buffer.append("約會時間:" + new Date().toString().substring(4,20) + ";")
.append("羞答答的美女:" + "我是小紅啦" + ";")
.append("暗號:" + "萬般皆下品,唯有編碼屌" + ";");
JSONObject jsonObject = new JSONObject();
jsonObject.put("message", buffer.toString());
try {
syslog.log(0, URLDecoder.decode(jsonObject.toString(), "utf-8"));
} catch (UnsupportedEncodingException e) {
System.out.println("generate log get exception " + e);
}
System.out.println("哎呀,老孃的第一次dating,竟然還得先搭訕!");
}
public static void main(String[] args) {
new MySyslogClient().generate();
}
}
```
## 約上了麼?
好了,萬事俱備只欠東風,帥哥(server),美女(client)端在中間人道哥的努力下,終於都準備就緒了。他們兩個到底能不能約上啊?道哥的心裡都等得有點著急了。
接下來我們來測試一下效果!
>先啟動服務端,約會,帥哥得早來一會麼,難道你們約會都是讓女生先到?那我估計你這是第一次,也會是最後一次吧。
控制檯列印,沒有輸出,(⊙o⊙)…,好心急啊,不知道對方長什麼樣,好看呢,還是漂亮呢,能喜歡我這個屌絲程式設計師麼?
>約會美女上線,啟動了,發出了她的訊息
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200328220145223.png#pic_center)
這時候,syslog的server端彈出了訊息
```java
receive from:/127.0.0.1:62749 message-host.local {"message":"約會時間:Mar 28 21:57:08 ;羞答答的美女:我是小紅啦;暗號:萬般皆下品,唯有編碼屌;"}
```
擦,道哥靠譜啊,暗號對,接下來就看哥哥我的了。
## 後記
有了maven依賴包的神助,syslog的使用還是比較簡單的。有時候大家遇到約會不暢(收發訊息有問題),首先檢查雙方使用的通訊協議是否一致,埠號是否一致,是否被佔用。
>能夠看到這裡的都是真愛啊,覺得有用的話,就點個贊。轉發是對道哥最大的鼓勵,點個關注,就不會錯過道哥的更新了。
程式設計師的小夥伴們,學習之路,同行的人越多才可以走的更遠,加入公眾號[程式設計師之道],一起交流溝通,走出我們的程式設計師之道!
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200326225627381.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoYW5sbGVuZ2U=,size_16,color_FFFFFF,t_70#pic