2

在我的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,我在其中定义了两个附加程序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}}

但是,我看到以下两行都打印到标准输出——我只想看到第一行:

12:42:16.573 [main] INFO  scheduler.core - both stdout and stash
12:42:16.641 [main] INFO  stash - only stash?

如何选择使用哪个 appender 登录clojure.tools.logging?具体来说,两者都stdout附加stash在根目录下,我怎样才能只登录到stash

4

2 回答 2

2

logback 应用不仅匹配第一个的所有活动附加程序,因此您的根级别将应用于所有消息。
<appender-ref ref="stdout" />根级别中取出并添加一个专门用于使用它的记录器。

 <logger name="project.core" level="INFO"> 
    <appender-ref ref="stash" /> 
  </logger>

 <root level="ERROR"> 
    <appender-ref ref="stdout" />
  </root> 
于 2013-04-10T18:04:54.280 回答
1

为您澄清几点:

日志记录的配置完全由您的日志记录实现控制(在本例中为 logback)。

所有clojure.tools.logging消息都使用日志命名空间。默认情况下,使用的值是调用日志调用的 clojure 命名空间;这类似于在 Java 中如何将当前类传递给记录器工厂。

大多数日志记录实现都使用此日志记录命名空间,以允许您在命名空间级别设置日志记录配置。

至于你的问题:

如何选择使用哪个 appender 登录clojure.tools.logging

完全按照您在从 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任何命名空间中的每条(或更高)消息都将发送到fooappender,并且DEBUG来自myproject.core命名空间的每条(或更高)消息都将发送到barappender。

于 2013-04-11T19:24:27.553 回答