用log4j2组合实现clojure中日志功能

1:依赖

[org.clojure/tools.logging "1.2.4"]
[org.apache.logging.log4j/log4j-api "2.17.1"]
[org.apache.logging.log4j/log4j-core "2.17.1"]

org.clojure/tools.logging版本号这里查:https://github.com/clojure/tools.logging
log4j2的版本号从这里查:https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api ,core的版本号一样。

2:project配置

:jvm-opts ["-Dclojure.tools.logging.factory=clojure.tools.logging.impl/log4j2-factory"]

3:log4j2配置:

status = warn

appender.console.type = Console
appender.console.name = LogToConsole
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n

# Rotate log file
appender.rolling.type = RollingFile
appender.rolling.name = LogToRollingFile
appender.rolling.fileName = logs/app.log
appender.rolling.filePattern = logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=10MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 10

rootLogger.level = info
rootLogger.appenderRef.stdout.ref = LogToConsole
rootLogger.appenderRef.file.ref = LogToRollingFile
rootLogger.rolling.appenderRef.rolling.ref = LogToRollingFile

放置位置:classpath中,如果不知道classpath有哪些,可以用:

[org.clojure/java.classpath "1.0.0"]

然后:

(require '[clojure.java.classpath :as cp])
(cp/classpath)

可以看到resources一般是classpath,所以我经常放那里。

4:测试

测试代码:

(defn divide [x y]
  (log/info "dividing" x "by" y)
  (try
    (log/spyf "result: %s" (/ x y))                         ; yields the result
    (catch Exception ex
      (log/error ex "There was an error in calculation"))))

结果:

(divide 1 0)
[INFO ] 2022-04-15 20:25:51.796 [nRepl-session-8160b2e6-8517-4a5c-9321-ad36a7a39744] core - dividing 1 by 0
[ERROR] 2022-04-15 20:25:51.796 [nRepl-session-8160b2e6-8517-4a5c-9321-ad36a7a39744] core - There was an error in calculation
java.lang.ArithmeticException: Divide by zero
    at clojure.lang.Numbers.divide(Numbers.java:188) ~[clojure-1.10.1.jar:?]
    at env_elec.core$divide.invokeStatic(core.clj:12) [?:?]
    at env_elec.core$divide.invoke(core.clj:9) [?:?]
    at env_elec.core$eval2009.invokeStatic(form-init10290682445183705950.clj:1) [?:?]
    at env_elec.core$eval2009.invoke(form-init10290682445183705950.clj:1) [?:?]
    at clojure.lang.Compiler.eval(Compiler.java:7177) [clojure-1.10.1.jar:?]
    at clojure.lang.Compiler.eval(Compiler.java:7132) [clojure-1.10.1.jar:?]
    at clojure.core$eval.invokeStatic(core.clj:3214) [clojure-1.10.1.jar:?]
    at clojure.core$eval.invoke(core.clj:3210) [clojure-1.10.1.jar:?]
    at clojure.main$repl$read_eval_print__9086$fn__9089.invoke(main.clj:437) [clojure-1.10.1.jar:?]
    at clojure.main$repl$read_eval_print__9086.invoke(main.clj:437) [clojure-1.10.1.jar:?]
    at clojure.main$repl$fn__9095.invoke(main.clj:458) [clojure-1.10.1.jar:?]
    at clojure.main$repl.invokeStatic(main.clj:458) [clojure-1.10.1.jar:?]
    at clojure.main$repl.doInvoke(main.clj:368) [clojure-1.10.1.jar:?]
    at clojure.lang.RestFn.invoke(RestFn.java:1523) [clojure-1.10.1.jar:?]
    at nrepl.middleware.interruptible_eval$evaluate.invokeStatic(interruptible_eval.clj:79) [?:?]
    at nrepl.middleware.interruptible_eval$evaluate.invoke(interruptible_eval.clj:55) [?:?]
    at nrepl.middleware.interruptible_eval$interruptible_eval$fn__1259$fn__1263.invoke(interruptible_eval.clj:142) [?:?]
    at clojure.lang.AFn.run(AFn.java:22) [clojure-1.10.1.jar:?]
    at nrepl.middleware.session$session_exec$main_loop__1360$fn__1364.invoke(session.clj:171) [?:?]
    at nrepl.middleware.session$session_exec$main_loop__1360.invoke(session.clj:170) [?:?]
    at clojure.lang.AFn.run(AFn.java:22) [clojure-1.10.1.jar:?]
    at java.lang.Thread.run(Thread.java:835) [?:?]
=> nil
(divide 1 2)
[INFO ] 2022-04-15 20:26:03.944 [nRepl-session-8160b2e6-8517-4a5c-9321-ad36a7a39744] core - dividing 1 by 2
=> 1/2

按照3中的配置,在logs文件夹下应该也会有个app.log文件存放相同内容。这个文件还会根据大小(10MB一分)自动分日期和序号存档。

posted @ 2022-04-15 20:36  孙旭升  阅读(60)  评论(0编辑  收藏  举报