Java 是否可以通过编程方式设置回写配置?

Java 是否可以通过编程方式设置回写配置?,java,spring-boot,logback,syslog,Java,Spring Boot,Logback,Syslog,我是新来的logback,我想以编程方式配置logback。目前我使用的静态配置如下所示: <configuration> <appender name="KIWI" class="ch.qos.logback.classic.net.SyslogAppender"> <syslogHost>localhost:8080</syslogHost> <facilit

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

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

本地主机:8080
本地0
%线程:%-5级别%logger{36}-%msg%n

可以动态设置syslogHost吗?

可以通过编程方式配置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("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %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);

    }
}
公共类MyLogbackConfigurer扩展ContextAwareBase实现配置器{
@凌驾
公共无效配置(LoggerContext lc){
addInfo(“设置默认配置”);
ConsoleAppender ca=新的ConsoleAppender();
ca.setContext(lc);
ca.setName(“控制台”);
LayoutWrappingCoder编码器=新的LayoutWrappingCoder();
编码器.setContext(lc);
//同
//PatternLayout=新的PatternLayout();
//layout.setPattern(“%d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n”);
TTLLLayout layout=新TTLLLayout();
布局。设置上下文(lc);
layout.start();
编码器。设置布局(布局);
ca.setEncoder(编码器);
ca.start();
FileAppender f=新的FileAppender();
f、 设置编码器(编码器);
f、 设置布局(布局);
f、 setContext(lc);
f、 setFile(“log.log”);
f、 setAppend(true);
f、 setName(“日志文件”);
f、 start();
Logger rootLogger=lc.getLogger(Logger.ROOT\u Logger\u 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下创建一个文件,该文件将包含配置程序的类名。这是我的生日礼物

我以前没有使用SyslogAppender,但您可以更改我给出的示例,您可以使用System.getProperty(“proName”)System.getenv(“envName”)

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

 <syslogHost>${SYSLOG}</syslogHost>
${SYSLOG}

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

您可能正在寻找感谢您的回复。如果您有任何示例代码可以使用上述代码,那将非常有用。我从未使用过它。我知道它存在的唯一原因是因为我提到了它,尽管我找不到好的例子(但可能我错过了一些东西)。如果您阅读了
Configurator
LoggerContext
Logger
(可能还有一些其他接口/类)的Javadoc,您应该能够知道该做什么。例如,使用
logger#addAppender(appender)
将appender添加到记录器。