Java logback正在加载所有Appender

Java logback正在加载所有Appender,java,logback,fileappender,Java,Logback,Fileappender,我有一个logback.xml文件,其中有3个appender:1个ConsoleAppender和2个FileAppender <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <Target>System.out</T

我有一个logback.xml文件,其中有3个appender:1个ConsoleAppender和2个FileAppender

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <Target>System.out</Target>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}] %msg%m%n%ex</pattern>
        </encoder>
    </appender>

    <appender name="bAppender" class="ch.qos.logback.core.FileAppender">
        <file>logs/b.txt</file>
        <append>true</append>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}] -[%t] %-4r %-5p %c : %n%m%n</pattern>
        </encoder>
    </appender>


    <appender name="aAppender" class="ch.qos.logback.core.FileAppender">
        <file>logs/a.txt</file>
        <append>false</append>
        <encoder>
            <pattern>[%d{dd/MM/yyyy : HH:mm:ss}  %level - %logger] %m%n</pattern>
        </encoder>
    </appender>

    <logger name="aLogger" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="aAppender" />        
    </logger>

    <root level="info">
        <appender-ref ref="stdout"/>
    </root>
</configuration>

系统输出
[%d{yyyy-MM-dd HH:MM:ss}]%msg%m%n%ex
日志/b.txt
真的
[%d{yyyy-MM-dd HH:MM:ss}]-[%t]-4r%-5p%c:%n%m%n
日志/a.txt
假的
[%d{dd/MM/yyyy:HH:MM:ss}%级别-%logger]%m%n
问题是当我启动与aLogger
(Logger Logger=LoggerFactory.getLogger(“aLogger”);
)相关联的程序时。它还添加了BAPend(因此创建了一个空的b.txt文件…)

这就像在调用记录器时,不管附加的appender是什么,都要执行logback调用和所有appender。 如何避免这种行为


非常感谢

简言之,我认为答案是“否”,没有办法阻止创建
b.txt
。查看
FileAppender
的源代码,输出文件(以及相应的父文件夹层次结构)似乎是在启动appender时创建的(在初始化logback时发生)。这种设计是经过深思熟虑的,因为这种方法将在日志记录过程中节省大量时间。

回答可能晚了,但我确实需要与您@ulquiorra相同的结果 因此,根据我的搜索,我确实找到了这个解决方案:使用筛选器 例如:

<appender name="bAppender" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
        <key>logFileName</key>
        <defaultValue>b</defaultValue>
    </discriminator>
    <sift>
        <appender name="${logFileName}" class="ch.qos.logback.core.FileAppender">
            <file>logs/${logFileName}.txt</file>

            <encoder>
                <pattern>[%d{dd/MM/yyyy : HH:mm:ss}  %level - %logger] %m%n</pattern>
            </encoder>
        </appender>
    </sift>
</appender>

如果使用筛选附加程序包装FileAppender,则 FileAppender将在第一个日志事件上创建,因此日志 文件将以惰性方式创建

还要看一下文档


另一个关于

的例子非常感谢。该死,我以为appender会在调用相应的记录器时启动。我无法在运行其他程序时创建空文件。也许创建另一个单独的logback文件可以解决这个问题?