web-dev-qa-db-ja.com

log4netは、XmlConfigurator.Configure()が呼び出された場合にのみ機能します

thisquestionhasbeenaskedseveral = times ですが、残念ながら、ロギング設定を機能させることができませんでした。どこかに非常に小さな間違いを犯さなければなりません。

.NET 4.5 MVC 4/EF 5 Webアプリケーションがあり、ロギングを機能させようとしています。ソリューションには2つのプロジェクトがあり、1つはDAOとモデルオブジェクト用で、もう1つはWebサイト用です。 App.Configファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="RebuildingTogetherEntities" connectionString="stuff..."/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
  <log4net configSource="Log.config" />
</configuration>

同じlog4netセクションもWeb.Configファイルにコピーされています。

両方のAssemblyInfo.csファイルに次を追加しました。

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)]

「出力ディレクトリにコピー」は、両方のLog.Configファイルでtrueに設定されています。

ログを取得して出力ファイルに追加するように思える唯一の方法は、最初のログステートメントが実行される前にXmlConfigurator.Configure()を呼び出すことです。ロガーを最初に入手したときに、それを行うためのファサードを作成できると思いますが、それは間違っているように感じます。

XmlConfiguratorを手動で呼び出さずにロガーを初期化するにはどうすればよいですか?

20
Brad

私はまったく同じ問題に直面しています。正しく指摘したように、AssemblyInfo.csに行を含めるときにXmlConfiguratorを明示的に呼び出す必要はありません。問題は、log4netの最初の使用がその行を持たないアセンブリである場合に発生します。私の場合、Topshelf.Log4Net NuGetパッケージを使用していましたが、アプリケーションがログに記録した最初のログ行はそれを経由していました。

アプリの早い段階で行を記録するか、何も記録する必要がない場合は、私がしたことを実行し、アプリケーションのエントリポイントに次の行を追加します。

LogManager.GetLogger(typeof(Program));
27
Matt Cole

次を使用する場合、XmlConfiguratorを手動で呼び出す必要はありません。

[Assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)]

ただし、すべてのDLLにタグを追加する(すべてのassambly.csファイル)にする必要があります。

9
Peter