为了账号安全,请及时绑定邮箱和手机立即绑定

以编程方式配置Log4j记录器

以编程方式配置Log4j记录器

达令说 2019-10-23 15:30:50
我正在尝试log4j第一次使用SLF4J(带绑定)。我想配置3个不同的命名Logger,它们可以由LoggerFactory返回,它将记录不同的级别并将消息推送到不同的附加程序:记录器1“ FileLogger”记录调试并附加到 DailyRollingFileAppender记录器2“ TracingLogger”记录TRACE +并追加到 JmsAppender记录器3“ ErrorLogger”记录ERROR +并追加到其他记录器 JmsAppender此外,我希望以编程方式配置它们(使用Java,而不是XML或log4j.properties文件)。我可以想象,通常情况下,我会Logger在一些自举代码中的某处(如init()方法)定义这些。但是,由于我想使用slf4j-log4j,我对在哪里定义记录器并使它们可用于类路径感到困惑。我不认为这违反了SLF4J的基本目的(作为外观),因为我使用SLF4J API的代码永远不会知道这些记录器存在。我的代码只是对SLF4J API进行了常规调用,然后将它们转发到它在类路径中找到的log4j Logger。但是,如何在Java中的类路径上配置这些log4j Logger?
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

听起来您正在尝试从“两端”(使用者端和配置端)使用log4j。


如果要针对slf4j api进行编码,但要提前(并以编程方式)确定类路径将返回的log4j Logger的配置,则绝对必须具有某种利用惰性构造的日志记录适配。


public class YourLoggingWrapper {

    private static boolean loggingIsInitialized = false;


    public YourLoggingWrapper() {

        // ...blah

    }


    public static void debug(String debugMsg) {

        log(LogLevel.Debug, debugMsg);

    }


    // Same for all other log levels your want to handle.

    // You mentioned TRACE and ERROR.


    private static void log(LogLevel level, String logMsg) {

        if(!loggingIsInitialized)

            initLogging();


        org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger("DebugLogger");


        switch(level) {

        case: Debug:

            logger.debug(logMsg);

            break;

        default:

            // whatever

        }

    }


    // log4j logging is lazily constructed; it gets initialized

    // the first time the invoking app calls a log method

    private static void initLogging() {

        loggingIsInitialized = true;


        org.apache.log4j.Logger debugLogger = org.apache.log4j.LoggerFactory.getLogger("DebugLogger");


        // Now all the same configuration code that @oers suggested applies...

        // configure the logger, configure and add its appenders, etc.

        debugLogger.addAppender(someConfiguredFileAppender);

    }

使用这种方法,您无需担心log4j记录器的配置位置/时间。类路径第一次要求它们时,它们会被延迟构造,传递回并通过slf4j提供。希望这对您有所帮助!


查看完整回答
反对 回复 2019-10-23
  • 3 回答
  • 0 关注
  • 405 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信