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

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

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

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

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

后记

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

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

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

手把手教你用java实现syslog消息的收发,学不会你打我喽!的更多相关文章

  1. 手把手教你使用Java实现一个神经网络

    首先看一下运行效果: 下面是项目整体目录: 0.实现神经网络总览 神经网络由层.神经元.权重.激活函数和偏置组成.每层都有一个或者多个神经元,每一个神经元都和神经输入/输出连接,这些连接就是权重. 需 ...

  2. 手把手教你用java实现二分查找树及其相关操作

    二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...

  3. 手把手教你使用 Java 在线生成 pdf 文档

    一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查 ...

  4. 手把手教你搭建JAVA分布式爬虫

    在工作中,我们经常需要去获取一些数据,但是这些数据可能需要从第三方平台才可以获取到.这个时候,爬虫系统就可以帮助我们来完成这些事情. 提到爬虫系统,很多人都会想到使用python.但实际上,语言只是一 ...

  5. 手把手教你用Java获取IP归属地

    前几个月微信公众号上线了IP归属地的功能,后续知乎.抖音等平台纷纷添加了该功能.如果是国内的用户精确到省份,国外用户精确到国家.本文就使用Java实现获取IP归属地. ! 主要讲解几个步骤: Java ...

  6. 手把手教你用redis实现一个简单的mq消息队列(java)

    众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Zero ...

  7. 《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)

    1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast,那么这个toast我们这边如何进行测试呢?今天宏哥就分两篇介绍一下. ...

  8. 《手把手教你》系列基础篇(八十四)-java+ selenium自动化测试-框架设计基础-TestNG日志-上篇(详解教程)

    1.简介 TestNG还为我们提供了测试的记录功能-日志.例如,在运行测试用例期间,用户希望在控制台中记录一些信息.信息可以是任何细节取决于目的.牢记我们正在使用Selenium进行测试,我们需要有助 ...

  9. 《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)

    1.简介 自动化测试中如何输出日志文件.任何软件,都会涉及到日志输出.所以,在测试人员报bug,特别是崩溃的bug,一般都要提供软件产品的日志文件.开发通过看日志文件,知道这个崩溃产生的原因,至少知道 ...

随机推荐

  1. tar:file-changed-as-we-read-it报错处理

    在使用tar命令对Mysql的数据目录进行备份打包时出现如下报错: tar cvzf mysql.tgz mysql /bin/tar: /path/to/mysql: file changed as ...

  2. 解决appium升级后不支持使用name定位的问题

    前言 之前一直用的appium1.4版本,最近升级到了1.6突然发现之前的脚本好多都跑失败了,一看报错: selenium.common.exceptions.InvalidSelectorExcep ...

  3. css雪碧图压缩

    cssgaga下载地址 链接: https://pan.baidu.com/s/1Q9xH_XzumIc7vTLCZ3tr5A 提取码: stqe CssGaga功能特性 合并import的CSS文件 ...

  4. Kali系统中20个超好用黑客渗透工具,你知道几个?

    1. Aircrack-ng Aircrack-ng是用来破解WEP/WAP/WPA 2无线密码最佳的黑客工具之一! 它通过接收网络的数据包来工作,并通过恢复的密码进行分析.它还拥有一个控制台接口.除 ...

  5. Vmware安装的linux系统开机黑屏,关闭显示虚拟机忙怎么怎么解决?

    在vm虚拟机中,可能会遇到打开一台主机直接黑屏,而且无法关闭,关闭会显示虚拟机繁忙这种情况,如下图: 一般是因为没有正常关机或者操作不当导致的   对此,解决办法一般有两种 第一种方法: 1.重启电脑 ...

  6. Java8 新特性2——强大的Stream API

    强大的Stream API Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.简而言之,Stream API 提供 ...

  7. 前端开发--Mongodb篇

    安装和启动 安装 官方安装文档 本地mac Os推荐使用Homebrew ⚠️ 目前直接使用--brew install mongodb-- 安装 mongodb 时提示:Error: No avai ...

  8. Jave基本数据类型

    基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一下与基本类型相关的知识. ...

  9. 无损卡尔曼滤波UKF(3)-预测-生成Sigma点

    无损卡尔曼滤波UKF(3)-预测-生成Sigma点 1 选择创建Sigma点 A 根据 已知上一个时间戳迭代出来的 后验状态 x_{k|k} 和后验协方差矩阵 P_{k|k} 他们代表当前状态的分布. ...

  10. 第四篇(1):企业常用Linux web环境安装配置(apache、php、mysql)

    上篇我们讲了基本的软件包管理和文件操作什么的,现在也要动手安装点有用的东西了吧! 本篇我会写出一个用yum安装apache.php.mysql的方法,最后再运行phpMyAdmin来管理数据库. 1. ...