java - Log4J SocketAppender 吞下来自远程客户端的调试信息

标签 java sockets log4j cluster-computing

我配置了一个 SimpleSocketServer

public class Simple {

    public static void main(String[] args) {  
        try  
        {  
        String[] arguments = {"4445", "src/server.xml"};  
        SimpleSocketServer.main(arguments);  

        }  
        catch (Exception ex)  
        {  
          System.out.println(ex.getMessage());
        }  
}
}

具有以下配置:

服务器.xml

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">  
<appender name="rolling" class="org.apache.log4j.RollingFileAppender">  
    <layout class="org.apache.log4j.PatternLayout">  
      <param name="ConversionPattern" value="%5p (%d{DATE}) [%t] (%F:%L) - %m%n"/>  
    </layout>  
    <param name="File" value="C:/ponies/async.log"/>  
    <param name="MaxFileSize" value="10KB"/>  
    <param name="MaxBackupIndex" value="5"/>  
  </appender>  

  <root>   
    <param name="level" value="INFO"/>  
    <appender-ref ref="rolling" />   
  </root>  
</log4j:configuration> 

和一个客户端应用程序:

public class Client {

    private static Log logger = LogFactory.getLog(Client.class);
    public static void main(String[] a) {
        // -- Start a new SocketNode

        try {
            DOMConfigurator.configure("client.xml"); 
            String m_hostName = "localhost";
            String m_port = "4445";
            System.out.println("Accessing socket on host " + m_hostName
                    + " through port " + m_port);
            Socket socket = new Socket(m_hostName,
                    new Integer(m_port).intValue());

            // -- All right so far, now create the SocketNode
            System.out.println("Create the SocketNode listener");
            SocketAppender sa = new SocketAppender("localhost", 4445);
            System.out.println("Activating!");
            sa.activateOptions();
            System.out.println("Attempting to log");
            String logMsg = "Writing log event through SocketAppender instance";
            LoggingEvent le = new LoggingEvent("category",Logger.getRootLogger(),new Date().getTime(),Level.DEBUG,logMsg,new Throwable());
            System.out.println("Appending!");
            sa.append(le);
            logger.info("Testing!");
            new SocketNode(socket, new Hierarchy(Logger.getRootLogger()));
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

正确记录到文件 async.log

客户端.xml

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">  
  <appender name="async" class="org.apache.log4j.AsyncAppender">  
  <appender-ref ref="console" />  
  <appender-ref ref="socket" />  
  <param name="Blocking" value="false"/>  
  <param name="bufferSize" value="256"/>  
  </appender>  

  <appender name="socket" class="org.apache.log4j.net.SocketAppender">  
  <param name="Port" value="4445"/>  
  <param name="RemoteHost" value="localhost"/>  
  <param name="ReconnectionDelay" value="5000"/>  
  <param name="LocationInfo" value="true"/>  
  </appender>  

  <appender name="console" class="org.apache.log4j.ConsoleAppender">   
    <param name="Target" value="System.out"/>   
    <layout class="org.apache.log4j.PatternLayout">   
      <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>   
    </layout>   
  </appender>  

  <logger name="com.test.Client">  
  <param name="level" value="INFO"/>  
  </logger>  

  <root>   
    <param name="level" value="INFO"/>  
    <appender-ref ref="async" />   
  </root>  

</log4j:configuration> 

日志文件摘录:

INFO (30 Mar 2012 09:53:21,592) [main] (SimpleSocketServer.java:63) - Waiting to accept a new client.
 INFO (30 Mar 2012 09:53:24,466) [main] (SimpleSocketServer.java:65) - Connected to client at /127.0.0.1
 INFO (30 Mar 2012 09:53:24,466) [main] (SimpleSocketServer.java:66) - Starting new socket node.
 INFO (30 Mar 2012 09:53:24,466) [main] (SimpleSocketServer.java:63) - Waiting to accept a new client.
 INFO (30 Mar 2012 09:53:24,466) [main] (SimpleSocketServer.java:65) - Connected to client at /127.0.0.1
 INFO (30 Mar 2012 09:53:24,466) [main] (SimpleSocketServer.java:66) - Starting new socket node.
 INFO (30 Mar 2012 09:53:24,498) [main] (?:?) - Testing!  //This is the line of interest

我的问题是如何使最后一行 [main] (?:?) - Testing! 记录发送它的节点以及它出现的行?

最佳答案

添加

<param name="LocationInfo" value="true" />

也在“异步”appender 上。

然后尝试使用这个 Client 类

public static void main(String[] a) {
    try {
        DOMConfigurator.configure("src/forum9944681/client.xml");
        logger.info("Testing!");
        Thread.sleep(60000);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

关于java - Log4J SocketAppender 吞下来自远程客户端的调试信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944681/

相关文章:

java - Java 1.7 中 SimpleDateFormat 的行为变化?

java - 在java中杀死线程

Java 泛型类型参数

java - 在 Java 服务器应用程序中管理多个套接字连接

java - C服务器与Java客户端之间的Socket编程

java - SLF4J Log4J Jboss 4.3 和 EJB 3.0

java - log4j:在文件中写入日志语句时出错

java - 记录任意对象

java - 某些jsp页面的间歇性Tomcat ClassNotFoundException

c - 如何在没有 root 权限的情况下从 Linux 上的 C 中的 UDP 数据包中取回超过 TTL 的错误消息?