一种释放hslogger处理程序信息的方法

时间:2011-06-02 19:34:34

标签: logging haskell

我有程序,我在下一步使用hlogger,我有主线程和任意数量的工作线程,哪个应该将日志写入单独的文件。所以我正在使用:

 s <- openlog ..
 updateGlobalLogger ("myapp."++threadId) (addHandler s)

但似乎这种方式会占用内存日志来存储线程的处理程序  我已经找到了在线程工作结束时处理这些信息的方法。

有人可以建议更好的存储信息方式或释放内存的方法。

1 个答案:

答案 0 :(得分:2)

如果您担心在每个线程完成后Handle保持打开状态,您可以将forkIO包装在将创建所需处理程序的帮助程序中,使用正确的日志运行该线程名称,然后关闭句柄:

import Control.Concurrent
import Control.Exception 
import System.Log.Logger 
import System.Log.Handler 
import System.Log.Handler.Simple

forkWithLogName :: (String -> IO ()) -> IO ThreadId
forkWithLogName c = 
  forkIO $ do tid <- myThreadId
              let logName = "myapp." ++ (show tid)
              bracket (fileHandler logName DEBUG)
                      close
                      (\h -> do updateGlobalLogger logName (addHandler h)
                                c logName)

main = do
  forkWithLogName $ \logName -> do
         errorM logName "Foo"
  forkWithLogName $ \logName -> do
         errorM logName "Bar"

更新:现在正确处理异常。