2011-01-06 29 views
11

Webサービスで参照されるクラスライブラリにロギング機能を実装したいと思います。私はapp.configを追加しようとしましたが、すべてが必要でしたが、例外がスローされたときにlog4netは何もしません。クラスライブラリにlog4netを含めるには?

私のapp.configを

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\mylogfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="test" /> 
     </filter> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="error" /> 
     </filter> 
     <filter type="log4net.Filter.DenyAllFilter" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"/> 
     <appender-ref ref="RollingFileAppender"/> 
     <appender-ref ref="ConsoleAppender" /> 
    </root> 
    </log4net> 
AssemblyInfo.csで

:LogManager.csで

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "app.config")] 

private static readonly ILog Log = log4net.LogManager.GetLogger 
      (MethodBase.GetCurrentMethod().DeclaringType); 
public static void WriteLog(Exception ex) 
{ 
    Log.Error(ex); 
} 

あなたは間違って何を教えていただけますか?私のクラスライブラリでlog4netを動作させるにはどうすればいいですか?

あなたは

+0

WriteLogを呼び出すコードはどのように見えますか? –

+0

btw、あなたのレベルをrootに設定してみましたか?あなたのRollingFileAppenderでそれらのフィルタをすべて削除してみてください。 –

+0

@Pauli:あなたが提案したようにしてみましたが、まだ動作しませんでした:) – Vimvq1987

答えて

1

次の質問に私の答えを参照してください。ありがとうございました。

Use log4net in SDK

それはlog4netの設定ファイルへの完全なパスを構築しますログの設定ルーチンを持っています。あなたがwebserviceにいるので、私はあなたが "app.config"のどこに期待しているのか見ていません。

また、Webサービスから「D:\ mylogfile.txt」に書き込む権限があることを確認してください。

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 17881155) –

6

明示的に宣言されていない限り、実行時に、設定ファイルは常にホストアプリケーションから使用されます。ここでは、web.configがapp.cofigではなく使用されています。むしろ他のカスタム設定ファイル名を言い、ファイルがWebサービスの仮想ディレクトリにコピーされるようにしてください。また、chibacityが言ったように、ログファイルのアクセス許可を確認してください。 Webサービスホストのapp_dataフォルダに保存しておくとよいでしょう。

3

あなたはあなたのようなシンプルなものの構築のいずれか、注射のいくつかの種類を使用することができます

public interface ILogger 
{ 
    void LogInfo(string message); 
     . 
     . 
     . 
} 

をそしてあなただけのlog4netのか、などのラッパーのように、そのインターフェイスに一致する何かを注入。

しかし、私は最も正しいことは、クラスライブラリにログインしないことだと思います。なぜ私はそれはライブラリ自体がアプリケーションではないためだと思うのですが、あなたのWebサービスはあなたのWebサービスが何をログに記録するかを決定する必要があります。例外を記録する場合は、クラスライブラリでキャッチしないで、Webサービスでログを処理できるようにしてください。これにより、ロギングの集中化も容易になります。

+0

@Thomas私は同意します。抽象化を使用していますが、ライブラリにログを記録することが望ましい理由はたくさんあります。診断と監査。ライブラリに何か問題がある場合は、診断を有効にすることが有効です。 –

+0

@chibacity:私の名前はトーマスではないトーマス;)。それを除いて、私はそれらの面であなたに同意しますが、私はそれが最小限に保たれるべきだと思います。ライブラリに何か問題があった場合は、例外が通知され、それがスタックの上位に記録される可能性があります。理想的な世界では、図書館は第三者でなければなりません(しかし、第三の部分でもあります)。あるいは、他の種類の「エラー」について話していますか?例外をスローしないエラー? –

+0

名前のつづりを申し訳ありません:)例外につながっていない問題を分析するのに役立つ情報を指しています。例外がある場合でも、エラーにつながる状態を確認するには、周囲の診断情報を持つことが有用なことがよくあります。これは、ソフトウェアが残酷で珍しい方法で使用されている可能性があるプロダクションでは特に重要です) –

関連する問題