快速记录器清理操作(haskell)

时间:2017-08-17 12:53:59

标签: haskell logging

我愿意使用快速记录器haskell库,但我有一些问题:

函数newTimedFastLogger解释为:

  

初始化一个FastLogger,并在每条消息上附加时间戳。返回记录器元组和清理操作。

所以,第一个问题,这个“清理行动”是什么?

此外,该函数将IO FormattedTime作为第一个参数,但我们有:

type TimedFastLogger = (FormattedTime -> LogStr) -> IO ()

这是我的第二个问题,为什么我在创建TimedFastLogger和使用它时都必须提供FormattedTime?

1 个答案:

答案 0 :(得分:1)

如果您查看the source for the function,您会看到清理操作是对rmLoggerSet的调用。该文档说:

  

刷新缓冲区,关闭内部文件信息并释放缓冲区。

所以这应该回答你的第一个问题。当您不再需要记录器时,您将运行它以确保与其关联的任何状态都被“清理”。根据您使用的记录器类型,它可能会执行不同的操作。

对于第二个问题,IO FormattedTime是一个操作,只要需要日志消息的时间戳,记录器就可以调用该操作。因此它可以多次调用它并获得不同的FormattedTime。当您调用newTimedFastLogger时,您将此操作作为第一个参数传递,它会返回记录器和清理操作。因此,使用它会像:

import System.Log.FastLogger
import Data.Monoid ((<>))

main :: IO ()
main = do
    timeCache <- newTimeCache simpleTimeFormat
    (logger, cleanUp) <- newTimedFastLogger timeCache (LogStdout defaultBufSize)
    log logger "Some log message"
    cleanUp

log :: ToLogStr msg => TimedFastLogger -> msg -> IO ()
log logger msg = logger $ \ft -> toLogStr ft <> toLogStr ": " <> toLogStr msg

每次您记录消息时,您都在调用logger,并传入一个回调函数,告诉它如何将您的消息与当前具有的任何时间值(ft)相结合。根据您的要求,您可能需要不同的格式,可能包括输出中的日志级别。