способ освободить информацию о обработчике hslogger - PullRequest
1 голос
/ 02 июня 2011

У меня есть программа, в которой я использую hlogger следующим образом, у меня есть основной поток и произвольное количество рабочих потоков, которые должны записывать журналы в отдельный файл. Итак, я использую:

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

Но похоже, что этот способ потребляет журнал памяти для хранения обработчиков для потоков и я нашел способ избавиться от этой информации в конце работы потока.

Может кто-нибудь посоветовать лучший способ хранения информации или способ освободить память.

1 Ответ

2 голосов
/ 12 августа 2011

Если вас беспокоит, что Handle s останется открытым после завершения каждого потока, вы можете обернуть 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"

Обновление : теперь правильно обрабатывает исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...