【问题标题】:How to use static Logger in multiple Classes effectively?如何有效地在多个类中使用静态 Logger?
【发布时间】:2016-04-28 15:06:17
【问题描述】:

我有三门课。

  • BaseLogger - 我们在这里创建 Logger 的静态实例。
  • BaseClass - 框架级类包含几乎在每个类中都使用的通用方法。
  • SomeClass - 它实现 BaseClass 并记录一些信息。

BaseLogger

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


public class BaseLogger {
    public final static Logger LOG =  LogManager.getLogger(BaseLogger.class);
}

基类

  public class BaseClass extends BaseLogger{
        //Some common methods used throughout Application.
    }

SomeClass

public class SomeClass extends BaseClass{
    public static void main(String[] args){
        LOG.info("Test Log");
    }
}

输出

2016-04-28 16:52:11 INFO  BaseLogger:7 - Test Log 

必需:有人可以指导我如何实现以下目标。

 2016-04-28 16:52:11 INFO  SomeClass:5 - Test Log

由于我使用了静态,所以我不允许在 LogManager.getLogger 中使用 this,我必须使用 BaseLogger 类名有人可以指导我如何打印当前类如果从其他类调用 LOG,则使用名称而不是 BaseLagger。

【问题讨论】:

  • 不要那样做。所有日志框架都设计为通过为每个类制作一个静态 Logger 来使用。此外,用所有“常用方法”制作一个“大师”类是一种严重的反模式;使其成为一个不需要任何继承的单独类,并将其方法公开。继承不是共享功能的正确方式。
  • 谢谢你的好建议。如果我们不使用继承并将 Logger 设为公共静态会怎样。它仍然会提供相同的输出而不是必需的输出。
  • 为每个类创建一个 Logger 并创建每个 private static final。您希望每个 Logger 的名称与使用它来记录消息的类匹配,因此日志条目清楚地表明它们的来源。这样做的成本可以忽略不计。即使您有 1,000 个类,1,000 个 Logger 对象在您的应用程序的占用空间中也几乎不会被注意到。

标签: java logging log4j


【解决方案1】:

在日志框架(Java util、apache logging、jboss logging 等)中定义的 Logger 模式 %c 从调用 logger 方法的类中获取完全限定的类名。

要以您需要的方式获取类名,您需要调整您的记录器模式以具有自定义模式,即 %X{classname}

在这里,可以在使用 MDC.put(“classname”,com.xxx.xxx) 调用 logger 之前在你的类中设置类名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多