以编程方式配置Log4j记录器

我正在尝试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?


达令说
浏览 406回答 3
3回答

潇潇雨雨

听起来您正在尝试从“两端”(使用者端和配置端)使用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提供。希望这对您有所帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java