0

ログを更新したい Azure ワーカー ロールがあります (プロジェクトには既存のログがありましたが、それが機能しているとは確信していません)。Common.Logging を使用するように設定されていますが、Log4Net を使用しています。Log4Net に 2 つのアペンダーを設定しました。1 つは ElasticSearch に、もう 1 つはローリング ファイルに、どちらも出力をログに記録していません。

worker ロールの app.config で、log4net を構成し、次に Common.Logging を構成しました。

...
<log4net>
<appender name="ElasticSearchAppender" type="log4net.ElasticSearch.ElasticSearchAppender, log4stash">
  <Server>localhost</Server>
  <Port>9200</Port>
  <IndexName>log_test_%{+yyyy-MM-dd}</IndexName>
  <IndexType>LogEvent</IndexType>
  <Bulksize>2000</Bulksize>
  <BulkIdleTimeout>10000</BulkIdleTimeout>
  <IndexAsync>False</IndexAsync>
  <ElasticFilters>
    <Add>
      <Key>My Data Origin</Key>
      <Value>Worker Role</Value>
    </Add>
  </ElasticFilters>
</appender>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
  <file value="C:\tmp\log4net_rollingfile.log" />
  <appendToFile value="true" />
  <maximumFileSize value="100KB" />
  <maxSizeRollBackups value="2" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%level %thread %logger - %message%newline" />
  </layout>
</appender>
<root>
  <level value="ALL" />
  <appender-ref ref="ElasticSearchAppender" />
  <appender-ref ref="RollingFile" />
</root>
</log4net>

<common>
<logging>
  <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
    <arg key="configType" value="INLINE" />
  </factoryAdapter>
</logging>
</common>

構成に何か問題があると思う傾向があります。ただし、RollingFile アペンダーは実際に c:\tmp\log4net_rollingfile.log を作成するため、実際にファイルに何も書き込まれない理由を説明するのに途方に暮れています。また、データは ElasticSearch に送信されません。

「log4net.Internal.Debug」で Log4Net 診断をオンにすると、アペンダーがロードされていることがわかります。

log4net: Adding appender named [ElasticSearchAppender] to logger [root].
log4net: Adding appender named [RollingFile] to logger [root].
4

2 に答える 2

1

この問題を解決するために私がやったことは2つあります。最初のものは不要かもしれませんが、念のためここに含めておきます。2 つ目は、残念ながら、最新の開発が役に立った例にすぎません。ありがたいことに、Common.Logging のソース コードは公開されており、デバッガーで問題を追跡する上で非常に重要でした。

まず (そして、当面の解決策には不要かもしれません)、共通ロギングで log4net factoryAdapter をセットアップする最新の方法は、log4net の現在のバージョンに固有のライブラリを使用することです。私が使用しているバージョン (log4net 1.2.15) にはありませんでしたが、Common.Logging.Log4Net1213 の Log4NetLoggerFactoryAdapter を使用するとうまくいきました。

<common>
<logging>
  <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1213, Version=3.3.1.0, Culture=neutral">
    <arg key="configType" value="INLINE" />
  </factoryAdapter>
</logging>
</common>

次に、この問題の真の核心は app.config でした。上記の元の質問でコピーした app.config ではなく、具体的には app.Debug.config です。私の脳は、app.config に関連する複数のリソースを示唆する app.config の左側にある小さな三角形を完全に無視しました。app.Debug.config で、factoryAdapter が Common.Logging.Simple.TraceLoggerFactoryAdapter で完全にオーバーライドされていました。したがって、メインの app.config に何を入れても、予想される場所にログを書き込むことはありませんでした。RollingFile アペンダー用に空のファイルが作成された理由はわかりませんが、それはまた別の問題です。

于 2015-12-22T21:07:42.113 に答える
0

ログを Web/Worker Role ディレクトリ ツリーに書き込んでみてください。

于 2015-12-22T05:32:39.563 に答える