我有程序,我在下一步使用hlogger,我有主线程和任意数量的工作线程,哪个应该将日志写入单独的文件。所以我正在使用:
s <- openlog ..
updateGlobalLogger ("myapp."++threadId) (addHandler s)
但似乎这种方式会占用内存日志来存储线程的处理程序 我已经找到了在线程工作结束时处理这些信息的方法。
有人可以建议更好的存储信息方式或释放内存的方法。
答案 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"
更新:现在正确处理异常。