2015-10-06 112 views
0

我是log4j的初学者,我似乎已经理解了基础知识。我的问题是,我将在2台不同的机器上部署我的程序(机器1上的客户机和机器2上的服务器可以说),那么我将如何进行日志记录?如何在客户端服务器程序中集成log4j日志记录?

我已在现在以下:

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"); 
    } 

} 

所以我应该为客户端和服务器有不同的记录器对象?另外如果我想在客户端追加相同的文件,我应该使用某种方法传递记录器对象,还是应该创建一个新对象?林有点困惑这个,谢谢

+0

Logger对象log是每个java类定义的。如果客户端和服务器都可以访问相同的文件系统,则可以对双方使用相同的配置,因此可以让它们登录到同一个文件中。如果服务器和客户端在同一个JVM中运行,您也可以登录到同一个控制台。然而,正如服务器和客户端通常指示两台物理上不同的机器一样,您应该在机器上本地登录不同的日志文件。 – hotzst

+0

@hotzst我的客户端和服务器都有很多类,因此对于每个类我都应该有一个单独的记录器?这意味着我将拥有相同数量的客户端/服务器类和记录器类? – LoveMeow

+1

是的,单独的记录器对象并不意味着不同的记录上下文。在代码中创建一个记录器将创建一个输出,该输出包含记录器所属类的名称,因此在日志文件中可以很容易地区分哪个记录行来自哪个类。 – hotzst

回答

1

做到这一点的最好办法是在每个地方有东西登录类来定义一个记录器。你可能有一堆类,没有日志语句,所以没有必要在那里定义一个记录器。用记录器定义的类来初始化记录器总是最好的。

基于你在哪里使用它必须是定义为一个静态字段

public MyClass { 
    private static final Logger log = Logger.getLogger(MyClass.class); 
} 

或非静态字段的记录:

public MyClass { 
    private final Logger log = Logger.getLogger(getClass()); 
} 

记录器应该永远是没有任何私人getter方法,所以它只能在类中使用(或在内部类中使用)。

定义每个类的记录器实例仍然允许您登录到同一个文件或控制台,只要所有对象都在同一个JVM中运行。您也可以为不同的应用程序共享相同的日志配置,但可能会出现并发文件访问问题。我觉得最好每个应用程序都有一个专用的日志文件。这将导致两个不同的日志文件,一个用于服务器,一个用于客户端,如果它们不在同一个JVM中运行的话。

使用定义记录器的类定义记录器通常(取决于日志配置)将该类名打印出来作为日志事件(读取记录行)的一部分,因此它很容易在哪个类中记录日志事件被触发。

0

你肯定不需要传递记录器对象。 通常的做法是在你需要记录的每个类中都有单独的静态记录器对象。

通过这种方式,您可以获得有关记录确切的类记录消息的信息。

它看起来像写入单个文件从不同的应用程序是不可能与log4j。

这里是可能的解决办法,但你需要切换日志库: Different applications writing to same log4j log file