当前位置: 首页 > 知识库问答 >
问题:

如何在我的客户端-服务器程序中集成log4j日志记录?

齐坚成
2023-03-14

我是log4j的初学者,我似乎已经理解了基础知识。我的问题是,我将在两台不同的机器上部署我的程序(机器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。爪哇:

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

}

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

共有2个答案

夏侯枫
2023-03-14

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

这样,您就有了关于从哪个确切的类记录的消息被记录的信息。

似乎使用log4j无法从不同的应用程序写入单个文件。

这是一个可能的解决方案,但您需要切换日志库:不同的应用程序写入同一个log4j日志文件

邴俊友
2023-03-14

最好的方法是在每个类中定义一个记录器,在那里有东西要记录。您可能有一堆类,其中没有日志语句,因此没有必要在那里定义记录器。最好始终使用定义记录器的类初始化记录器。

根据您使用记录器的位置,它必须被定义为静态字段

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

或非静态字段:

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

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

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

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

 类似资料:
  • 我有一些神秘的行为在我的Vaadin应用程序(随机我得到一个白色的浏览器窗口)。因此,我想激活日志一般为客户端和服务器端,希望能检测到一些有用的提示,什么是问题。为了激活客户端(GWT)的日志记录,我找到了如下内容,它必须放在widgetset.GWT.xml中: 但当我启动应用程序并记录了一些内容时,我只能看到一条错误消息: 但我要把它放在哪里?据我所知,Vaadin使用Java记录器。我正在使

  • 我知道有很多关于这个的问题,但是我确实经历了所有的问题,并且有点困惑自己,我列出了我遵循的步骤,请让我知道我把它搞砸了。 1) 我只想在应用程序级别使用Log4j,所以需要复制WL_HOME/server/lib/wllog4j。jar和log4j。jar在Domail_Home/Lib? 2) 我使用的是Maven,我在pom中添加了Log4j依赖项。xml[war]。我把战争藏在耳朵里。 3)

  • 我正在将我的应用程序从JBoss 6 AS迁移到Wildfly 8.2.0 AS。我可以实现按预期创建应用程序日志,但需要独立/日志/服务器。日志文件中也充满了应用程序日志。我正在使用独立的完整ha。xml配置。任何人都可以建议一个选项,禁止将应用程序日志填充到服务器中。日志 以下部分摘自standalone-full-ha.xml:

  • 问题内容: 我正在尝试使用我一直在努力的客户端/服务器程序实现多线程。我需要允许多个客户端同时连接到服务器。我目前有4类:客户端,服务器,协议和用于处理线程的工作器。以下代码是我对这些类的拥有的代码: SocketServer类: SocketClient类别: 协议类别: ClientWorker类: 当我运行服务器和客户端时,一切正常。然后,当我尝试运行另一个客户端时,它只是挂在那儿,没有提示

  • 我想同步2个集合。如果服务器端有什么变化,连接的客户端就会更新。我有一个非常基本的问题。我现在需要复制我的java项目,并在一个项目中编程服务器,在另一个项目中编程客户端吗?但这听起来像是相当多不必要的工作。我不能在一个项目中实现这一切,然后在一个主项目中启动服务器和客户端吗?我需要线程吗?我有点纠结于最好的方法是什么。提前谢谢。

  • 在我的TCP套接字程序中,我必须将数据从客户端发送到服务器。在服务器端,我必须读取流并将其写入文件。但是文件是创建的,里面什么都没有写。 客户端编码发送文件: 服务器读取输入流并将其写入文件: 到底是什么问题?