2017-11-13 10 views
0

ログをNLogに送信するASP.NETプロジェクトがあります。すべてのASP.NETコアロギングを単一のNLogロガーにリダイレクト

しかし、このプロジェクトでは、私自身のNLogロガーを持っており、すべてのログをどのようにルーティングするかを知りたいと思います。

NLogをロガーとして追加するべきではないと思いますが、ASPが何かを記録しようとするたびに呼び出されるメソッドを登録する方法を見つけるべきです。

これはどのように達成できますか?


これはロガーを作成するコードです:

 // create the module name 
     var ProcessName = Process.GetCurrentProcess().ProcessName; 
     _ModuleName = ProcessName + " (\"" + Oracle.GuessMyName() + "\")"; 

     // create the logger configuration 
     var Configuration = new LoggingConfiguration(); 

     // create the file target 
     var FileTarget = new FileTarget ("file") 
     { 
      FileName   = @"x:\Logs\${processname}.log", 
      ArchiveFileName  = @"x:\Logs\${processname}.{#}.log", 
      Layout    = @"${longdate}|${logger}|${level}|${message}${onexception:|Exception occurred:${exception:format=tostring}${newline}", 
      ArchiveEvery  = FileArchivePeriod.Day, 
      ArchiveNumbering = ArchiveNumberingMode.Rolling, 
      MaxArchiveFiles  = 7, 
      ConcurrentWrites = true 
     }; 

     Configuration.AddTarget(FileTarget); 


     // create the viewer target 
     var ViewerTarget = new NLogViewerTarget ("viewer") 
     { 
      Layout    = @"${message}${onexception:${newline} --> Exception occurred\:${exception:format=tostring}", 
      IncludeSourceInfo = true, 
      IncludeCallSite  = true, 
      Address    = @"udp://127.0.0.1:9999" 
     }; 

     Configuration.AddTarget(ViewerTarget); 

     // set the rules 
     Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, FileTarget)); 
     Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, ViewerTarget)); 

     // set the configuration 
     LogManager.Configuration = Configuration; 

     // create a new logger 
     _Logger = LogManager.GetLogger(_ModuleName); 

これはASP.netがnlogに添付されますどのようにもある:

 LoggerFactory.AddNLog(); 
     Application.AddNLogWeb(); 

は、今現在のログのレイアウトは次のようになりますこれは2つのプロセス(動物の名前はプロセスが再起動されるたびに自動的に変更されます) log layout

両方のプロセス:ここではshinobiとmouserunは独自のログ出力を持っていますが、ASPに関係するものは、プロセスに関係なく、MicrosoftというASPのnlogインスタンスに送られます。

目標は、shinobiのloggerに行くshinobiのASP出力とmouserunのloggerに入るmouserun ASPの出力を持つことです。あなたはまた、カスタム・ターゲットを作成し、NLog規則を使用して、このターゲットにすべての非グローバル・ロガーメッセージをリダイレクトすることができ

+0

いいえ、私はからMicrosoftに行く何かを望んでいましたShinobiのプロセスはShinobiのロガーに行くとMouserunからMouserun procesに行くためにMicrosoftに行くものs。 ASPがnlogにログを記録しないようにするために、私はプロセスにログを書き込めるようにするためにASPにコールバックを与えます。 – Thomas

+0

これを追加すると、log4J XML出力にlogger-nameあなたは何とか周りにすべてを構成しました。ファイルターゲットは正常に動作しています。 –

+0

はい、ファイルの出力は正常ですが、UDPは – Thomas

答えて

1

NLog.Extensions.Loggingのコードを見てください.NLog.Extensions.Loggingのコードでは、独自のカスタムログプロバイダーが挿入されています。

あなたが同じことを行うと、ちょうどあなたのグローバルロガーオブジェクトをラップすることができます

https://github.com/NLog/NLog.Extensions.Logging/blob/e48d6cc54d9abd70d976066265c7992117cbac5a/src/NLog.Extensions.Logging/NLogLoggerProvider.cs

https://github.com/NLog/NLog.Extensions.Logging/blob/1474ffe5b26d2ac95534ed01ef259133133bfb67/src/NLog.Extensions.Logging/NLogLoggerFactory.cs

https://github.com/NLog/NLog.Extensions.Logging/blob/2c05a4fbdda0fe026e60814d535e164e18786aef/src/NLog.Extensions.Logging/ConfigureExtensions.cs

public static ILoggerFactory AddNLog(this ILoggerFactory factory, NLogProviderOptions options) 
    { 
     ConfigureHiddenAssemblies(); 

     using (var provider = new NLogLoggerProvider(options)) 
     { 
      factory.AddProvider(provider); 
     } 
     return factory; 
    } 
+0

まさに私が必要なもの!あなたがこれを見て過ごしたすべての時間のために多くのおかげで! – Thomas

+0

https://github.com/NLog/NLog/pull/2390を作成して、NLogViewerTargetで直接LoggerNameの上書きを行うことができます。 –

+1

@Thomas NLog 4.5 RCがリリースされました。これには上記のPRが含まれているので、独自の拡張ロジックを実装してNLogViewerTargetのlogger-nameを上書きする必要はありません。ただNLogViewerTarget.LoggerNameを使用してください –

0

https://github.com/nlog/NLog/wiki/Configuration-file#rules

カスタムターゲットは、ちょうどにログ・イベントを転送することができますグローバル・ロガー:あなたは、環状ログには注意する必要があります

https://github.com/NLog/NLog/wiki/How-to-write-a-custom-target

。 global-loggerからのメッセージを無視するカスタムターゲット内のフィルタがある可能性があります。

しかし、これは醜い解決策だと思うし、私は1つのロガーオブジェクトの制限を理解することができません。理由は、アプリケーションの後に名前を付ける必要があるためです。ロガー名を乱用するのではなく、名前のグローバル変数を使用するのはなぜでしょうか?

+0

その理由は、同じシステム上に同じlibを使用するいくつかのプログラムがあり、同時にロギングを集中させるからです。このプログラムを実行するたびに新しいログファイルが必要になります。アプリケーションが起動すると、名前(ベース名+ランダム部分)が生成され、この特定のインスタンスからの出力は、その方法で指定されたロガーを経由しなければなりません(UDP +ファイルの出力が必要です)。 – Thomas

+0

システムは非常にうまく動作しますが、Nlogの統合によって「Microsoft」というロガーインスタンスが作成され、ASP関連のものがすべて取得されるため、ログ記録者名 – Thomas

+0

でソートされているので、UDPロガーのすべてのアプリケーションのASP出力をマージします。だから、現在のソリューションは機能しますが、ASPでフックするだけで、ASPの代わりにログ出力をログできるようになります。このため、私はASP/Nlogの統合を取り除き、受け取ったすべてのメッセージについて、アプリケーションインスタンスのロガーに転送するだけです。 – Thomas

0

LogEventInfoにロガーを固定するカスタムターゲットラッパーを作成することができます。そのため、ラップされたターゲット(UDP-/File-target)に転送されると、すべて同じロガーから来ているように見えます。

https://github.com/NLog/NLog/issues/2352

再び本当に醜いソリューションを、とにロガー名を使用しないようにする方法、把握することはできないときにのみ使用してください:この男がやろうとしているものと同様に

(例えば、何かを使ってfile-target-filenameを設定する)必要なNlog-targetsの設定。

関連する問題