次のログアセンブリを使用してコンソールアプリケーションを構成しようとしています。
ロガーがプログラムで構成されている場合、すべてが正常に機能します。
NameValueCollection properties = new NameValueCollection(); properties["showDateTime"] = "true";
Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter(properties);
しかし、次の構成ファイルを使用して起動しようとすると、爆発します。
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
</configSections>
<common>
<logging>
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
<arg key="configType" value="FILE-WATCH"/>
<arg key="configFile" value="~/Log4NET.xml"/>
</factoryAdapter>
</logging>
</common>
</configuration>
関連するエラーメッセージは次のとおりです。
{"Unable to cast object of type 'System.Configuration.DefaultSection' to type 'System.Configuration.AppSettingsSection'."}
{"Failed obtaining configuration for Common.Logging from configuration section 'common/logging'."}
私の構成ファイルを解析できないようですが、正しい形式が何であるかを誰かが知っていますか、それとも間違っているのでしょうか? 公式ドキュメント を使用して設定ファイルを作成しました。
アプリケーション(私がダウンロードしたもの)には2つの問題があります。
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
Log4net-sectionが2回宣言されていることに注意してください。最初のものを削除します。
ファイルまたはアセンブリ 'log4net、Version = 1.2.11.0、Culture = neutral、PublicKeyToken = 669e0ddf0bb1aa2a'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)
Log4netのWebサイトからlog4net 1.2.11.0をダウンロードして解凍し、dllのブロックを解除して、例のlog4netを置き換えたところ、動作するようです。
私はこの(または関連する)問題も抱えていて、半日のエラーハンティングとデバッグの後、構成の問題に絞り込みました。
例外はOPと同じで、その内部のいくつかのレベルの内部例外はCommon.Logging.Log4Net
(FileNotFoundException
)を見つけることができませんでした。
Common.Logging.Log4Net1211 NuGetパッケージの場合、アセンブリ名を単にCommon.Logging.Log4NetではなくCommon.Logging.Log4Net1211に変更したようです。つまり、app.config
では、この新しいアセンブリ名を参照する必要があります:<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211">
参考のために、app.configのcommon/loggingセクション全体を以下に示します。
<common>
<logging>
<!-- Notice that it's Log4net1211 -->
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211">
<arg key="configType" value="FILE-WATCH" />
<arg key="configFile" value="~/Log4Net-MAIN.config" />
</factoryAdapter>
</logging>
</common>
私は使っています
Common.Logging v3.3.1.0
と
Common.Logging.Log4Net1213 v3.3.1.0
ASP.NET Web API v5
、例外をスローします
「親構成セクションは許可されていません」
Common.Logging.ConfigurationSectionHandler.Create メソッドから例外がスローされる
これを機能させるために、アダプターを文法的に構成する必要がありました
var properties = new Common.Logging.Configuration.NameValueCollection();
properties["configType"] = "INLINE";
Common.Logging.LogManager.Adapter = new Log4NetLoggerFactoryAdapter(properties);
IIS/ExpressがCreateメソッドを2回呼び出して、if条件内で例外がスローされる原因を突き止める必要がありますが、少なくとも今のところプレッシャーはありません。
不足しているパッケージをインストールすることで機能しました
Install-Package Common.Logging.Log4Net1211
これは古い質問ですが、私は数週間この問題を抱えていましたが、現在の回答のどれもそれを改善するようには見えませんでした。他の多くのアプリケーションが問題なくほぼ同じ構成を使用していたため、私の構成は正しいように見えました。かなりのデバッグとスタックトレースの実行の後、ようやく問題が見つかりました。
IISでは、APIアプリケーションが別のアプリケーションの下でホストされていることに注意してください。この場合、[〜#〜] camp [〜#〜]アプリケーションと[〜#〜 ] api [〜#〜]アプリケーションは両方ともCommon.Loggingを使用しています。このため、両方のweb.config
ファイルが読み込まれ、Common.Loggingが[〜#〜] camp [〜#〜]の構成を読み取り、それが[〜#〜] api [〜#〜]には設定があり、それも読み取ろうとしますが、Common.Loggingセクションを参照し、すでに読み取っているためスローします[〜#〜] camp [〜#〜]アプリケーションから。
最後に解決策は、[〜#〜] api [〜#〜]を[〜#〜] camp [〜#〜]IISのアプリケーション。ちょっとあいまいなEdgeケースですが、おそらく誰か他の誰かがこの問題にいつか直面するかもしれません。
Common.Logging.Log4Net1211 NuGetパッケージがCommon.Loggingの古いバージョンを取得したことが原因であることがわかりました。 Common.LoggingのNuGet更新を確認し、ダウンロードが見つかった場合は再試行してください。
代わりにCommon.Logging.dllバージョン2.1.1.0を試すことができます。
自分で2つのバージョンのソースをダウンロードして比較できますが、2.1.0.0と2.1.1.0の唯一の違いは、Framework 4.0のバグを回避するための構成設定の読み取りに関する変更です。バグの説明( http://support.Microsoft.com/kb/2580188 を参照)は、ネットワークから実行していないネットワーク共有から実行していることに言及していますが、2.1を使用したテストアプリです.0.0では、2.1.1.0では発生しないのと同じエラーが発生します。
Common.logging.dllのバージョン2.1.0.0を想定している別のライブラリを使用している場合は、代わりにアセンブリリダイレクトを使用して2.1.1.0を使用できるはずです。
PS
関連しているかどうかはわかりませんが、dllの名前をCommon.Logging.Log4Net121.dllのままにして、代わりにapp.configを変更しました
Log4netが2.0.6以上の場合、Common.Logging.Log4Net.Universalパッケージを使用すると便利です。