奇妙な状況があります:
Azure テーブル ストレージに書き込むようにカスタム log4net Appender を構成しました。WorkerRole と WebRole があります。どちらの役割も osFamily="3" (Windows Server 2012) を使用します。私は両方で .NET 4.5 を使用し、WebRole には ASP.NET MVC4 を使用します。すべてが構成され、ローカルで正常に動作します。ワーカーと Web ロールの両方が正しくログに記録されています。ただし、Azure にデプロイすると、Worker ロールのみが正常にログに記録され、webrole はログを生成しません (すべて!)。
WebRole で log4net を構成して、log4net デバッグ データをデバッグし、トレースに出力していくつかの問題をチェックしましたが、エラーや警告は送信されません。また、ログ メッセージも送信しません。
以下は、log4net デバッグによって生成されたログです (機密データが取り除かれています)。
log4net: log4net アセンブリ [log4net、バージョン = 1.2.11.0、カルチャ = ニュートラル、PublicKeyToken = 669e0ddf0bb1aa2a]。[D:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\59a01799\5b6b1a2\assembly\dl3\8d97587f\b9d49402_c202ce01\log4net.dll] から読み込まれます。(Microsoft Windows NT 6.2.9200.0 上の .NET ランタイム [4.0.30319.18010]) null] log4net: アセンブリ [_my_referenced_assembly_, Version=1.3.0.20282, Culture=neutral, PublicKeyToken=null] Loaded From [D:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\59a01799\ 5b6b1a2\assembly\dl3\8cc98c20\594c5b41_6f07ce01_my_referenced_assembly_.dll] log4net: アセンブリ [_my_referenced_assembly_、Version=1.3.0.20282、Culture=neutral、PublicKeyToken=null] に RepositoryAttribute が指定されていません。log4net: リポジトリ [log4net-default-repository] およびリポジトリ タイプ [log4net.Repository.Hierarchy.Hierarchy] を使用したアセンブリ [_my_referenced_assembly_、Version=1.3.0.20282、Culture=neutral、PublicKeyToken=null] log4net: リポジトリの作成 [log4net-default-タイプ [log4net.Repository.Hierarchy.Hierarchy] を使用して「Microsoft.WindowsAzure.ServiceRuntime、Version=1.8.0.0、Culture=neutral、PublicKeyToken=31bf3856ad364e35」をロード ServiceRuntime から「_some_setting_1_」を取得: PASS (_my_value1_)。ServiceRuntime から "_some_setting_2_" を取得しています: PASS (_my_value2_)。ServiceRuntime から "_some_setting_3_" を取得しています: PASS (_my_value3_)。ServiceRuntime から "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" を取得しています: PASS (_my_conn_string_)。ServiceRuntime から "_some_setting_4_" を取得しています: PASS (_my_value4_)。log4net: アセンブリのリポジトリを作成しています [_my_WEB_assembly_, Version=1.3.0.20283, Culture=neutral, PublicKeyToken=null] log4net: Assembly [_my_WEB_assembly_, Version=1.3.0.20283, Culture=neutral, PublicKeyToken=null] Loaded From [D:\Windows \Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\59a01799\5b6b1a2\assembly\dl3\f695181f\98c73242_6f07ce01_my_WEB_assembly_.dll] log4net: Assembly [_my_WEB_assembly_, Version=1.3.0.20283, Culture=neutral, PublicKeyToken] =null] には RepositoryAttribute が指定されていません。log4net: アセンブリ [_my_WEB_assembly_、バージョン = 1.3.0.20283、カルチャ = ニュートラル、PublicKeyToken=null] リポジトリ [log4net-default-repository] およびリポジトリ タイプ [log4net.Repository.Hierarchy.Hierarchy] を使用 log4net: リポジトリ [log4net-default-repository] は既に存在し、リポジトリ タイプ [log4net.Repository.Hierarchy.Hierarchy] を使用ServiceRuntime から "acs:idps" を取得しています: FAIL。ConfigurationManager から "acs:idps" を取得しています: PASS ([my_value])。
これは、私の app.config (ワーカー用) と web.config (Web ロール用) ファイルの両方のサンプルです (念のため、これを WaIISHost.config にも設定しましたが、結果は同じです - 完全にミュートされた WebRole):
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
...
</configSections>
...
<log4net>
<appender name="AzureTableStoreAppender" type="_MyAssembly_.Logging.AzureTableStorageAppender, MyAssembly">
</appender>
<root>
<level value="ALL" />
<appender-ref ref="AzureTableStoreAppender" />
</root>
</log4net>
</configuration>
アセンブリ レベル属性を介して log4net を構成します。したがって、Worker ロール アセンブリには次のようなものがあります。
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
そして、私が持っているWebロールでは:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)]
私が言ったように、ローカルで実行すると、すべてが正常に機能し、テーブル エンティティが正常に書き込まれます。私のローカル環境は Windows 8 Pro で、IIS8 である IIS サーバー (IIS Express ではない) で Web ロールを実行しています。また、WebRole executionContext をマークしようとしましたelevated
が、まだ何も起こりません。log4net のブラックホールのようなものです。
私のカスタム アペンダーは、Web プロジェクトとワーカー プロジェクトの両方で参照されるクラス ライブラリ タイプの別のアセンブリ .net Framework 4.5 (full) で定義されています。すでに述べたように、ローカルではすべて正常に動作します。カスタム アペンダーを定義するアセンブリは確実に読み込まれます。これは、Azure にデプロイされた Web アプリのビジネス ロジックも含まれているためです。
アップデート
興味深い発見。ビルド構成を使用すると、Debug
すべてがどこでも機能します (Azure Web ロールも)。しかし、Release
構成 (パッケージ化および製品コードのデフォルト) を使用すると、log4net をどこでも動作させることができないようです。構成でローカルでもLog4Netを実行できないことを意味しRelease
ます。例外は発生せず、エラーもログに記録されません。可能な限り奇妙に...