hslogger禁用输出到控制台

时间:2017-11-05 07:10:28

标签: haskell logging hslogger

以下内容应该为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的控制台输出?

1 个答案:

答案 0 :(得分:1)

好的,我花了大约一个半小时来解决这个问题。 hslogger的代码不是很干净,也不容易理解。

<强>说明

在终端中打印是因为存在rootLogger rootLoggerName = ""stderr处理程序。当您将内容打印到特定记录器时,您也会打印到此精确记录器的所有父项。它发生在rootLoggerNameHappstack.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仅打印到文件,不会打印到终端。