异步记录到2个文件

时间:2014-01-22 15:55:50

标签: logging asynchronous logback

我想异步记录到2个文件,一个用于系统日志记录,另一个用于用户操作记录。到目前为止,我正在登录1个文件,我的配置文件如下所示:

<configuration debug="true">

    <property name="LOG_DIR" value="C:/blah" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{DD/MM/YYYY-HH:mm:ss.SSS} %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${LOG_DIR}/log.txt</file>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <logger name="com.logger.name" level="DEBUG" />

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE" />
    </appender>

    <root level="warn">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="ASYNC" />
    </root>

</configuration>

我创建了一个这样的记录器:

public static final Logger LOG = LoggerFactory.getLogger("com.logger.name");

这很好用,但是如果我要记录到2个单独的文件,我是否需要编写第二个配置文件?我还需要第二个Logger对象吗?我想有一个配置并指定在创建Logger对象时记录哪个文件,这可能吗?谢谢!

修改

为了澄清,我想将用户操作记录到一个文件,系统记录到另一个文件。

1 个答案:

答案 0 :(得分:1)

您可以使用两个文件追加器,一个用于系统日志记录,另一个用于用户操作日志记录。文件应用程序扩展UnsynchronizedAppenderBase因此它们是异步的。无需创建Logger对象。这是一个例子。

<appender name="fileAppender1" class="ch.qos.logback.core.FileAppender">
        <file>c:/kp/kp1.log</file>
        <filter class="com.kp.filters.KPFilter">
        </filter>
        <append>true</append>
        <encoder>
            <pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="fileAppender1" />
    </root>

    <appender name="fileAppender2" class="ch.qos.logback.core.FileAppender">

        <file>c:/kp/kp2.log</file>
        <append>true</append>
        <encoder>
            <pattern>
                %d [%thread] %-5level %logger{30} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <logger name="org.kp">
        <appender-ref ref="fileAppender2" />
        <level value="debug"/>
    </logger>

KPFilters.class

public class KPFilter extends Filter<ILoggingEvent> {

    @Override
    public FilterReply decide(ILoggingEvent event) {
        if(event.getLoggerName() !=null && event.getLoggerName().startsWith("org.kp")){
            return FilterReply.DENY;
        }
        return FilterReply.ACCEPT;
    }

}

如果您希望将日志写入您的软件包生成的文件,您可以使用下面给出的

<logger name="com.kp">
        <level value="trace" />
        <appender-ref ref="fileappender2" />
</logger>

在最糟糕的情况下,您可以通过扩展UnsynchronizedAppenderBase创建自定义appender并编写自定义代码来处理错误消息。根据消息类型或消息字符串,您可以编写业务逻辑以写入文件或跳过错误消息。

**EDITED:**

您可以通常的方式初始化日志。例如,如果您想登录MyClass。

private static final Logger LOG = LoggerFactory.getLogger(MyClass.class);
LOG.warn("Hello");

Logback back将日志实例传递给两个appender。这将被写入两个不同的文件。