Log4Net + Common.Logging + Azure =清空日志文件

时间:2015-12-22 00:03:51

标签: azure logging log4net common.logging

我有一个Azure工作者角色,我希望更新日志记录(该项目已经存在日志记录,尽管我不相信它曾经工作过)。它设置为使用Common.Logging,但使用Log4Net。我在Log4Net中设置了2个appender - 一个用于ElasticSearch,另一个用于滚动文件 - 两者都没有记录任何输出。

在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 appender确实创建了c:\ tmp \ log4net_rollingfile.log,所以我无法解释为什么没有实际写入文件。此外,没有数据发送到ElasticSearch。

使用“log4net.Internal.Debug”打开Log4Net诊断程序后,我可以看到appender正在加载:

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

2 个答案:

答案 0 :(得分:1)

我最终做了两件事来解决这个问题。第一个可能没有必要,但为了以防万一,我把它包括在这里。第二个 - 嗯,这只是现代发展的一个例子,不幸的是有帮助。值得庆幸的是,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 appender创建空文件,但这是另一天的另一个问题。

答案 1 :(得分:0)

尝试将日志写入Web / Worker角色目录树。