【问题标题】:Opening and closing a hslogger log file, within the GHCi REPL在 GHCi REPL 中打开和关闭 hslogger 日志文件
【发布时间】:2015-03-05 13:24:50
【问题描述】:

在 GHCi REPL 中运行时,我对 hslogger 的实现感到恼火。

import System.IO (Handle)
import System.Log.Logger (Priority( DEBUG ), updateGlobalLogger, addHandler, setLevel, debugM)
import System.Log.Handler.Simple (fileHandler)
import System.Log.Handler (setFormatter, close)

main :: IO ()
main = do
    f <- fileHandler "sample.log" DEBUG
    updateGlobalLogger "Component" (addHandler f)
    updateGlobalLogger "Component" (setLevel DEBUG)
    debugM "Component" "This is a sample log line"
    close f

它第一次无异常运行,但是,在随后的 main 执行中:

*** Exception: sample.log: hPutStr: illegal operation (handle is closed)

当我在 GHCi 之外运行程序时没有遇到这种情况。

是我没有用 hslogger 正确关闭文件句柄,还是 GHCi 保持文件句柄打开?

我在打开和关闭标准文件时没有遇到同样的问题。

import System.IO (Handle, openFile, hClose, hPutStrLn, IOMode (WriteMode))

main :: IO ()
main = do
    f <- openFile "sampleFile.log" WriteMode
    hPutStrLn f "Hello"
    hClose f

【问题讨论】:

    标签: haskell logging io ghci filehandle


    【解决方案1】:

    将removeHandler 与close 结合使用似乎有效:

    import System.IO (Handle)
    import System.Log.Logger (Priority( DEBUG ), updateGlobalLogger, addHandler, setLevel, debugM, removeHandler)
    import System.Log.Handler.Simple (fileHandler)
    import System.Log.Handler (setFormatter, close)
    
    main1 :: FilePath -> IO ()
    main1 fp = do
        f <- fileHandler fp DEBUG
        updateGlobalLogger "Component" (addHandler f)
        updateGlobalLogger "Component" (setLevel DEBUG)
        debugM "Component" ("This is a sample log line to file " ++ fp)
        updateGlobalLogger "Component" removeHandler
        close f
    
    main = do main1 "foo.log"; main1 "foo.log"
    

    【讨论】:

    • 太棒了。现在在出现异常时正确清理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多