【问题标题】:Fast-logger clean up action (haskell)快速记录器清理操作(haskell)
【发布时间】:2018-01-25 21:40:47
【问题描述】:

我愿意使用 fast-logger haskell 库,但我有一些问题:

函数newTimedFastLogger解释为:

使用附加到每条消息的时间戳初始化 FastLogger。返回一个记录器和清理操作的元组。

那么,第一个问题,这个“清理行动”是为了什么?

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

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

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

【问题讨论】:

  • 您误解了(A -> B) -> IO () 类型的含义。这不需要A 类型的值;它需要A -> B 类型的值。通过提供A -> B 类型的函数,您可以访问A 类型的值,但只能在该函数的范围内。换句话说,TimedFastLogger 为您提供了 FormattedTime,而不是相反。
  • 我真的不明白为什么TimedFastLogger会这样定义
  • 您希望如何定义它?或者您认为实际定义有什么问题?对我来说,这似乎是一种很自然的定义方式。

标签: haskell logging


【解决方案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)结合起来。根据您的要求,您可能需要不同的格式,可能在输出中包括日志级别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多