2016-06-20 11 views
0

私はWindowsサービスを持っており、各リクエスト(およびそのリクエストに関連するデバッグメッセージ)をファイルに記録できます要求)。複数のファイルにログインするにはどうすればいいですか(リクエストごとに1ファイル)

また、一般的なログがありました。私は1つのファイルに保存する時間と要求IDの魔法使いをログに記録しました。私はロガーの無限の数を作成し終わると、おそらくメモリを作成するように、と私は新しいロガー

private Logger CreateNewLogger(string logerName) { 
     var logger = LogManager.GetLogger(logerName); 
     var target = new FileTarget { 
     Layout = new SimpleLayout("${time} | ${level:uppercase=true} | ${message} | ${exception:format=tostring}"), AutoFlush = true 
     }; 
     target.FileName = "${basedir}/Logs/${date:format=dd}-${date:format=MM}-${date:format=yyyy}/" + logerName + ".txt"; 
     var rule = new LoggingRule(logerName, LogLevel.Trace, target); 
     var configuration = new LoggingConfiguration(); 
     configuration.AddTarget(logerName, target); 
     configuration.LoggingRules.Add(rule); 
     logger.Factory.Configuration = configuration; 
     return logger; 
    } 

しかしこのdoesntのをやってを作成し、それぞれの新しい要求に対してNlogを使用した瞬間イムで

は...正しいように見えます問題。

し、また、一般的なLoggerがpropperly動作していない私は

LogManager.GetCurrentClassLogger().Info("Received resolve request ID:" + srgMsgId); 

を行うときには、まだ私は一般的なものの代わりに作成されたログのいずれかに記録します。何故ですか?

とにかく、nlogを使って私の目的を達成するにはどうすればいいですか?

答えて

2

私が正しく理解している場合、Configuration variablesを使用して、ロガーがログに記録するパスを指定することができます。

<target name="Logs" 
    xsi:type="File" 
    fileName="${var:LoggerName}.csv"> 
    <layout xsi:type="CSVLayout"> 
     <column name="Message" layout="${message}" /> 
    </layout> 
</target> 

あなたはコードではなく、設定、設定ファイルを必要とする介して、このすべてを行うことができるかもしれないが、このアプローチは、私たちのために動作します:

using NLog; 

public static class LogService { 
    private static Logger logger = LogManager.GetLogger("Logs"); 
    private static object lockObject = new object(); 

    public static void Log(string loggerName) 
    { 
     lock (lockObject) 
     { 
      LogManager.Configuration.Variables["LoggerName"] = loggerName; 
      logger.Log("some message"); 
     } 
    } 
} 

は、それから、あなたコンフィグファイルを持っています。

汎用ログでは、毎回同じ場所にログを記録するLoggerNameのデフォルト値を使用できます。

関連する問題