在我的project.clj
:dependencies
中,我有:
[org.clojure/tools.logging "0.2.6"]
[ch.qos.logback/logback-classic "1.0.11"]
[net.logstash.logback/logstash-logback-encoder "1.0"]
在我的core.clj
中,我有:
(clojure.tools.logging/info "both stdout and stash")
(clojure.tools.logging/log "stash" :info nil "only stash?")
在我的资源路径上,我有一个文件logback.xml
,其中我定义了两个附加到root的appender stdout
和stash
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="stash" class="ch.qos.logback.core.FileAppender">
<file>example.log</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="all">
<appender-ref ref="stash" />
<appender-ref ref="stdout" />
</root>
</configuration>
当我运行程序时,我在example.log
中看到以下(所需)输出:
{"@timestamp":"2013-04-10T12:42:16-04:00","@message":"both stdout and stash","@fields":{"logger_name":"scheduler.core","thread_name":"main","level":"INFO","level_value":20000}}
{"@timestamp":"2013-04-10T12:42:16-04:00","@message":"only stash?","@fields":{"logger_name":"stash","thread_name":"main","level":"INFO","level_value":20000}}
但是,我看到以下两行打印到stdout - 我只想看第一行:
12:42:16.573 [main] INFO scheduler.core - both stdout and stash
12:42:16.641 [main] INFO stash - only stash?
如何选择要使用clojure.tools.logging
登录的appender?具体来说,在根目录中附加stdout
和stash
时,如何才能仅记录到stash
?
答案 0 :(得分:1)
logback应用的所有活动appender不仅与第一个匹配,因此您的根级别将应用于所有消息
从根级别取<appender-ref ref="stdout" />
并专门添加记录器以使用它。
<logger name="project.core" level="INFO">
<appender-ref ref="stash" />
</logger>
<root level="ERROR">
<appender-ref ref="stdout" />
</root>
答案 1 :(得分:1)
为您澄清一些事项:
记录内容的配置完全由日志记录实现控制(在这种情况下为logback)。
所有clojure.tools.logging
条消息都使用日志记录命名空间。默认情况下,使用的值是从中调用日志记录调用的clojure名称空间;这类似于在Java中如何将当前类传递给记录器工厂。
大多数日志记录实现都使用此日志记录命名空间,以允许您在命名空间级别设置日志记录配置。
关于你的问题:
如何选择要使用clojure.tools.logging
登录的appender?
在从Java进行日志记录时,无论是全局还是特定于某个包/类/命名空间,都要这样做。
具体而言,如果根目录附加了stdout
和stash
,我该如何只记录到stash
?
在logback中,appender的名称与日志消息命名空间无关。如果要配置特定于命名空间的日志记录,可以执行以下操作:
<appender name="foo">...</appender>
<appender name="bar">...</appender>
<root level="WARN">
<appender-ref ref="foo" />
</root>
<logger name="myproject.core" level="DEBUG">
<appender-ref ref="bar" />
</logger>
在上文中,任何名称空间中的每个WARN
(或更高)消息都将发送到foo
appender,以及来自{{1}的每条DEBUG
(或更高)消息} namespace将被发送到myproject.core
appender。