2017-03-03 14 views
0

リモートアプリケーションがログテーブルにログできるように、NLogのWEB APIコールを作成しています。私のコントローラでダブルログからNLogを停止する方法

私は(今健全性チェックなどのためにハードコードされた)があります。

public static void LogError(string msg, string ex, int appid, string machineName) 
{ 
    LogEventInfo logEvent = new LogEventInfo(LogLevel.Error, "Api Logger", "Another test msg"); 
    logEvent.Properties["myMsg"] = msg; 
    logEvent.Properties["myEx"] = ex; 
    logEvent.Properties["myAppId"] = appid; 
    logEvent.Properties["myMachineName"] = machineName; 
    NLogManager.Instance.Log(logEvent); 
} 

NLogger.LogError("Some Error Message", "An exception", 5, "A computer name"); 

その後、私の静的のlogErrorメソッドは、この(私も)(LogEventInfoを試してみました)ように見えます

最後に、これはそのルールの私のコード最初の設定である(異なるデシベルターゲットと2つの他の人があります):

private static void ConfigureApiLog() 
{ 
    var dbApiErrorTarget = new DatabaseTarget 
    { 
     ConnectionString = ConnectionFactory.GetSqlConnection().ConnectionString, 
     CommandText = "usp_LogError", 
     CommandType = CommandType.StoredProcedure 
    }; 

    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@level", 
     new global::NLog.Layouts.SimpleLayout("${level}"))); 
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@logger", 
     new global::NLog.Layouts.SimpleLayout("${logger}"))); 
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@message", 
     new global::NLog.Layouts.SimpleLayout("${event-properties:item=myMsg}"))); 
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@exception", 
     new global::NLog.Layouts.SimpleLayout("${event-properties:item=myEx}"))); 
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@AppId", 
     new global::NLog.Layouts.SimpleLayout("${event-properties:item=myAppId}"))); 
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@MachineName", 
     new global::NLog.Layouts.SimpleLayout("${event-properties:item=myMachineName}"))); 

    Config.AddTarget("database", dbApiErrorTarget); 

    Config.LoggingRules.Add(new LoggingRule("*", LogLevel.Error, LogLevel.Fatal, dbApiErrorTarget)); 
} 

私は、ロガーインスタンスへのログ呼び出しごとに1つのログを期待するが、私は2を取得していると私は、なぜ正確にはわからない:

Id Date Level Logger Message Exception AppId MachineName 
1 2017-03-03 22:43:20.557 Error Api Logger Another test msg  0 mylocalmachine 
2 2017-03-03 22:43:20.603 Error Api Logger Some Error Message An exception 5 A computer name 

APPID 0は、私のAPIであり、5は、いくつかのリモートアプリです、ハードで符号化この点をPOCとする。

金曜日だとは限りませんが、コードの何が間違っているのかわかりません。どんな助けもありがとう!

+1

'Config.LoggingRules'に他のルールが含まれていないか確認してください。私はそれが賭ける。 – Amy

+0

そうです、それは累積していることが分かります:http://nlog-forum.1685105.n2.nabble.com/Log-generated-twice-in-logfile-td4682750.html。ルールは私が思ったように特定のターゲットではないと思います(なぜ私はそれらのターゲットを渡すのですか)。私は答えとして自由に投稿してください。私はそれを受け入れて、質問を閉じたものとしてマークします。私は、エラーmin maxを記録するという面倒なルールを設定し、もう一つは致命的なmin maxを記録するように設定しましたが、私の問題は理想的ではありませんでしたが、後でApiのカスタムレベルを作るでしょう。 – RandomUs1r

+0

ルール*はターゲット固有のものにすることができます。 XMLを介して設定するルールには、 'writeTo'プロパティがあり、コンマで区切られたターゲットのリストがあります。また、そのプロパティを省略して、すべてのターゲットに書き込みます。私はあまりAPIの設定に精通していませんが、それはおそらく類似しています。デフォルトのルールはすべてのターゲットに書き込まれる可能性があります。 – Amy

答えて

2

NLog のルールは、のターゲットにするか、すべてののターゲットに書き込むことができます。デフォルトのルールは指定されたターゲットを持たないので、あなたが作成したものに書き込みます。独自のルールを追加することもできます。独自のルールは、ターゲットに具体的に書き込みます。

したがって、ダブルロギング。

デフォルトルールを削除して問題を解決できます。

Config.LoggingRules.Clear(); 

ルールを追加する前。

1

この問題があり、問題が見つかりました。問題は、すべてのターゲットのどこにでも2重のエントリがありました。

私はProgram.cs IWebHostBuilder内でUseNLog()を使用した.NETコアWebアプリケーションを持っていました。これにより、内部的にAddNLog()が実行されます。 その後、起動時に私は手動でloggerInstance.AddNLog()を実行して、二重挿入を引き起こしました。

UseNLogがはるかに優れているので、後者が除去されなければならないと、「早く」NLog

を可能にするための時間はそれが役に立てば幸い!

関連する問題