kann ich eine benutzerdefinierte Eigenschaft an NLOG übergeben und in eine Datei ausgeben?

EDIT 4: "From" scheint ein reserviertes Wort in NLog zu sein. Ändern "FromID" hat funktioniert. Dies ist eine großartige Möglichkeit, Variablen an NLog zu übergeben und trotzdem den Code sauber zu halten. DANKE MIKE !!!

EDIT 3. Diese Idee gefällt mir sehr gu

Eine Helferklasse implementiert, wie unten von Mike vorgeschlagen:

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();
    }

und in meinem Hauptcode habe ich:

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

Und das Ziel in der Konfigurationsdatei wie folgt festgelegt:

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

Aber die Ausgabe hat ein BLANK anstelle der 'from'-Eigenschaft ???

So bin ich fast da ... aber es scheint nicht zu funktionieren ??

EDIT 2: Ich versuche jetzt, eine eigene Version des NLog-Aufrufs zu erstellen:

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);
}

Das Problem ist, dass ich die Zeichenfolge für die Aufrufe formatieren muss (aber ein riesiger Performance-Deal) ... aber das scheint ein Hack zu sein ??

Ideally würde ich Eigenschaften im benutzerdefinierten Layout-Renderer deklarieren und anstatt diese Eigenschaften in der Konfigurationsdatei festzulegen, würde für jede Instanz meiner Klasse die Eigenschaft festgelegt ... so etwas wie[ID = m_ID] für die ganze Klasse. Auf diese Weise wird jedes Mal, wenn ein NLog von dieser Klasse aufgerufen wird, die ID-Eigenschaft festgelegt, und der benutzerdefinierte Layout-Renderer von NLog kann diese Eigenschaft zur Ausgabe verwenden. Mache ich Sinn ??

Ich bin neu bei NLog und habe mir benutzerdefinierte Renderer angesehen. Grundsätzlich ist mein Ziel, dass meine Log-Anweisungen wie folgt lauten:_logger.Debug ("My Name is {0}", "Ed", ID=87);

und ich möchte, dass mein Rendering so aussieht wie:layout = ${ID} ${date} ${Level} ${Message}

Das ist es. $ {ID} kann einen Standardwert von 0 haben. Aber im Idealfall möchte ich, dass jeder Anruf die Möglichkeit hat, eine ID anzugeben, ohne dass jedes Mal, wenn ich mich anmelden möchte, drei Zeilen erforderlich sind.

Ich habe benutzerdefinierte Renderer gesehen, mit denen ich meine Ausgabe anpassen kann, aber ich bin nicht sicher, wie ich die Eigenschaften anpassen kann, die ich an sie übergebe, ohne

https: //github.com/NLog/NLog/wiki/Extending%20NLo zeigt, wie ich Eigenschaften hinzufügen kann, aber ich weiß nicht, wie ich sie aufrufen soll.

Ebenfalls,https: //github.com/NLog/NLog/wiki/Event-Context-Layout-Rendere zeigt, wie ich benutzerdefinierte Eigenschaften festlegen kann, wobei jedoch jedes Mal, wenn ich etwas protokollieren möchte, ein LogEventInfo-Objekt erstellt wird.

Nlog Benutzerdefinierter Layoutrenderer zeigt, wie die Ausgabe angepasst wird. Nochmals ... nicht, wie die Eingaben angepasst werden.

Dies ist für eine Konsolenanwendung in C #, die mit VS2013 auf .NET 4.0 abzielt.

Danke -Ed

Antworten auf die Frage(8)

Ihre Antwort auf die Frage