0

我有一个 Azure 工作者角色,我希望更新日志记录(该项目有现有的日志记录,尽管我不相信它曾经工作过)。它设置为使用 Common.Logging,但使用 Log4Net。我在 Log4Net 中设置了 2 个附加程序——一个用于 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 诊断程序后,我可以看到附加程序正在加载:

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

2 回答 2

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 创建空文件,但这是另一天的另一个问题。

于 2015-12-22T21:07:42.113 回答
0

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

于 2015-12-22T05:32:39.563 回答