通过log4j可以实现将日志内容发送到其他服务器,其他机器可以再对日志做统一处理,比如发送邮件,发送短信,日志分析等等。具体demo如下:
1. 客户端代码
客户端代码分为log4j的配置文件,和客户端记录log4j日志类
log4j.xml内容如下
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE log4j:configuration SYSTEM "dtd/log4j.dtd">
- <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{ABSOLUTE\} %5p %c{1\}:%L - %m%n"/>
- </layout>
- </appender>
- <appender name="remoteFile" class="org.apache.log4j.net.SocketAppender">
- <param name="remoteHost" value="127.0.0.1" /><!-- 这是远程log server -->
- <param name="port" value="4445" /><!-- 这是远程log server port -->
- <param name="Threshold" value="INFO" /><!-- log 级别 -->
- <param name="ReconnectionDelay" value="1000" />
- <param name="LocationInfo" value="true" />
- </appender>
- <logger name="testRemote" additivity="false">
- <level value="INFO" />
- <appender-ref ref="STDOUT" />
- </logger>
- <logger name="testRemote2" additivity="false">
- <level value="INFO" />
- <appender-ref ref="remoteFile" />
- </logger>
- <root>
- <level value="info" />
- <appender-ref ref="STDOUT" />
- </root>
- </log4j:configuration>
测试类如下
- public class Log4JSocketAppenderTest
- {
- public static void main(String[] args) throws Exception
- {
- //发送日志记录时间
- long runTime = 1000 * 60 * 1;
- DOMConfigurator.configure(Log4JSocketAppenderTest.class.getResource("log4j.xml"));
- Logger remoteLogger = LogManager.getLogger("testRemote2");
- long i = 0;
- String sendInfo = "the send info is ";
- long old = System.currentTimeMillis();
- while (true)
- {
- System.out.println("send info begin: " + sendInfo + i);
- remoteLogger.info(sendInfo + i);
- i++;
- //每3秒记录一次日志
- Thread.sleep(1000 * 3);
- long now = System.currentTimeMillis();
- if((now - old) > runTime)
- {
- break;
- }
- }
- }
- }
2. 服务端代码
服务端代码是监听对应的端口,并接收log4j发过来的内容
- import java.net.InetAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- import org.apache.log4j.Logger;
-
- public class LogSocketServer implements Runnable
- {
- private static final Logger logger = Logger.getLogger(LogSocketServer.class);
-
- public void run()
- {
- logger.debug("begin call listen log info .....");
- ServerSocket serverSocket;
- Socket socket = null;
- try
- {
- //如果没有配置端口 则抛出异常
- serverSocket = new ServerSocket(4445);
-
- while (true) {
-
- logger.info("Waiting to accept a new client.");
-
- socket = serverSocket.accept();
-
- InetAddress inetAddress = socket.getInetAddress();
-
- logger.debug("Connected to client at " + inetAddress);
-
- logger.debug("Starting new socket node.");
-
- new Thread(new LogSocketNode(socket)).start();
-
- }
- }
- catch (Exception e)
- {
- logger.error("error in liston info ", e);
- }
-
- }
- }
-
-
-
-
- import java.io.BufferedInputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.net.Socket;import org.apache.log4j.Logger;
- import org.apache.log4j.spi.LoggingEvent;public class LogSocketNode implements Runnable {
-
- Socket socket;
- ObjectInputStream ois;
- static Logger logger = Logger.getLogger(LogSocketNode.class);
- public LogSocketNode(Socket socket) {
- this.socket = socket;
- try {
- ois = new ObjectInputStream(new BufferedInputStream(
- socket.getInputStream()));
- } catch (Exception e) {
- logger.error("Could not open ObjectInputStream to " + socket, e);
- }
- }
-
-
- public void run() {
- LoggingEvent event;
- try {
- if (ois != null) {
- while (true) {
- // read an event from the wire
- event = (LoggingEvent) ois.readObject();
- System.out.println("get log info is : " + event.getMessage());
- }
-
- }
-
- } catch (java.io.EOFException e) {
-
- logger.error("Caught java.io.EOFException closing conneciton.");
-
- } catch (java.net.SocketException e) {
-
- logger.error("Caught java.net.SocketException closing conneciton.");
-
- } catch (IOException e) {
-
- logger.error("Caught java.io.IOException: " + e);
-
- logger.error("Closing connection.");
-
- } catch (Exception e) {
-
- logger.error("Unexpected exception. Closing conneciton.", e);
-
- } finally {
-
- if (ois != null) {
-
- try {
- logger.debug("begin close ois");
- ois.close();
- logger.debug("end close ois");
-
- } catch (Exception e) {
-
- logger.error("Could not close connection.", e);
-
- }
-
- }
-
- if (socket != null) {
-
- try {
- logger.debug("begin close socket");
- socket.close();
- logger.debug("end close socket");
-
- } catch (IOException ex) {
- logger.error("socket close error ", ex);
- }
-
- }
-
- }
-
- }
- }
- import java.net.InetAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- import org.apache.log4j.Logger;
- public class LogSocketServer implements Runnable
- {
- private static final Logger logger = Logger.getLogger(LogSocketServer.class);
- public void run()
- {
- logger.debug("begin call listen log info .....");
- ServerSocket serverSocket;
- Socket socket = null;
- try
- {
- //如果没有配置端口 则抛出异常
- serverSocket = new ServerSocket(4445);
- while (true) {
- logger.info("Waiting to accept a new client.");
- socket = serverSocket.accept();
- InetAddress inetAddress = socket.getInetAddress();
- logger.debug("Connected to client at " + inetAddress);
- logger.debug("Starting new socket node.");
- new Thread(new LogSocketNode(socket)).start();
- }
- }
- catch (Exception e)
- {
- logger.error("error in liston info ", e);
- }
- }
- }
- import java.io.BufferedInputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.net.Socket;import org.apache.log4j.Logger;
- import org.apache.log4j.spi.LoggingEvent;public class LogSocketNode implements Runnable {
- Socket socket;
- ObjectInputStream ois;
- static Logger logger = Logger.getLogger(LogSocketNode.class);
- public LogSocketNode(Socket socket) {
- this.socket = socket;
- try {
- ois = new ObjectInputStream(new BufferedInputStream(
- socket.getInputStream()));
- } catch (Exception e) {
- logger.error("Could not open ObjectInputStream to " + socket, e);
- }
- }
- public void run() {
- LoggingEvent event;
- try {
- if (ois != null) {
- while (true) {
- // read an event from the wire
- event = (LoggingEvent) ois.readObject();
- System.out.println("get log info is : " + event.getMessage());
- }
- }
- } catch (java.io.EOFException e) {
- logger.error("Caught java.io.EOFException closing conneciton.");
- } catch (java.net.SocketException e) {
- logger.error("Caught java.net.SocketException closing conneciton.");
- } catch (IOException e) {
- logger.error("Caught java.io.IOException: " + e);
- logger.error("Closing connection.");
- } catch (Exception e) {
- logger.error("Unexpected exception. Closing conneciton.", e);
- } finally {
- if (ois != null) {
- try {
- logger.debug("begin close ois");
- ois.close();
- logger.debug("end close ois");
- } catch (Exception e) {
- logger.error("Could not close connection.", e);
- }
- }
- if (socket != null) {
- try {
- logger.debug("begin close socket");
- socket.close();
- logger.debug("end close socket");
- } catch (IOException ex) {
- logger.error("socket close error ", ex);
- }
- }
- }
- }
- }