2016-12-05 4 views
2

私はそうのようなログを構成した:hslogger&重複ログイン行

import System.Environment 
import System.Log.Logger 
import System.Log.Handler (setFormatter) 
import System.Log.Handler.Simple (streamHandler) 
import System.Log.Formatter 
import System.IO (getLine, stdout) 
main = do 
stdOutHandler <- streamHandler stdout DEBUG >>= \lh -> return $ 
      setFormatter lh (simpleLogFormatter "[$time : $loggername : $prio] $msg") 
    updateGlobalLogger "Linker" (setLevel DEBUG . setHandlers [stdOutHandler]) 
    infoM "Linker" "Hello world!" 

は残念ながら、私はinfoM(または任意のロギング機能)を使用するたびに、私は重複行を取得し、例えば

infoM "Linker" "hi there" 

は生成します。

hi there 
[2016-12-05 20:23:10 GMT : Linker : INFO] hi there 

私はsetHandlersが最初に他のハンドラを削除したと思いました。

putStrLn ALA私はフォーマットされている行だけではなく、「通常」形式たい

など

+1

あなたは最小の完全なコード例を提供していただけますか?あなたが書いたことから、私はそれがうまくいかない理由は見ません。 – Shersh

+0

完全な例で更新されました。 –

答えて

3

私はあなたのプログラム内でエラーを検出しました。実際に、それはあなたの最初のコードでは、私はそれに十分な注意を払っていないた:(

必要なのは

updateGlobalLogger rootLoggerName 

updateGlobalLogger "Linker" 

rootLoggerNameでロガー名を交換することです

これは私のためのトリックでしたが、ルートロガーで初期化していないときに何が起こるか分かりませんが、少なくとも今は動作します。

また、stackを使用していて、githubプロジェクトを使用しても構わない場合は、hsloggerの周りにラッパー(色付きのロガー名など)を追加するロギングライブラリを使用することを検討してください。

https://github.com/serokell/log-warper

Colored logging

+0

Hmmmしかし、私がロガー名に '' Linker "'を使っているのは、毎回その特定のロガーにロギングしているからです。ルートが常に使用される場合、ロガー名のポイントは何ですか?私は彼らを名前で構成しなければならないと思ったのですか? –

+1

@atcロガー名のポイントは、 'hslogger'がロガーの階層を使用することです。すべてのロガーは 'rootLoggerName'の子でなければなりません。例えば、 '' Linker.Child''は '' Linker''という名前のロガーの子であり、 '' Linker''は '' '' '' '' ''の子です。デフォルトでは、すべての子は親から 'Priority'を継承します。次のコードを検討してください:http://lpaste.net/6216398766442807296 '' Hallo 2 ''というメッセージは表示されません。したがって、_root_を初期化してから、すべてのサブログを初期化する必要があります。 – Shersh

+0

意味があります!子要素の設定が重複に終わってしまうことを期待していなかった階層要素について理解しましたが、もちろん 'setHandlers'が子要素に適用され、ルートロガーではないため重複が適用されます。ありがとう! –