2009-07-13 8 views
-1

Ich will Protokoll linenumt zu meiner Protokolldatei, log4net.the config Details von log4net wird programmgesteuert geschrieben. Ich versuchte Hölle Ding, um Zeilennummer zu protokollieren bekommen, aber helfen weniger, hier ist mein Code, um Zeilennummer in meiner App programmgesteuert zu protokollieren

privater IAppender CreateFileAppender (string name, string filename) {

 PatternLayout layout = new PatternLayout();    
     //layout.ConversionPattern = "%d{MM/dd/yy HH:mm:ss} %line %-5p : %m%n"; 
     //layout.ConversionPattern = "%d{MM/dd/yy HH:mm:ss} 5p [%t] (%F:%L) - %m%n"; 
     layout.ConversionPattern = "%5p %d{yyyy-MM-dd hh:mm:ss tt} (%c:%L) - [%X   {UserIdentityName}] %m%n"; 
     layout.ActivateOptions(); 
     FileAppender appender = new FileAppender(layout, HCVIEWERLOG_FILENAME, true); 
     appender.Layout = layout; 
     appender.Name = HCVIEWERLOG_APPENDER; 
     appender.File = HCVIEWERLOG_FILENAME; 
     appender.AppendToFile = true;   
     string[] Args = Environment.CommandLine.Split 
      ("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);    
     foreach(string txt in Args) 
      appender.Threshold = txt.ToString().ToUpper().Contains("DEBUG") ? 
      log4net.Core.Level.Debug : log4net.Core.Level.Off; 
     appender.ActivateOptions(); 
        return (appender as IAppender); 
    } 

noch habe ich versucht, Zeilennummer immer mit stacktrace aber im den Wert als 0 hier immer ist der Code

geschützter Zeichenfolge GetLogMessage (string message) {

 StackTrace stackTrace = new StackTrace(true); 
     StackFrame stackFrame = stackTrace.GetFrame(3); 
     return (stackFrame.GetMethod().DeclaringType.Name 
      + "|" + stackFrame.GetMethod().Name 
      + "|" + **stackFrame.GetFileLineNumber()** 
      + "||||" + message); 
    } 

Antwort

3

Zwei Dinge hier:

1) Stellen Sie sicher, dass die PDB-Dateien vorhanden sind, sonst werden Sie immer eine Null erhalten.

2) Achten Sie darauf, dass Sie den richtigen Stapelrahmen abrufen. Der aktuelle Stapelrahmen ist der nullte. Wenn Sie den Stapel nach oben gehen, werden Sie durch Ihren Code gehen, ABER über Ihrem Code auf dem Stapel wird eine Ladung von Rahmenaufrufen sein, um die Anwendung zu starten, und diese werden eine Null-Zeilennummer haben. dies zeigt

Dieses Stück Code:

static void Main(string[] args) 
{ 
    WriteOutStack(); 
    Console.ReadLine(); 
} 

public static void WriteOutStack() 
{ 
    StackTrace stackTrace = new StackTrace(true); 
    for (int i = 0; i < (stackTrace.FrameCount); i++) 
    { 
     StackFrame stackFrame = stackTrace.GetFrame(i); 
     Console.WriteLine("{0}.{1} ({2})", 
      stackFrame.GetMethod().DeclaringType.Name, 
      stackFrame.GetMethod().Name, 
      stackFrame.GetFileLineNumber()); 
    } 
} 

OUTPUT:

Program.WriteOutStack (20) 
Program.Main (15) 
AppDomain._nExecuteAssembly (0) 
HostProc.RunUsersAssembly (0) 
ExecutionContext.Run (0) 
ThreadHelper.ThreadStart (0) 

Der Ausgang oben zeigt, dass, wenn ich durch die beiden Schichten gegangen sind, die meinen Code bilden, ich bin in der Framework selbst, für das keine Zeilennummern verfügbar sind.

Der Hauptgrund, warum ich dies erwähne ist, dass ich bemerkt habe, dass Sie in Ihrem Beispiel einen bestimmten Stack Frame (Frame 3) bekommen haben, also dachte ich, dass es sich lohnt, zu erhöhen. (Mit anderen Worten, stellen Sie sicher, dass Sie den Stapel nicht umgekehrt in dem handgewalzten Code lesen, den Sie oben gezeigt haben).

+0

danke Rob, Ich versuchte, wie Sie bereits erwähnt, ja die grundlegende Unterstreichung zu sein ist die Punkt 1 meninoed.pdb-Datei sollte zusammen mit dll ausgeliefert werden. aus meiner Neugier, gibt es trotzdem können wir Zeilennummer ohne Verwendung von PDB-Datei bekommen? danke nochmal. –

+0

ziemlich sicher, die Antwort ist nein. Ohne pdb gibt es nichts, was die Binärdateien mit dem ursprünglichen Code, aus dem sie stammen, in Beziehung setzen könnte –

1

Wenn Sie Ihre PDB-Dateien zusammen mit Ihrem .dlls versenden sollten Sie Zeilennummern in Ihrer Stack-Trace erhalten.

+0

danke Matt, wenn ich .pdb-Dateien zusammen mit dll es funktioniert, aber wir liefern nur dll.is gibt es sowieso, um linenumber zu bekommen? Nochmals vielen Dank für Ihre freundliche Hilfe –

+0

Die einzige Möglichkeit, die Sie tun können, ist die Zeilennummer in der Protokollnachricht angeben - so würde es in Ihrem Code sein, und dann müssten Sie es pflegen. Schlechte Idee. Warum sollten Sie Ihre Log-Nachrichten nicht nur so eindeutig machen, dass Sie Ihren Code schnell durchforsten können, um die Zeile zu finden? –

+0

derzeit implimented wie du erwähnt.Ich dachte mit Zeile Nummer ich werde gut aussehen, sowieso ok jetzt. danke. –

Verwandte Themen