如何使用java在logback.xml中打开/关闭appender

时间:2016-11-29 07:21:16

标签: java xml logback

我想用javacode打开/关闭stdout的appender。

这是logback.xml的一小部分:

 <root level="error">
    <appender-ref ref="FILE" />
    <appender-ref ref="STDOUT" />
</root>
 <if condition='property("log2console").contains("true")'>
    <then>
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${PATTERN}</pattern>
            </encoder>
        </appender>
                    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  <level>debug</level>
</filter>

如果我在启动应用程序之前设置了属性,它就可以了。但是如果应用程序启动并且我更改了属性“log2Console = true”,则它不起作用。

我使用的是文本文件。设置日志记录。第一个条目应启用log2Console,第二个条目设置loglevel。如果我启动应用程序,则loglevel正在运行但不启用“log2console” 我尝试了不同的方法:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

        try (BufferedReader br = new BufferedReader(new FileReader(log2Console))) {

            String sCurrentLine;
            boolean Enablelog2Console = false;
            while ((sCurrentLine = br.readLine()) != null) {
                if (sCurrentLine.equals("true")) {
                    Enablelog2Console = true;

                    Properties prop = new Properties();

                    //try with different optionen
                    prop.setProperty("log2console", "true");
                    lc.putProperty("log2console", "true");

                }
                if (Enablelog2Console) {
                    Logger rootLOG = (Logger) org.slf4j.LoggerFactory
                        .getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
                    if (sCurrentLine.equals("trace")) {
                        ((ch.qos.logback.classic.Logger) rootLOG).setLevel(Level.TRACE);

                    } else if (sCurrentLine.equals("debug")) {
                        ((ch.qos.logback.classic.Logger) rootLOG).setLevel(Level.DEBUG);
                    } else if (sCurrentLine.equals("info")) {
                        ((ch.qos.logback.classic.Logger) rootLOG).setLevel(Level.INFO);
                    } else if (sCurrentLine.equals("warn")) {
                        ((ch.qos.logback.classic.Logger) rootLOG).setLevel(Level.WARN);
                    } else if (sCurrentLine.equals("error")) {
                        ((ch.qos.logback.classic.Logger) rootLOG).setLevel(Level.ERROR);
                    }
                    System.out.println("das LogLevel wurde auf " + sCurrentLine + " eingestellt.");
                }
            }

        } catch (IOException e) {

2 个答案:

答案 0 :(得分:0)

您需要使用scan属性强制回退每X秒重新配置一次,例如:

<configuration scan="true" scanPeriod="30 seconds" >

更多信息可以在http://logback.qos.ch/manual/configuration.html#autoScan

找到

答案 1 :(得分:0)

您的logback.xml的结构应如下所示:

<configuration>

    <if condition='isDefined("otherlog")'>
        <then>
            <appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">
                <!-- Optional : filter logs at or above a level -->
                <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                    <level>INFO</level>
                </filter>
        ...
            </appender>
            <root level="debug">
                <appender-ref ref="CLOUD"/>
            </root>
        </then>
        <else>
            <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
                </encoder>
            </appender>

            <root level="INFO">
                <appender-ref ref="STDOUT"/>
            </root>

        </else>
    </if>

</configuration>

然后,如果您使用-Dotherlog=true运行应用程序,它将使用com.google.cloud.logging.logback.LoggingAppender,否则将使用ch.qos.logback.core.ConsoleAppender

相关问题