详情
rsyslog的基本架构图如下。
这个实验的需求是测试两台服务器之间,使用rsyslog进行日志传输的性能。
rsyslog网上的资料非常少,使用java进行rsyslog收发的资料就更少了。
java是有一个jar包可以进行rsyslog编程的,在pom中引入如下坐标
<!-- https://mvnrepository.com/artifact/org.syslog4j/syslog4j -->
<dependency>
<groupId>org.graylog2</groupId>
<artifactId>syslog4j</artifactId>
<version>0.9.60</version>
</dependency>
我们使用这个jar包可以搭建syslog服务器和客户端,其中服务器是用来接收日志的,客户端是用来发送日志的,核心的代码有一下三个
客户端
public class ClientClass implements Runnable{
//控制循环结束的
private boolean flag = true;
private static ClientClass ClientClass = null;
private String host;
private int port;
// 用来记录发送数量
public static int num = 0;
// 记录开始时间
private static Long starttime = null;
public static long getspeed(){
if(starttime == null){
return 0L;
}
long endtime = System.currentTimeMillis();
if((endtime-starttime)/1000==0){
return 0L;
}
long speed = num / ((endtime-starttime)/1000);
return speed;
}
private static SyslogIF syslogIF;
private ClientClass (String host, int port) {
this.host = host;
this.port = port;
}
private ClientClass(){
}
public static synchronized ClientClass getClient(String host, int port)
{
if(ClientClass == null) {
ClientClass = new ClientClass(host, port);
}
return ClientClass ;
}
@Override
public void run() {
starttime = System.currentTimeMillis();
try {
//初始化标识位
flag = true;
//获取syslog的操作类,使用udp协议。syslog支持"udp", "tcp", "unix_syslog", "unix_socket"协议
SyslogIF syslog = Syslog.getInstance("tcp");
//设置syslog服务器端地址 地址为之前你服务器的地址
syslog.getConfig().setHost(host);
//设置syslog接收端口,默认514
syslog.getConfig().setPort(port);
//拼接syslog日志
System.out.println("+++++++++++++start++++++++++++");
while(flag) {
// 等级为debug
// 这句话就是发送数据
String str = "[" + num + "]->" + "operator Protocol "+ Thread.currentThread().getName();
syslog.log(SyslogConstants.LEVEL_DEBUG, URLDecoder.decode(str,"utf-8"));
num++;
// 给程序缓冲时间,没有缓冲时间接受不到数据
//Thread.sleep(100);
}
//System.out.println(Thread.currentThread().getName()+" end");
} catch (Exception e) {
System.err.println("出错了");
e.printStackTrace();
}
}
public void shutdown() {
try {
//线程停止
Thread.sleep(2000);
//改变标识位
flag = false;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
服务器
服务器分为服务器的代码和处理器的代码
public class SyslogServerEventHandler implements SyslogServerSessionEventHandlerIF {
private String syslog ;
// 记录接收的数量
public int num = 0;
//重写event方法
public void event(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, SyslogServerEventIF event) {
//判断传输时间是否存在,不存在将现在的时间设置为传输时间
String date = (event.getDate() == null ? new Date() : event.getDate()).toString();
//将解析日志的生成端,<<3是要该数左移动三位计算
String facility = SyslogUtility.getFacilityString(event.getFacility()<<3);
//讲解析日志的级别,级别越大越低
String level = SyslogUtility.getLevelString(event.getLevel());
//获取当前的源设备IP
String sourceIP = getIPAddress(socketAddress.toString());
//获取到信息主体
String msg = event.getMessage();
// 放入信息
// 这里就是接收到的所有消息
// ######################
setSyslog("这是一条记录 {" + facility + "} " + date + " " + level + " " + event.getMessage()+ " " +sourceIP );
// ######################
num++;
try {
// 生成一个实体类保存日志
LogEntity logEntity = new LogEntity();
logEntity.setUidrecordid(IdUtil.randomUUID());
logEntity.setContent(getSyslog());
Date date1 = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
logEntity.setDttime(formatter.format(date1));
GetList.addLogEntityList(logEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
/*
try {
//打印信息
// 这里是对于消息的处理
System.out.println(getSyslog());
} catch (UnsupportedEncodingException e) {
System.err.println("UnsupportedEncodingException");
}
*/
}
public String getSyslog() throws UnsupportedEncodingException {
return new String(sysl