我正在记录"订单"上的信息和我正在使用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>
我尝试修改我的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
思潮?
[编辑:解决方案] 为了完整起见,我根据下面答案中提供的链接创建了两个过滤器TransactionsFilter
和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;
}
}
}
然后,我编辑了我的logback.xml
文件以引用新创建的过滤器...
<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>
在筛选器标记中指定的类不是要接受的文件类型,而是要用于筛选日志的筛选器类(可能是自定义类)的类路径。
所以我想你得到这个错误,因为你的类没有实现过滤器。
应在此处将筛选器类构建为可读的,每个筛选器一个,然后引用这些类。