2016-03-24 28 views
1

私はWindowsプラットフォームまたはLinuxプラットフォーム(CentOS 7)でmono 4.2.3.4/832de4bを使用して実行できる単純なC#アプリケーションを用意しています。Log4NetとMonoにファイル名と行番号がありません

私はWindowsマシン上でlog4netの2.0.5を使って何かをログに記録しようとすると、私はRollingFileAppenderを使用して次のような出力が得られます。

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. 

私はLinuxボックスに上で、これをコピーして、私が得るモノを使用して実行します次のようになります。

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. 

出力からファイル名と行番号が表示されないのはなぜですか?理想的には、私はrsyslogでこの作業をしたいと思いますが、今は私の簡単なアプリケーションが正しく動作するようにしようとしています。

注:私はhereの情報を使って実装したlog4netのラッパークラスを持っています。

RollingFileAppenderの設定は次のようになります。

<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> 

答えて

1

この理由は、log4netのが最初の場所でこの情報を取得します方法です。私はソースコードを見ていませんでしたが、次のような情報をスタックトレースから取得していると確信しています。

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

ランタイムはこの情報を取得しますか?通常、.dllまたは.exeファイル(これらの.pdbファイル)の近くに置くデバッグシンボルから。 exeファイルの近くに.pdbファイルを置かずに上記のコードを実行してみてください。ファイル名と行番号は何も返しません。

モノラルになりました。まず、monoは別のデバッグシンボル形式(.mdbファイル)を使用します。あなたが窓でも実行するならば、モノコンパイラでコンパイルしなかった可能性が高いので、通常の.pdbファイルがあります。 Second - monoは、正しいシンボルであっても、デフォルトで必要な情報を収集しません。 --debugフラグ( "mono --debug")を渡す必要があります。

概要:

  1. モノコンパイラでコンパイルします。
  2. .exeでデバッグシンボルファイル(.mdb)を取得します。
  3. --debugフラグを付けてモノを実行します。
関連する問題