log4j通过SocketAppender将日志内容发送到远程服务器

通过log4j可以实现将日志内容发送到其他服务器,其他机器可以再对日志做统一处理,比如发送邮件,发送短信,日志分析等等。具体demo如下:

1. 客户端代码

         客户端代码分为log4j的配置文件,和客户端记录log4j日志类

        log4j.xml内容如下

      

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <!DOCTYPE log4j:configuration SYSTEM "dtd/log4j.dtd">    
  3. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">    
  4.  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">         
  5.      <layout class="org.apache.log4j.PatternLayout">             
  6.         <param name="ConversionPattern" value="%d{ABSOLUTE\} %5p %c{1\}:%L - %m%n"/>       
  7.       </layout>      
  8. </appender>  
  9. <appender name="remoteFile" class="org.apache.log4j.net.SocketAppender">  
  10.          <param name="remoteHost" value="127.0.0.1" /><!-- 这是远程log server -->  
  11.          <param name="port" value="4445" /><!-- 这是远程log server port -->  
  12.          <param name="Threshold" value="INFO" /><!-- log 级别 -->  
  13.          <param name="ReconnectionDelay" value="1000" />  
  14.          <param name="LocationInfo" value="true" />  
  15. </appender>  
  16. <logger name="testRemote" additivity="false">  
  17.          <level value="INFO" />  
  18.          <appender-ref ref="STDOUT" />  
  19. </logger>  
  20. <logger name="testRemote2" additivity="false">  
  21.          <level value="INFO" />  
  22.          <appender-ref ref="remoteFile" />  
  23. </logger>  
  24. <root>    
  25.        <level value="info" />    
  26.        <appender-ref ref="STDOUT" />    
  27.  </root>    
  28. </log4j:configuration>   

  测试类如下

   

[java]  view plain copy
  1. public class Log4JSocketAppenderTest  
  2. {  
  3.     public static void main(String[] args) throws Exception  
  4.     {  
  5.         //发送日志记录时间  
  6.         long runTime = 1000 * 60 * 1;  
  7.         DOMConfigurator.configure(Log4JSocketAppenderTest.class.getResource("log4j.xml"));  
  8.         Logger remoteLogger = LogManager.getLogger("testRemote2");  
  9.         long i = 0;  
  10.         String sendInfo = "the send info is ";  
  11.         long old = System.currentTimeMillis();  
  12.         while (true)  
  13.         {  
  14.             System.out.println("send info begin:  " + sendInfo + i);  
  15.             remoteLogger.info(sendInfo + i);  
  16.             i++;  
  17.             //每3秒记录一次日志  
  18.             Thread.sleep(1000 * 3);  
  19.             long now = System.currentTimeMillis();  
  20.             if((now - old) > runTime)  
  21.             {  
  22.                 break;  
  23.             }  
  24.         }  
  25.     }  
  26. }  

 


2.  服务端代码

     服务端代码是监听对应的端口,并接收log4j发过来的内容 

  
  
  
[java] view plain copy
  1. import java.net.InetAddress;  
  2. import java.net.ServerSocket;  
  3. import java.net.Socket;  
  4. import org.apache.log4j.Logger;  
  5.   
  6. public class LogSocketServer implements Runnable  
  7. {  
  8.     private static final Logger logger = Logger.getLogger(LogSocketServer.class);  
  9.       
  10.     public void run()  
  11.     {  
  12.         logger.debug("begin call listen log info .....");  
  13.         ServerSocket serverSocket;  
  14.         Socket socket = null;  
  15.         try  
  16.         {     
  17.             //如果没有配置端口  则抛出异常  
  18.             serverSocket = new ServerSocket(4445);  
  19.               
  20.             while (true) {     
  21.                   
  22.              logger.info("Waiting to accept a new client.");     
  23.      
  24.                 socket = serverSocket.accept();     
  25.      
  26.                 InetAddress inetAddress = socket.getInetAddress();     
  27.      
  28.                 logger.debug("Connected to client at " + inetAddress);     
  29.      
  30.                 logger.debug("Starting new socket node.");     
  31.      
  32.                 new Thread(new LogSocketNode(socket)).start();     
  33.      
  34.             }     
  35.         }  
  36.         catch (Exception e)   
  37.         {     
  38.             logger.error("error in liston info  ", e);    
  39.         }     
  40.      
  41.     }  
  42. }  
  43.   
  44.    
  45.    
  46.   
  47. import java.io.BufferedInputStream;  
  48. import java.io.IOException;  
  49. import java.io.ObjectInputStream;  
  50. import java.net.Socket;import org.apache.log4j.Logger;  
  51. import org.apache.log4j.spi.LoggingEvent;public class LogSocketNode implements Runnable {  
  52.         
  53.      Socket socket;    
  54.      ObjectInputStream ois;    
  55.      static Logger logger = Logger.getLogger(LogSocketNode.class);    
  56.      public LogSocketNode(Socket socket) {    
  57.          this.socket = socket;    
  58.          try {    
  59.              ois = new ObjectInputStream(new BufferedInputStream(    
  60.                      socket.getInputStream()));    
  61.          } catch (Exception e) {    
  62.              logger.error("Could not open ObjectInputStream to " + socket, e);    
  63.          }    
  64.      }    
  65.      
  66.      
  67.      public void run() {    
  68.          LoggingEvent event;    
  69.          try {    
  70.              if (ois != null) {    
  71.                  while (true) {    
  72.                      // read an event from the wire     
  73.                       event = (LoggingEvent) ois.readObject();    
  74.                       System.out.println("get log info is : " + event.getMessage());    
  75.                  }    
  76.      
  77.              }    
  78.      
  79.          } catch (java.io.EOFException e) {    
  80.      
  81.              logger.error("Caught java.io.EOFException closing conneciton.");    
  82.      
  83.          } catch (java.net.SocketException e) {    
  84.      
  85.              logger.error("Caught java.net.SocketException closing conneciton.");    
  86.      
  87.          } catch (IOException e) {    
  88.      
  89.              logger.error("Caught java.io.IOException: " + e);    
  90.      
  91.              logger.error("Closing connection.");    
  92.      
  93.          } catch (Exception e) {    
  94.      
  95.              logger.error("Unexpected exception. Closing conneciton.", e);    
  96.      
  97.          } finally {    
  98.      
  99.              if (ois != null) {    
  100.      
  101.                  try {    
  102.                      logger.debug("begin close ois");  
  103.                      ois.close();   
  104.                      logger.debug("end close ois");  
  105.      
  106.                  } catch (Exception e) {    
  107.      
  108.                      logger.error("Could not close connection.", e);    
  109.      
  110.                  }    
  111.      
  112.              }    
  113.      
  114.              if (socket != null) {    
  115.      
  116.                  try {    
  117.                   logger.debug("begin close socket");  
  118.                      socket.close();    
  119.                      logger.debug("end close socket");  
  120.      
  121.                  } catch (IOException ex) {    
  122.                      logger.error("socket close error ", ex);  
  123.                  }    
  124.      
  125.              }    
  126.      
  127.          }    
  128.      
  129.      }    
  130.    }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值