2

現在、ロギング フレームワークとして NLog を使用しており、非常にうまく機能しています。追加したい機能は、実行時に単一のオブジェクトのログを強制する機能です。これにより、以下のような呼び出しを行うことができます。

_logger.Trace(IForceLog obj, string msg)

インターフェイスの場所:

public interface IForceLog
{
   bool ForceLog { get; }
}

これは、ログ レベルが trace ||obj.ForceLog の場合にログに記録されます。これらの呼び出しのほとんどはオブジェクト内からのものですが、オブジェクトを処理する他のものからのものもあります。

同じタイプのオブジェクトが多数あり、ログファイルを詰まらせることなく、1 つだけの詳細なログを表示し、その動作を詳しく追跡したい場合があります。

この種のことを行う標準的な方法はありますか?

4

2 に答える 2

1

これが答えになるかどうかはわかりませんが、各オブジェクトが一意の ID をログに記録するアプローチを検討しましたか? このようにして、NLog のフィルタリング機能を使用してログの量を制限することができます。ここに古い例があります: http://nlog-forum.1685105.n2.nabble.com/Config-examples-with-filters-td1685363.html

BEGIN NLog フォーラムからのコピー:

完全を期すために(そしてリンクがうまくいかない場合に備えて)、インラインの例を次に示します。

<?xml version="1.0" ?> 
<nlog>
    <targets>
        <target name="console" type="Console" layout="${logger} ${message}" />
    </targets>
    <rules>
        <logger name="*" minlevel="Debug" writeTo="console">
            <filters>
                <whenContains layout="${message}" substring="zzz" action="Ignore" />
            </filters>
        </logger>
    </rules>
</nlog>

このサンプル コード:

using NLog; 
using NLog.Targets; 
using NLog.Targets.Wrappers; 

class Example 
{ 
    static void Main(string[] args) 
    { 
        Logger logger = LogManager.GetLogger("Example"); 
        logger.Debug("log message"); 
        logger.Debug("log zzz message"); 
    } 
} 

「ログ メッセージの例」のみを生成します (2 番目のログ メッセージは、

または、Conditions と呼ばれる新機能 (最新のスナップショットで利用可能) を使用することもできます。これにより、簡単な表記法を使用してフィルターを記述できます。

<filters>
    <when condition="contains(message,'zzz') 
              or level >= LogLevel.Warn 
              or level == LogLevel.Trace" action="Ingore" /> 
</filters>

END NLog フォーラムからのコピー

これはあなたの質問に直接答えるものではありません(設定されたログレベルや使用されているロギング方法(情報、デバッグなど)に関係なく、特定のロギングステートメントを実行すると思います)。NLog に組み込まれているログ レベルの有効化をオーバーライド/回避するのは難しいと思います。

NLog のフィルタリングで目的の結果が得られる場合は、データベースへのログ記録はどうですか? 特定のオブジェクトのログ ステートメントに一意の ID をタグ付けして、すべてをログに記録できます。次に、データベースのフィルタリング/グループ化/ソート機能を使用して、特定のオブジェクトのログ ステートメントのみを表示できます。

幸運を!

于 2013-01-18T18:29:35.413 に答える