2013-04-10 36 views
0

在我project.clj:dependencies,我有:如何决定哪些appenders使用`clojure.tools.logging`在日志上执行操作?

[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,我在其中定义了两个附加目的地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

+0

定义名称为“clojure.tools.logging”的记录器 – 2013-04-11 15:01:14

+0

然后,这将仅适用于从'clojure.tools.namespace'发送的消息,这不是您想要的。 – 2013-04-11 19:32:10

回答

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> 
+0

我如何“匹配”一个appender。如果我将标准输出到根级别,则不会看到任何消息。我怎样才能匹配标准输出,只有藏匿,或两者兼而有之? – ToBeReplaced 2013-04-10 18:12:38

1

有几件事情澄清你:

的记录的内容,其中完全由你的日志实现(在这种情况下的logback)控制的配置。

全部clojure.tools.logging消息使用记录名称空间。缺省情况下,使用的值是调用日志记录调用的clojure名称空间;这与在Java中如何将当前类传递给记录器工厂类似。

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

至于你的问题:

如何选择要登录到与clojure.tools.logging该附加器?

从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附加器,每DEBUG (或更高)来自myproject.core命名空间的消息将被发送给bar appender。

+0

感谢您的干净解释。在Arthur Ulfeldts的编辑之前,我错过了与appender分开的logger的存在,这给出了期望的解决方案。 – ToBeReplaced 2013-04-11 20:12:26

相关问题