以下内容应该为Happstack应用程序配置hslogger:
main = do
accessLogHandler <- fileHandler "access" INFO
updateGlobalLogger "Happstack.Server.AccessLog.Combined" (setLevel INFO)
updateGlobalLogger "Happstack.Server.AccessLog.Combined" (setHandlers [accessLogHandler])
simpleHTTP nullConf app
访问日志将同时发送到我的&#34;访问&#34;文件和stderr。根据{{3}},setHandlers
应该&#34;将记录器的处理程序列表设置为提供的列表。首先删除所有现有的处理程序。&#34;我曾假设控制台输出将是一个现有的处理程序&#34;,但显然它不是。
如何停用hslogger的控制台输出?
答案 0 :(得分:1)
好的,我花了大约一个半小时来解决这个问题。 hslogger
的代码不是很干净,也不容易理解。
<强>说明强>
在终端中打印是因为存在rootLogger
rootLoggerName = ""
和stderr
处理程序。当您将内容打印到特定记录器时,您也会打印到此精确记录器的所有父项。它发生在rootLoggerName
是Happstack.Server.AccessLog.Combined
的父母之一。
<强>解强>
我发现禁用终端日志记录的方法只是将根记录器名称的所有处理程序设置为空列表,如下所示:
updateGlobalLogger rootLoggerName (setHandlers [])
不幸的是,这个确切的代码无法编译,因为[]
的类型对setHandlers
来说太模糊了。您可以使用-XTypeApplications
扩展程序解决此类型的推理问题。以下是完整的代码示例:
{-# LANGUAGE TypeApplications #-}
import GHC.IO.Handle (Handle)
import System.Log.Logger
import System.Log.Handler.Simple
main :: IO ()
main = do
accessLogHandler <- fileHandler "access" INFO
let name = "Happstack.Server.AccessLog.Combined"
updateGlobalLogger name (setHandlers [accessLogHandler])
updateGlobalLogger name (setLevel INFO)
updateGlobalLogger rootLoggerName (setHandlers @(GenericHandler Handle) [])
infoM name "Hello!"
此infoM
仅打印到文件,不会打印到终端。