如何使此应用程序中的Apache Log4J日志记录有用?

Cof*_*fee 12 java logging log4j

我有一个应用程序,这是一个简单的网络敲门笑话应用程序.我将一些Log4J(版本2)登录到其中.这是服务器类:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Level;

import java.net.*;
import java.io.*;

public class MessageResponseServer extends Thread /* added in the T just now*/{   /* REPLACED */

   private static final Logger logger = LogManager.getLogger("MessageResponseServer");
        logger.info("MessageResponseServer.java :  INFO message");
    public static void main(String[] args) throws IOException {

        logger.debug("MessageResponseServer.java : DEBUG  message");

        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            logger.fatal("MessageResponseServer.java :  FATAL  message - Could not listen on port: 4444.");

            System.exit(1);
        }

        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
                    logger.debug("MessageResponseServer.java :   , debug message");
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                clientSocket.getInputStream()));
        String inputLine, outputLine;
        MessageResponseProtocol mrp = new MessageResponseProtocol();  /* REPLACED */

        outputLine = mrp.processInput(null);
        out.println(outputLine);

        while ((inputLine = in.readLine()) != null) {
             outputLine = mrp.processInput(inputLine);
             out.println(outputLine);
             if (outputLine.equals("Bye."))
             logger.debug("MessageResponseServer.java : , Exiting. DEBUG Message"); 
                break;
        }
        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是XML文件:

<?xml version="1.0" encoding="UTF-8"?>


<Configuration status="WARN">
  <Appenders>

    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <File name="MyFile" fileName="OutputLogFile.log" immediateFlush="false" append="true">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>

  </Appenders>

  <Loggers>
    <Root level="ALL">
      <Appender-Ref ref="Console"/>
      <Appender-Ref ref="MyFile"/>  

    </Root>


  </Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

我想做的是弄清楚如何使日志记录更有用.您是否添加了特殊if语句来决定是否记录某些内容(例如,如果用户输入"退出",我可以对其进行特定登录).

是否有可能将性能指标纳入日志记录?这对我来说真的很有用.我的目标是让代码演示一些可能有助于使其在以后展示故障安全功能的东西(也就是说,如果它被中止,我们可能会利用日志重新启动客户端).

谢谢

rma*_*how 3

许多日志记录框架的核心思想是,您不决定在应用程序中做什么,而是在配置中决定。因此,基本上,您的应用程序会记录所有内容,并且您的配置“过滤”并将输出发送到正确的位置(即不同的文件、系统日志,甚至完全忽略它)

一般来说,在开发环境中,您想要记录更多信息,因此您可能将所有内容设置为“DEBUG”,而在生产环境中,您将其设置为“INFO”。

有时,采用如下模式可能会有所帮助:

 if(log.isDebug()) {
       log.debug("some formatting");
 }
Run Code Online (Sandbox Code Playgroud)

以避免执行格式化(在本例中)并随后立即将其丢弃。

您的模式布局也有点问题 - 例如,检索行号不可靠(它基本上取决于使用 debug=true 编译的代码)并且非常昂贵(它必须检索堆栈跟踪并从中提取行信息) 。

对于实际的执行时间指标,您可能想看看其他地方 - 一个提供计数器和时间测量(包括最大值、最小值、平均值等)的优秀库是metrics-core:

https://dropwizard.github.io/metrics/3.1.0/manual/core/

如果你使用的是 spring,你可能想看看我基于这个库的方面:

https://github.com/rmalchow/metrics