java - Log4j输出完整的类名和包

标签 java logging log4j slf4j

在一个项目中,我使用 slf4j 和 log4j 作为底层日志库。 我希望我的日志事件具有注册事件的包和类名称。一些琐碎的事情,比如:com.project.MyClass。

我知道,通常情况下,我可以使用 %c 或 %C 转换字符来实现此目的,但在这种特定情况下我不能。我的日志事件必须以特定格式显示一些固定数量的值。我不想在对记录器进行的每次调用中都编写该特定格式,因此我创建了一个包装类,其中包含记录器作为静态变量。在这个包装类中,我创建了必要的方法来以适当的格式进行日志记录,例如信息、调试和错误。这是代码示例:

    public final class AppLog {
        private static final Logger APP_LOGGER = LoggerFactory.getLogger("ApplicationLogger");

        public static void info(String... args) {
            AppLog.APP_LOGGER.info(LogsUtils.generateLogString(args));
        }
        ...
    }

问题是,当使用 %c 或 %C 转换字符时,它们总是输出 com.project.WrapperClass 作为记录事件的类。考虑上面的代码: 我的 AppLog 类位于 Utils 包中。我的日志事件总是打印 Utils.AppLog 作为注册日志的包和类,但我希望它打印调用我的 AppLog 类的类名。它总是打印:

2014-04-04|10:57:16,057|ERROR|utils.AppLog
2014-04-04|10:57:16,060|ERROR|utils.AppLog
2014-04-04|11:11:04,708|INFO |utils.AppLog

我想要这个

2014-04-04|10:57:16,057|ERROR|com.project.domain.Person
2014-04-04|10:57:16,060|ERROR|com.project.dao.PersonDAO
2014-04-04|11:11:04,708|INFO |com.service.PersonService

解决此问题的一个解决方案是在每次调用包装类中的 info 方法时注入(inject) class.getName() 。但这对我来说似乎是一个非常肮脏的解决方案。还有其他我没有看到的解决方案可以解决我的问题吗?

Log4j 配置:

log4j.appender.APPLICATION=org.apache.log4j.DailyRollingFileAppender
log4j.appender.APPLICATION.file=${log.path}application.log
...
log4j.logger.ApplicationLogger=DEBUG, APPLICATION  
log4j.additivity.ApplicationLogger=false

提前致谢。

最佳答案

更新答案:

抱歉,我没有回答正确的问题。我之前的回答完全错误;

所以你的问题是你正在实例化记录器(使用LoggerFactory),并且始终使用相同的名称ApplicationLogger。 无法从此记录器找到 AppLog 对象的调用类,因为没有对其的引用。正如您所说,您可以在每次调用中注入(inject)记录器名称,但这将很难维护。

您可以尝试包装 Logger 类。

public final class AppLogger {

    private Logger logger;       

    protected AppLogger(String  loggerName) {
         this.logger = LoggerFactory.getLogger(loggerName);
    }

    public static AppLogger getAppLogger(String loggerName) {
         return new AppLogger(loggerName);
    }

    public void info(String... args) {
        this.logger.info(LogsUtils.generateLogString(args));
    }
    ...
}

在每个类中,不要使用 LoggerFactory 而是使用您自己的类。

private static final AppLogger APP_LOGGER = AppLogger.getLogger(CallingClass.class)

然后像这样记录

APP_LOGGER.info("message");

然后在您的图案布局中使用 %c (而不是 %C),它应该按预期工作!

关于java - Log4j输出完整的类名和包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22861201/

相关文章:

java - log4j-over-slf4j.jar 和 slf4j-log4j12.jar 冲突...但我没有 log4j-over-slf4j

java - 在整个对象中保持静态变量正确更新的问题

Java - BufferedReader 不从 url 读取

java - Storm Bolt 始终记录到worker.log

python-3.x - 在 StreamHandler 的 logging.basicConfig 中设置的自定义格式

java - 如何解决 Log4J No Such Property 警告/错误?

java - 我可以在 JAVA 中的非赋值情况下使用条件运算符吗?

java - java线程同步

c++ - 检测 printf() 参数中的函数调用

java - log4j - 为什么我的 appender 不显示消息?