2017-08-17 49 views
1

我願意使用快速記錄器哈斯克爾庫,但我有一些問題:快速記錄器清理行動(哈斯克爾)

初始化FastLogger:

功能newTimedFastLogger的解釋每個消息附有時間戳。記錄器和清理操作的元組被返回。

所以,第一個問題,這是什麼「清理行動」?

此外,該功能需要一個IO FormattedTime作爲第一個參數,但我們有:

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

這是我的第二個問題,爲什麼我必須提供兩種創建TimedFastLogger和當FORMATTEDTIME使用時它?

+0

你誤會了'(A - > B) - > IO()'的含義。這不需要「A」類型的值;它需要「A - > B」類型的值。通過提供「A - > B」類型的函數,您可以訪問「A」類型的值,但只能在該函數的範圍內。換句話說,'TimedFastLogger'爲你提供'FormattedTime',而不是其他方式。 – user2407038

+0

我真的不明白爲什麼'TimedFastLogger'是這樣定義的 – user3927886

+0

您如何期待它被定義?或者你認爲實際定義有什麼錯誤?這似乎是一種很自然的方式來爲我定義它。 – user2407038

回答

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)它目前有。根據您的要求,您可能需要不同的格式,可能包括輸出中的日誌級別。