如何"过滤" Akka INFO记录输出到不同的文件?

时间:2015-03-12 14:21:00

标签: scala logging akka

我在“订单”上记录INFO,在我使用Scala / Akka开发的交易应用程序生成的“交易”上记录INFO。目前所有输出都进入一个日志文件,但我希望这些信息可以转到单独的文件中。

我已将application.conf指定为以下内容......

akka {
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  loglevel = "INFO"
  logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
}

...这是我的logback.xml文件......

<configuration>
    <appender name="TRANSACTIONS" class="ch.qos.logback.core.FileAppender">
        <file>log/transactions.log</file>
        <append>true</append>
        <encoder>
            <pattern>%date{yyyy-MM-dd} %X{akkaTimestamp} %-5level[%thread] %logger{1} - %msg%n</pattern>
        </encoder>
    </appender>

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

    <appender name="ORDERS" class="ch.qos.logback.core.FileAppender">
        <file>log/orders.log</file>
        <append>true</append>
        <encoder>
            <pattern>%date{yyyy-MM-dd} %X{akkaTimestamp} %-5level[%thread] %logger{1} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="ORDERS" />
    </root>
</configuration>

我已尝试修改我的logback.xml文件以包含过滤器,如下所示

<configuration>
    <appender name="TRANSACTIONS" class="ch.qos.logback.core.FileAppender">
        <filter class="domain.trading.DoubleAuctionMarket"/>
        <file>log/transactions.log</file>
        <append>true</append>
        <encoder>
            <pattern>%date{yyyy-MM-dd} %X{akkaTimestamp} %-5level[%thread] %logger{1} - %msg%n</pattern>
        </encoder>
    </appender>

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

    <appender name="ORDERS" class="ch.qos.logback.core.FileAppender">
        <filter class="domain.trading.Exchange"/>
        <file>log/orders.log</file>
        <append>true</append>
        <encoder>
            <pattern>%date{yyyy-MM-dd} %X{akkaTimestamp} %-5level[%thread] %logger{1} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="ORDERS" />
    </root>
</configuration>

然而,这会产生运行时错误......

14:11:38,361 |-ERROR in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Could not create component [filter] of type [domain.trading.DoubleAuctionMarket] java.lang.ClassNotFoundException: domain.trading.DoubleAuctionMarket
at java.lang.ClassNotFoundException: domain.trading.DoubleAuctionMarket

14:11:38,417 |-ERROR in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Could not create component [filter] of type [domain.trading.Exchange] java.lang.ClassNotFoundException: domain.trading.Exchange
at java.lang.ClassNotFoundException: domain.trading.Exchange

思想?

[编辑:解决方案] 为了完整起见,我根据以下答案中提供的链接创建了两个过滤器TransactionsFilterOrdersFilter,并将其粘贴到{{1}我项目的目录。示例过滤器看起来像......

src/main/java/

然后我编辑了我的package filters; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; public class OrdersFilter extends Filter<ILoggingEvent> { @Override public FilterReply decide(ILoggingEvent event) { boolean isAskOrder = event.getFormattedMessage().contains("AskOrder"); boolean isBidOrder = event.getFormattedMessage().contains("BidOrder"); if ( isAskOrder || isBidOrder) { return FilterReply.ACCEPT; } else { return FilterReply.DENY; } } } 文件以引用新创建的过滤器......

logback.xml

1 个答案:

答案 0 :(得分:0)

您在过滤器标记中指定的类不是您要接受的文件类型,而是要用于过滤日志的过滤器类(可能是自定义类)的类路径。

所以我猜你得到了这个错误,因为你的类没有实现过滤器。

您应该将过滤器类构建为可读here,每个过滤器一个,然后引用它们。