用Clojure编写REST service 五 使用logback(有bug)
2013-01-02 18:58
260 查看
一个完整的web app当然需要写日志。这里我采用习惯的slf4j+logback。
首先在my-website目录的project.clj文件中添加两个依赖:tools.logging&logback-classic
(defproject my-website "0.1.0-SNAPSHOT"
:description "FIXME: write this!"
:dependencies [[org.clojure/clojure "1.4.0"]
[com.novemberain/monger "1.4.1"]
[org.clojure/tools.logging "0.2.4"]
[ch.qos.logback/logback-classic "1.0.7"]
[noir "1.3.0-beta3"]]
:main my-website.server)
然后在src下面新建一个logback.xml<configuration debug="false">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-10contextName %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/opt/web.log</file>
<append>true</append>
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<logger name="clojure-example-logback-integration" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
之后在src/my_website目录下创建log.clj文件,代码如下:(注意,这里定义了my-website.log namespace)(ns my-website.log
(:require [clojure.tools.logging :as log]))
(defn set-log-level!
"Pass keyword :error :info :debug"
[level]
(let [logger (logimpl/get-logger log/*logger-factory* "clojure-logback-integration")]
(case level
:debug (.setLevel logger Level/DEBUG)
:info (.setLevel logger Level/INFO)
:error (.setLevel logger Level/ERROR))))
(defmacro debug [& args]
`(log/debug (str ~@args)))
(defmacro info [& args]
`(log/info (str ~@args)))
(defmacro warn [e & args]
`(log/warn (str ~@args) ~e))
(defmacro warn [& args]
`(log/warn (str ~@args)))
(defmacro error [& args]
`(log/error (str ~@args)))
(defmacro error [e & args]
`(log/error ~e (str ~@args)))
现在可以在server.clj里面使用log了:(注意,这里引入了my-website.log namespace)
(ns my-website.server
(:require [noir.server :as server])
(:require [my-website.log :as log]))
(server/load-views-ns 'my-website.views)
(server/load-views-ns 'my-website.rest.test)
(defn -main [& m]
(log/info "enter -main")
(let [mode (keyword (or (first m) :dev))
port (Integer. (get (System/getenv) "PORT" "8080"))]
(server/start port {:mode mode
:ns 'my-website})))
不过很可惜,目前这个logback支持有bug,总是报找不到logimpl 。
我已经报了issue,看什么时候修复吧。
本文会在问题解决后更新。
首先在my-website目录的project.clj文件中添加两个依赖:tools.logging&logback-classic
(defproject my-website "0.1.0-SNAPSHOT"
:description "FIXME: write this!"
:dependencies [[org.clojure/clojure "1.4.0"]
[com.novemberain/monger "1.4.1"]
[org.clojure/tools.logging "0.2.4"]
[ch.qos.logback/logback-classic "1.0.7"]
[noir "1.3.0-beta3"]]
:main my-website.server)
然后在src下面新建一个logback.xml<configuration debug="false">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-10contextName %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/opt/web.log</file>
<append>true</append>
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<logger name="clojure-example-logback-integration" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
之后在src/my_website目录下创建log.clj文件,代码如下:(注意,这里定义了my-website.log namespace)(ns my-website.log
(:require [clojure.tools.logging :as log]))
(defn set-log-level!
"Pass keyword :error :info :debug"
[level]
(let [logger (logimpl/get-logger log/*logger-factory* "clojure-logback-integration")]
(case level
:debug (.setLevel logger Level/DEBUG)
:info (.setLevel logger Level/INFO)
:error (.setLevel logger Level/ERROR))))
(defmacro debug [& args]
`(log/debug (str ~@args)))
(defmacro info [& args]
`(log/info (str ~@args)))
(defmacro warn [e & args]
`(log/warn (str ~@args) ~e))
(defmacro warn [& args]
`(log/warn (str ~@args)))
(defmacro error [& args]
`(log/error (str ~@args)))
(defmacro error [e & args]
`(log/error ~e (str ~@args)))
现在可以在server.clj里面使用log了:(注意,这里引入了my-website.log namespace)
(ns my-website.server
(:require [noir.server :as server])
(:require [my-website.log :as log]))
(server/load-views-ns 'my-website.views)
(server/load-views-ns 'my-website.rest.test)
(defn -main [& m]
(log/info "enter -main")
(let [mode (keyword (or (first m) :dev))
port (Integer. (get (System/getenv) "PORT" "8080"))]
(server/start port {:mode mode
:ns 'my-website})))
不过很可惜,目前这个logback支持有bug,总是报找不到logimpl 。
我已经报了issue,看什么时候修复吧。
本文会在问题解决后更新。
相关文章推荐
- 用Clojure编写REST service 六 使用log4j
- 用Clojure编写REST service 七 启动时读取配置文件
- 用Clojure编写REST service 三 返回JSON
- 用Clojure编写REST service 四 读取配置文件
- 用Clojure编写REST service 二 Noir创建Rest API
- 用Clojure编写REST service 一 Noir创建web app
- 使用WCF 4.0 构建 REST Service
- Java使用Axis2调用NET编写的WCFService问题
- 使用WCF web API测试基于REST的WCF Service
- Eclipse+Tomcat+Jersey 编写 REST web service
- 【JavaService】使用Java编写部署windows服务
- 【JavaService】使用Java编写部署windows服务
- Clojure进阶:使用Clojure编写文字冒险游戏
- java webservice 开发方法(REST方式)---续(父类写法及使用)
- TPanel 在使用 Theme Service 时的 Bug
- 9、ROS使用C++编写一个简单的Service和Client
- 使用CXF创建REST WEBSERVICE
- 使用RestSharp 库消费Restful Service
- RestSharp使用详解(2)RestSharp的BUG和不足
- 在SharePoint 2010 中使用REST时提示:未能加载类型System.Data.Services.Providers.IDataServiceUpdateProvider的解决办法