Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何";“过滤器”;Akka信息记录输出到不同的文件?_Scala_Logging_Akka - Fatal编程技术网

Scala 如何";“过滤器”;Akka信息记录输出到不同的文件?

Scala 如何";“过滤器”;Akka信息记录输出到不同的文件?,scala,logging,akka,Scala,Logging,Akka,我正在记录使用Scala/Akka开发的交易应用程序生成的“订单”和“交易”信息。目前,所有的输出都进入一个日志文件,但我希望信息进入单独的文件 我已经指定了我的application.conf,如下所示 akka { loggers = ["akka.event.slf4j.Slf4jLogger"] loglevel = "INFO" logging-filter = "akka.event.slf4j.Slf4jLoggingFilter" } …这是我的logback.xm

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

我已经指定了我的
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>
但是,这会生成运行时错误

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

想法

[编辑:解决方案]为了完整起见,我根据下面答案中提供的链接创建了两个过滤器
TransactionFilter
OrdersFilter
,并将它们粘贴在我项目的
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;
        }
    }
}

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

因此,我猜您会遇到这个错误,因为您的类没有实现过滤器


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

这对您有用吗?
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
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;
        }
    }
}
<configuration>
    <appender name="TRANSACTIONS" class="ch.qos.logback.core.FileAppender">
        <filter class="filters/TransactionFilter"/>
        <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="filters/OrderFilter"/>
        <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>