是否可以以编程方式设置 logback 配置?

Posted

技术标签:

【中文标题】是否可以以编程方式设置 logback 配置?【英文标题】:Is it possible to setup logback configuration programmatically? 【发布时间】:2020-11-29 05:56:58 【问题描述】:

我是 logback 的新手,我想以编程方式配置 logback。目前我正在使用如下静态配置:

<configuration>
    <appender name="KIWI" class="ch.qos.logback.classic.net.SyslogAppender">
        <syslogHost>localhost:8080</syslogHost>
        <facility>LOCAL0</facility>
        <suffixPattern>%thread: %-5level %logger36 - %msg%n</suffixPattern>
    </appender>
    
    <logger name="com.javacodegeeks.examples.logbacksyslogexample.message.kiwi" level="INFO">
        <appender-ref ref="KIWI" />
    </logger>
</configuration>

是否可以动态设置syslogHost?

【问题讨论】:

您可能正在寻找logback.qos.ch/apidocs/ch/qos/logback/classic/spi/… 感谢您的回复。如果您有任何示例代码可以使用上述内容,那将非常有帮助。 我没用过。我知道它存在的唯一原因是因为this documentation 提到了它,虽然我找不到好的例子(但也许我错过了一些东西)。如果您阅读了ConfiguratorLoggerContextLogger(可能还有其他一些接口/类)的Javadoc,您应该能够弄清楚该怎么做。例如,您使用Logger#addAppender(Appender) 将附加程序添加到记录器。 【参考方案1】:

是的,可以通过编程方式配置 logback,您需要扩展 ContextAwareBase 并实现 Configurator,如下面的代码

public class MyLogbackConfigurer extends ContextAwareBase implements Configurator 
    @Override
    public void configure(LoggerContext lc) 
        addInfo("Setting up default configuration.");

        ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
        ca.setContext(lc);
        ca.setName("console");
        LayoutWrappingEncoder<ILoggingEvent> encoder = new LayoutWrappingEncoder<ILoggingEvent>();
        encoder.setContext(lc);


        // same as
        // PatternLayout layout = new PatternLayout();
        // layout.setPattern("%dHH:mm:ss.SSS [%thread] %-5level %logger36 - %msg%n");
        TTLLLayout layout = new TTLLLayout();

        layout.setContext(lc);
        layout.start();
        encoder.setLayout(layout);

        ca.setEncoder(encoder);
        ca.start();

        FileAppender f=new FileAppender();
        f.setEncoder(encoder);
        f.setLayout(layout);
        f.setContext(lc);
        f.setFile("log.log");
        f.setAppend(true);
        f.setName("logFile");
        f.start();

        Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        rootLogger.addAppender(ca);
        rootLogger.addAppender(f);


        Logger springLogger = lc.getLogger("org.springframework");
        springLogger.setLevel(Level.WARN);

    

您需要在 src/main/resources/META-INF/services/ch.qos.logback.classic.spi.Configurator 下创建一个文件,其中包含您的类名配置器。这是我的example 和config。

我之前没有使用过 SyslogAppender,但你可以更改我给出的示例,你可以使用 System.getProperty("proName")System.getenv("envName")强>

在从头开始实现所有内容之前,您是否尝试过像下面这样更改 xml?

 <syslogHost>$SYSLOG</syslogHost>

并像这样运行 jar “java -jar yourjarpath.jar -DSYSLOG=localhost:8080” 这样您就不需要编写配置类 detailed doc。

【讨论】:

以上是关于是否可以以编程方式设置 logback 配置?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加配置文件和证书

如何使用 Java 代码配置 Logback 以设置日志级别?

以编程方式配置 Log4j 记录器

以编程方式在设置包 iOS 中提取默认电子邮件帐户

是否可以以编程方式设置应用程序的 DPI?

以编程方式加密 .NET 中的配置文件