2016-03-24 3 views
1

Ich habe eine einfache C# -Anwendung, die ich auf einer Windows-Plattform oder einer Linux-Plattform (CentOS 7) mit Mono 4.2.3.4/832de4b ausführen kann.Log4Net mit Mono fehlt Dateiname und Zeilennummern

Wenn ich versuche, etwas zu protokollieren Log4Net mit 2.0.5 auf einem Windows-Rechner ich die folgende Ausgabe ein RollingFileAppender erhalten mit:

2016-03-24 09:09:40,374 DEBUG 8 C:\src\Test\Program.cs::20::This is my debug message. 
2016-03-24 09:09:40,397 INFO 8 C:\src\Test\Program.cs::21::This is my info message. 
2016-03-24 09:09:40,398 WARN 8 C:\src\Test\Program.cs::22::This is my warning message. 
2016-03-24 09:09:40,398 FATAL 8 C:\src\Test\Program.cs::23::This is my fatal message. 
2016-03-24 09:09:40,399 ERROR 8 C:\src\Test\Program.cs::24::This is my error message. 

Wenn ich das über auf eine Linux-Box kopieren und ausführen mono mit mir Folgendes:

2016-03-24 09:58:58,913 DEBUG 1 ::0::This is my debug message. 
2016-03-24 09:58:58,920 INFO 1 ::0::This is my info message. 
2016-03-24 09:58:58,920 WARN 1 ::0::This is my warning message. 
2016-03-24 09:58:58,923 FATAL 1 ::0::This is my fatal message. 
2016-03-24 09:58:58,923 ERROR 1 ::0::This is my error message. 

Warum fehlen mir der Dateiname und die Zeilennummern aus meiner Ausgabe? Idealerweise möchte ich, dass dies mit rsyslog funktioniert, aber im Moment versuche ich, dass meine einfache App korrekt funktioniert.

HINWEIS: Ich habe eine Wrapper-Klasse um log4net, die ich mit den Informationen von here implementiert habe.

Die RollingFileAppender Config sieht wie folgt aus:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="test_logfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="50MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date %-5level %thread %file::%line::%message%newline" /> 
     </layout> 
    </appender> 

Antwort

1

Der Grund dafür ist die Art und Weise log4net diese Informationen in erster Linie bekommt. Ich sah sie nicht an Quellcode, aber ich bin mir ziemlich sicher, dass es diese Informationen von Stack-Trace nimmt, wie etwas mit:

var frame = new System.Diagnostics.StackTrace(true).GetFrame(0); 
var filename = frame.GetFileName(); 
var lineNumber = frame.GetFileLineNumber(); 

Wo Laufzeit diese Informationen bekommt? Normalerweise aus dem Debuggen von Symbolen, die Sie in der Nähe Ihrer .dll- oder .exe-Dateien (diese .pdb-Dateien) platzieren. Versuchen Sie nicht, PDB-Datei in der Nähe Ihrer EXE-Datei und führen Sie Code oben - es wird nichts für Dateiname und Zeilennummer zurückgegeben.

Jetzt zu Mono. Zunächst verwendet Mono ein anderes Format für Debugging-Symbole (MDB-Dateien). Wenn Sie auch unter Windows laufen - wahrscheinlich haben Sie nicht mit Mono-Compiler kompiliert, also haben Sie normale .NET-PDB-Dateien. Second - Mono wird standardmäßig keine Informationen sammeln, auch nicht mit korrekten Symbolen. Du musst --debug flag ("mono --debug") übergeben.

Zusammenfassung:

  1. Compile mit Mono-Compiler.
  2. Bringen Sie Debugging-Symbole Dateien (.mdb) mit Ihrer .exe.
  3. Führen Sie Mono mit - Debug Flag.