如何将 log4j 日志记录集成到我的客户端-服务器程序中?
How do I integrate log4j logging in my client-server program?
我是log4j的初学者,看来基本了解了。我的问题是我将在 2 台不同的机器上部署我的程序(假设机器 1 上的客户端和机器 2 上的服务器),那么我将如何进行日志记录?
我现在有以下内容:
log4j.properties:
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
# Set the name of the file
log4j.appender.FILE.File=log.out
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
# Set the append to false, overwrite
log4j.appender.FILE.Append=true
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
log4jTest.java :
包 ch.ethz.rama.asl.logger;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class log4jTest {
static Logger log = Logger.getLogger(ch.ethz.rama.asl.client.ClientInstance.class);
public static void main(String args[]) throws FileNotFoundException, IOException{
Properties props = new Properties();
props.load(new FileInputStream("/Users/ramapriyasridharan/Documents/asl_v1/ClientServerNio/bin/log4j.properties"));
PropertyConfigurator.configure(props);
log.debug("debug");
log.info("info");
}
}
那么我应该为客户端和服务器设置不同的记录器对象吗?此外,如果我想在客户端附加相同的文件,我应该使用某种方法传递记录器对象还是应该创建一个新对象?我对此有点困惑,谢谢
您肯定不需要传递记录器对象。
通常的做法是在每个需要记录的 class 中有单独的静态记录器对象。
通过这种方式,您可以了解 class 记录的确切消息。
使用 log4j 似乎无法从不同的应用程序写入单个文件。
这是可能的解决方案,但您需要切换日志记录库:
Different applications writing to same log4j log file
最好的方法是在每个 class 需要记录的地方定义一个记录器。您可能有一堆 classes,其中没有日志语句,因此无需在那里定义记录器。始终最好使用定义它的 class 来初始化记录器。
根据您使用记录器的位置,它必须定义为静态字段
public MyClass {
private static final Logger log = Logger.getLogger(MyClass.class);
}
或非静态字段:
public MyClass {
private final Logger log = Logger.getLogger(getClass());
}
记录器应该始终是私有的,没有任何 getter 方法,因此它只能在 class(或内部 classes)中使用。
为每个 class 定义一个记录器实例仍然允许您记录到同一个文件或控制台,只要您的所有对象 运行 在同一个 JVM 中。您还可以为不同的应用程序共享相同的日志配置,尽管这样可能会出现并发文件访问问题。我觉得每个应用程序最好有一个专用的日志文件。这将导致两个不同的日志文件,一个用于服务器,一个用于客户端,如果它们不在同一 JVM 中 运行。
使用 Class 定义记录器通常(取决于日志配置)打印出 class 名称作为日志事件的一部分(读取日志行)并且它因此很容易追踪 class 触发了日志事件。
我是log4j的初学者,看来基本了解了。我的问题是我将在 2 台不同的机器上部署我的程序(假设机器 1 上的客户端和机器 2 上的服务器),那么我将如何进行日志记录?
我现在有以下内容:
log4j.properties:
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
# Set the name of the file
log4j.appender.FILE.File=log.out
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
# Set the append to false, overwrite
log4j.appender.FILE.Append=true
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
log4jTest.java :
包 ch.ethz.rama.asl.logger;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class log4jTest {
static Logger log = Logger.getLogger(ch.ethz.rama.asl.client.ClientInstance.class);
public static void main(String args[]) throws FileNotFoundException, IOException{
Properties props = new Properties();
props.load(new FileInputStream("/Users/ramapriyasridharan/Documents/asl_v1/ClientServerNio/bin/log4j.properties"));
PropertyConfigurator.configure(props);
log.debug("debug");
log.info("info");
}
}
那么我应该为客户端和服务器设置不同的记录器对象吗?此外,如果我想在客户端附加相同的文件,我应该使用某种方法传递记录器对象还是应该创建一个新对象?我对此有点困惑,谢谢
您肯定不需要传递记录器对象。 通常的做法是在每个需要记录的 class 中有单独的静态记录器对象。
通过这种方式,您可以了解 class 记录的确切消息。
使用 log4j 似乎无法从不同的应用程序写入单个文件。
这是可能的解决方案,但您需要切换日志记录库: Different applications writing to same log4j log file
最好的方法是在每个 class 需要记录的地方定义一个记录器。您可能有一堆 classes,其中没有日志语句,因此无需在那里定义记录器。始终最好使用定义它的 class 来初始化记录器。
根据您使用记录器的位置,它必须定义为静态字段
public MyClass {
private static final Logger log = Logger.getLogger(MyClass.class);
}
或非静态字段:
public MyClass {
private final Logger log = Logger.getLogger(getClass());
}
记录器应该始终是私有的,没有任何 getter 方法,因此它只能在 class(或内部 classes)中使用。
为每个 class 定义一个记录器实例仍然允许您记录到同一个文件或控制台,只要您的所有对象 运行 在同一个 JVM 中。您还可以为不同的应用程序共享相同的日志配置,尽管这样可能会出现并发文件访问问题。我觉得每个应用程序最好有一个专用的日志文件。这将导致两个不同的日志文件,一个用于服务器,一个用于客户端,如果它们不在同一 JVM 中 运行。
使用 Class 定义记录器通常(取决于日志配置)打印出 class 名称作为日志事件的一部分(读取日志行)并且它因此很容易追踪 class 触发了日志事件。