log4j:更改在另一个库中配置的记录器的格式

时间:2010-04-23 00:36:29

标签: logging clojure log4j

使用clojure,我已经能够通过使用这个log4j.properties文件成功地设置log4j,并在我的类路径中包含log4j。

# BEGIN log4j.properties

log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%d{MMdd HHmmss SSS} %5p %c [%t] %m\n

log4j.rootLogger=DEBUG, STDOUT

然后:使用clojure.contrib.logging,我能够按预期打印一个具有所需格式的语句,如下所示:

(info "About to print this")
(debug "This is debug-level")

我的问题是如何为在其他库中配置的记录器记录的日志语句实现一致的格式化。我以为我可以使用org.apache.log4j.LogManager.getCurrentLoggers()找到现有的记录器并更改那里的PatternLayouts,但是我无法在clojure中迭代该枚举,因为我收到以下错误:

Dont know how to create ISeq from: java.util.Vector$1

我认为这可能是某种方式,可能非常简单。怎么样?

非常感谢。

1 个答案:

答案 0 :(得分:2)

使用enumeration-seq代替seq

(enumeration-seq (org.apache.log4j.LogManager/getCurrentLoggers))

对于好奇的人来说,org.apache.log4j.LogManager.getCurrentLoggers()会返回java.util.Enumeration; seq不知道如何操作,但enumeration-seq确实如此。

一个不涉及记录的简单案例:

(seq (.elements (java.util.Vector. [1 2 3]))
; => throws an exception

(enumeration-seq (.elements (java.util.Vector. [1 2 3])))
; => returns (1 2 3)