zoukankan      html  css  js  c++  java
  • 手把手教你用java实现syslog消息的收发,学不会你打我喽!

    大家好,我是道哥,专注于后端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 + "	message" + 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⊙)…,好心急啊,不知道对方长什么样,好看呢,还是漂亮呢,能喜欢我这个屌丝程序员么?

    约会美女上线,启动了,发出了她的消息
    在这里插入图片描述

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

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

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

    后记

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

    能够看到这里的都是真爱啊,觉得有用的话,就点个赞。转发是对道哥最大的鼓励,点个关注,就不会错过道哥的更新了。
    程序员的小伙伴们,学习之路,同行的人越多才可以走的更远,加入公众号[程序员之道],一起交流沟通,走出我们的程序员之道!

    在这里插入图片描述

  • 相关阅读:
    PHP WEB项目文件夹上传下载解决方案
    .NET WEB项目文件夹上传下载解决方案
    C#.NET WEB项目文件夹上传下载解决方案
    python 多重继承
    python 多态
    python 类型判断-- isinstance函数
    python 继承
    hdu 5692 Snacks 线段树+dfs
    线段树的输出
    python 定义类方法
  • 原文地址:https://www.cnblogs.com/chanllenge/p/12590959.html
Copyright © 2011-2022 走看看