23

手把手教你用java实现syslog消息的收发,学不会你打我喽!

 4 years ago
source link: http://www.cnblogs.com/chanllenge/p/12590959.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是道哥,专注于后端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依赖链接不同版本列表 ,我们可以随便使用一个版本,建议还是使用最新版本吧。

<dependency>
            <groupId>org.graylog2</groupId>
            <artifactId>syslog4j</artifactId>
            <version>0.9.60</version>
        </dependency>

syslog server端

syslog4j包内已经有现成的SyslogMain类,给我们举例怎么去使用这个maven包,大神们真是贴心啊,怕你不会用,专门给你写好了示例,示例比较长,感兴趣的可以去看看大神的示例,看看一个简单的示例都能写的这么丰富多彩和适用性强。

知道大家都是大忙人了,更多的时候,都是希望代码直接拿来就能用了,这里道哥给大家简化了一下代码。

整体思路非常简单,以下几个关键点:

  1. 指定syslog server的通信协议UDP或TCP,就像两个人相亲一样,一个用英语,一个用汉语,那肯定沟通不了啊,那中间人得干着急啊。
  2. server和client端要定义一致的host和port。大哥,你去相亲的时候,得协商好见面时间和地点啊,不然你难道要满大街的去问,Hi,美女,你是来和我相亲的么。
  3. 启动server线程。大神已经帮你封装好了,server的线程以系统守护进程的形式启动。帅哥美女你们两个只管好好聊天,联系感情。
  4. sleep一会哦,这个非常重要,但不要理解歪了,这个是让系统睡一会,哈哈,主要是保证这个server的jvm进程暂时不要退出,退出了,你就等不到你的约会对象了哦,更别提接下来的沟通交流了。
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。

然后就是尽情的撩妹了,不对,是尽情的沟通了。

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⊙)…,好心急啊,不知道对方长什么样,好看呢,还是漂亮呢,能喜欢我这个屌丝程序员么?

约会美女上线,启动了,发出了她的消息

YJVRbeZ.png!web

这时候,syslog的server端弹出了消息

receive from:/127.0.0.1:62749	message-host.local {"message":"约会时间:Mar 28 21:57:08 ;羞答答的美女:我是小红啦;暗号:万般皆下品,唯有编码屌;"}

擦,道哥靠谱啊,暗号对,接下来就看哥哥我的了。

后记

有了maven依赖包的神助,syslog的使用还是比较简单的。有时候大家遇到约会不畅(收发消息有问题),首先检查双方使用的通信协议是否一致,端口号是否一致,是否被占用。

能够看到这里的都是真爱啊,觉得有用的话,就点个赞。转发是对道哥最大的鼓励,点个关注,就不会错过道哥的更新了。

程序员的小伙伴们,学习之路,同行的人越多才可以走的更远,加入公众号[程序员之道],一起交流沟通,走出我们的程序员之道!

nmUFjqv.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK