1

奇妙な状況があります:

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ます。例外は発生せず、エラーもログに記録されません。可能な限り奇妙に...

4

2 に答える 2

1

Releaseビルドが問題を引き起こしていることが判明しました。log4net の FAQ セクションによると、アセンブリ レベル属性を介して log4net を構成すると、構成内で異なる動作をする場合がDEBUGありRELEASEます。

私のセットアップではstatic readonly property、宣言時に初期化された(ベースコントローラーの)を使用していました。これは、ロガーの設定にバグがあるようです。Logger インスタンスをinstance propertyWeb アプリケーション タイプの に移動し、コントローラー プロパティを変更して、アプリケーションのプロパティのみを返すようにしました。現在、すべてのビルド構成ですべてが正常に機能しています。

于 2013-02-10T15:46:21.100 に答える
0

Azureに関しては、同じ問題に遭遇しました。ローカルでデバッグとリリースの両方が正常に機能している場合でも、リリース構成では何もログに記録されていないことに遭遇しました。私の問題はlog4netの構成ではなく、初期化でした。

私はそれをそのように持っていました:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

それで、それを次の行に置き換えたところ、役に立ちました:

private readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(WorkerRole));
于 2014-06-26T11:29:10.930 に答える