如何使用`clojure.tools.logging'确定哪些appender对日志起作用?

时间:2013-04-10 16:52:12

标签: logging clojure logback

在我的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 stdoutstash

<?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?具体来说,在根目录中附加stdoutstash时,如何才能仅记录到stash

2 个答案:

答案 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进行日志记录时,无论是全局还是特定于某个包/类/命名空间,都要这样做。

具体而言,如果根目录附加了stdoutstash,我该如何只记录到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。