异步记录到2档 [英] Asynchronous logging to 2 files

查看:201
本文介绍了异步记录到2档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要以异步方式登录到2档,一个用于系统日志,其他用户登录操作。到目前为止,我记录到1个文件,我的配置文件看起来像这样:

I want to log asynchronously to 2 files, one for system logging, the other for user actions logging. So far I am logging to 1 file, my config file looks like this:

<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个独立的文件,我是否需要写第二个配置文件?我是否需要第二个日志对象还?我想有一个配置,并指定文件中记录为创建时的日志的对象,这可能吗?谢谢!

This works fine, but if I want to log to 2 separate files, do I need to write a second config file? Do I need a second Logger object also? I would like to have one configuration and specify which file is logged to on creation of the Logger object, is this possible? Thanks!

修改

我想弄清楚,我要记录的用户操作一个文件和系统日志其他。

Just to clarify, I want to log the user action to one file and the system logs to the other.

推荐答案

您可以使用两种文件追加程序,一个用于系统日志和其他用户操作记录。文件扩展appnder UnsynchronizedAppenderBase 因此,他们是异步。没有必要创建到Logger对象。下面是一个例子。

You can use two file appenders, one for system logging and other for user action logging. File appnder extends UnsynchronizedAppenderBase Hence they are async. No need to create to Logger objects. Here is a example.

<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

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;
    }

}

如果你想有被写入到文件由你的包生成的日志,可以使用以下

If you want to have logs to be written to file generated by your package, you can use as given below

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

在最坏的情况下,你可以创建自定义的appender通过延长 UnsynchronizedAppenderBase 和编写自定义code来处理错误消息。根据消息类型或消息字符串可以编写业务逻辑写入文件或跳过的错误消息。

In worst scenario you can create custom appender by extend UnsynchronizedAppenderBase and write custom code to process the error message. Based on the message type or message string you can write business logic to write to file or skip the error message.

**EDITED:**

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

You can initialize the log in usual way. For example if you want to log in MyClass.

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

后面的logback通过日志实例同时追加程序。这将被写入两个不同的文件

Logback back passes the log instance to both appenders. which will be written to two different files.

这篇关于异步记录到2档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆