概述
实现多系统日志收集功能
log4j直接配置syslog就可以发送消息到远程服务器,直接配置log.properties文件或log.xml文件即可
pom文件中加入
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
配置log.properties文件
第一种:
直接用log4j的jar包
#Log4j自带的SyslogAppender 默认发送到端口514
log4j.rootLogger=INFO,syslog
log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
log4j.appender.syslog.SyslogHost=127.0.0.1
log4j.appender.syslog.Facility=LOCAL1
log4j.appender.syslog.header=true
log4j.appender.syslog.Threshold=WARN
log4j.appender.syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.syslog.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
默认发送到端口514,可配置其他端口
第二种:
需要下载jar包的,
jar包可自行下载,也可以下载我的jar点这里下载
##第三方syslog4j
log4j.rootLogger=INFO,syslog1
log4j.appender.syslog1=org.productivity.java.syslog4j.impl.log4j.Syslog4jAppender
log4j.appender.syslog1.Facility=LOCAL0
log4j.appender.syslog1.Protocol=udp
log4j.appender.syslog1.host=127.0.0.1
log4j.appender.syslog1.Port=1512
log4j.appender.syslog1.Threshold=WARN
log4j.appender.syslog1.layout=org.apache.log4j.PatternLayout
可配置端口,但是输出内容格式固定,这个比较尴尬,没办法跟第一种一样自定义输出数据格式和内容。
注意:Threshold所定义级别为日志输出的最小级别,及其以上级别都能输出。
以上两种是基于.properties文件的,下面是配置xml文件。
配置log.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration>
<log4j:configuration>
<!--web.xml配置Log4jConfigListener-->
<!--控制台输出-->
<appender name="SYSLOG" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n"></param>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="fatal" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!--默认发送本地514端口-->
<appender name="SYSLOGout" class="org.apache.log4j.net.SyslogAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} - [ %p ] %m%n"></param>
</layout>
<param name="SyslogHost" value="127.0.0.1"/>
<param name="Facility" value="LOCAL1"/>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="WARN" />
<param name="levelMax" value="fatal" />
</filter>
</appender>
<root level="INFO">
<appender-ref ref="SYSLOG"/>
<appender-ref ref="SYSLOGout"/>
</root>
</log4j:configuration>
需要在web.xml中配置监听
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
还有一种方式,通过配置logback发送。
log.xml中配置发送服务器及最低日志级别
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>127.0.0.1</syslogHost>
<facility>LOCAL1</facility>
<suffixPattern>[%thread] [%level] %logger - %msg%n </suffixPattern>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
</appender>
web.xml中配置
<context-param>
<param-name>logbackConfigLocation</param-name>
<param-value>classpath:log.xml</param-value>
</context-param>
<listener>
<listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
</listener>
<注:生产服务器上可以把log.xml放入WEB-INF下classes中,就不需要配置监听了>
都使用udp发送,
接收方法:
public static void main(String[] args) throws SocketException {
int port=1512;
DatagramSocket socket= new DatagramSocket(port);
System.out.println("UDP服务器已启动.....");
byte[] buffer = new byte[8192];
while (true) {
if(socket.isClosed()){
System.out.println("UDP已关闭");
}
DatagramPacket incoming = new DatagramPacket(buffer,
buffer.length);
try {
socket.receive(incoming);
String msg = new String(incoming.getData(),0,incoming.getLength());
System.out.println("UDP接收端端口:" + port);
System.out.println("UDP客户端发送的内容是:" + msg);
System.out.println("UDP客户端IP:" + incoming.getAddress());
System.out.println("UDP客户端端口:" + incoming.getPort());
} catch (Exception e) {
e.printStackTrace();
}
}
}
记得先启动接收服务器再启动发送服务器,
就这么简单就实现了日志的发送、收集
实际操作中Exception信息会一条条接收,这需要在接收端判断是否属于Exception信息,然后根据一定的输出规则拼接成完整的异常信息
最后
以上就是英俊音响为你收集整理的log4j发送日志到远程服务器并接收,两种配置实现多系统日志收集功能的全部内容,希望文章能够帮你解决log4j发送日志到远程服务器并接收,两种配置实现多系统日志收集功能所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复