web-dev-qa-db-ja.com

カスタムプロパティをNLOGに渡して、ファイルに出力できますか?

編集4:「From」はNLogの予約語のようです。 「FromID」の変更は機能しました。これは、変数をNLogに渡し、コードをクリーンに保つための素晴らしい方法です!!!!ありがとうマイク!!!

編集3.私はこのアイデアが本当に好きです。

マイクが以下に提案したように、ヘルパークラスを実装しました。

_public class NLogHelper
{
    //
    // Class Properties
    //
    private Logger m_logger;
    private Dictionary<string, object> m_properties;


    //
    // Constructor
    //
    public NLogHelper(Logger logger)
    {
        m_logger = logger;
        m_properties = new Dictionary<string, object>();
    }

    //
    // Setting Logger properties per instancce
    //
    public void Set(string key, object value)
    {
        m_properties.Add(key, value);
    }

    //
    // Loggers
    //
    public void Debug(string format, params object[] args)
    {
        m_logger.Debug()
            .Message(format, args)
            .Properties(m_properties)
            .Write();
    }
_

そして私のメインコードでは、私は持っています:

_    private NLogHelper m_logger;
    public void Start() 
    {
        m_logger = new NLogHelper(LogManager.GetCurrentClassLogger());
        m_logger.Set("From", "QRT123");  // Class setting.
        m_logger.Debug("Hello ");
    }
_

そして、次のように設定ファイルに設定されたターゲット:

_<target xsi:type="File"
    name ="LogFile" fileName="C:\QRT\Logs\QRTLog-${shortdate}.log"
    layout ="${date}|${level}|${event-properties:item=From}|${message} "/>
_

しかし、出力には「from」プロパティの代わりに空白があります???

だから私はほとんどそこにいます...しかしそれはうまくいかないようです??

編集2:私は今NL​​og呼び出しの独自のバージョンを作成しようとしています:

_private void Log_Debug (string Message) 
{
   LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "What is this?", Message);
   theEvent.Properties["EmployeeID"] = m_employeeID;
   m_logger.Log(theEvent);
}
_

問題は、呼び出しの文字列をフォーマットする必要があることです(ただし、パフォーマンスが大幅に低下します)...しかし、これはハックのようです??

理想的には、カスタムレイアウトレンダラーでプロパティを宣言し、構成ファイルでそれらのプロパティを設定する代わりに、クラスの各インスタンスにプロパティを設定します...クラス全体の_[ID = m_ID]_のようなものです。このようにして、そのクラスからNLogが呼び出されるたびに、IDプロパティが設定され、NLogのカスタムレイアウトレンダラーはこのプロパティを使用して出力できます。私は理にかなっていますか?

私はNLogを初めて使用し、カスタムレンダラーを検討してきました。基本的に、私の目標は、ログステートメントを次のようにすることです。_logger.Debug ("My Name is {0}", "Ed", ID=87);

レンダリングを次のようにしたいと思います:_layout = ${ID} ${date} ${Level} ${Message}_

それでおしまい。 $ {ID}のデフォルト値は0です。しかし、理想的には、ログに記録するたびに3行を必要とせずに、すべての呼び出しでIDを指定できるようにしたいと思います。

出力するものをカスタマイズできるカスタムレンダラーを見たことがありますが、渡すプロパティをカスタマイズする方法がわかりません。

https://github.com/NLog/NLog/wiki/Extending%20NLog は、プロパティを追加する方法を示していますが、それらを呼び出す方法がわかりません。

また、 https://github.com/NLog/NLog/wiki/Event-Context-Layout-Renderer は、カスタムプロパティを設定する方法を示していますが、必要なたびにLogEventInfoオブジェクトを作成する必要がありました。何かをログに記録します。

Nlog Custom layoutrenderer は、出力をカスタマイズする方法を示しています。ここでも...入力をカスタマイズする方法ではありません。

これは、VS2013を使用して.NET 4.0をターゲットとするC#のコンソールアプリ用です

ありがとう-エド

7
Ed Landau

イベントプロパティ(以前はイベントコンテキストと呼ばれていました)は、必要なことを実行するための組み込みの方法です。 NLog 3.2以降を使用している場合は、流暢なAPIを使用できます。これは、LogEventInfoオブジェクトを作成するよりも少し魅力的かもしれません。名前空間_NLog.Fluent_を使用して、このAPIにアクセスできます。

レイアウトは次のように定義されます。

_${event-properties:item=ID} ${date} ${Level} ${Message}
_

次に、流暢なAPIを使用して、次のようにログを記録します。

__logger.Debug()
    .Message("My name is {0}", "Ed")
    .Property("ID", 87)
    .Write();
_

上記のようにイベントごとにプロパティを設定する以外に、他の唯一のオプションは、 [〜#〜] mdc [〜#〜] または [〜#〜] mdlsを使用してスレッドごとにプロパティを設定することです。 [〜#〜]

NLogには、ロガーごとのプロパティを設定する方法がありません(私が見つけた)。内部的には、NLogはロガー名によってLoggerインスタンスをキャッシュしますが、指定されたロガー名に対してLoggerの同じインスタンスが常に返されることを保証するものではありません。したがって、たとえば、クラスのコンストラクターでLogManager.GetCurrentClassLogger()を呼び出すと、ほとんどの場合同じインスタンスが返されます。クラスのすべてのインスタンスのロガー。その場合、クラスのインスタンスごとに、ロガーに個別の値を設定することはできません。

おそらく、クラスでインスタンス化できるロギングヘルパークラスを作成できます。ヘルパークラスは、インスタンスごとのプロパティ値で初期化して、すべてのメッセージとともにログに記録できます。ヘルパークラスは、上記のようにメッセージをログに記録するための便利なメソッドも提供しますが、コードは1行です。このようなもの:

_// Example of a class that needs to use logging
public class MyClass
{
    private LoggerHelper _logger;

    public MyClass(int id)
    {
        _logger = new LoggerHelper(LogManager.GetCurrentClassLogger());

        // Per-instance values
        _logger.Set("ID", id);
    }

    public void DoStuff()
    {
        _logger.Debug("My name is {0}", "Ed");
    }
}


// Example of a "stateful" logger
public class LoggerHelper
{
    private Logger _logger;
    private Dictionary<string, object> _properties;


    public LoggerHelper(Logger logger)
    {
        _logger = logger;
        _properties = new Dictionary<string, object>();
    }

    public void Set(string key, object value)
    {
        _properties.Add(key, value);
    }

    public void Debug(string format, params object[] args)
    {
        _logger.Debug()
            .Message(format, args)
            .Properties(_properties)
            .Write();
    }
}
_

これは、上記と同じレイアウトで機能します。

23
Mike Hixson

NLog 4.5は、メッセージテンプレートを使用した構造化ロギングをサポートしています。

logger.Info("Logon by {user} from {ip_address}", "Kenny", "127.0.0.1");

参照 https://github.com/NLog/NLog/wiki/How-to-use-structured-logging

3
Rolf Kristensen

MDLCレイアウトレンダラーを使用する

MappedDiagnosticsLogicalContext.Set( "PropertyName"、 "PropertyValue"); MappedDiagnosticsLogicalContext.Set( "PropertyName2"、 "AnotherPropertyValue");

Nlog設定で:

$ {mdlc:item = PropertyName} $ {mdlc:item = PropertyName2}

https://github.com/NLog/NLog/wiki/MDLC-Layout-Renderer

2
flux