1

我有一个奇怪的情况:

我已将自定义 log4net Appender 配置为写入 Azure 表存储。我有 WorkerRole 和 WebRole。这两个角色都使用 osFamily="3" (Windows Server 2012),我在这两个角色中都使用 .NET 4.5,并为 WebRole 使用 ASP.NET MVC4。一切都在本地配置并正常工作 - 工作人员和 Web 角色都正确记录。但是,当我部署到 Azure 时,只有 Worker 角色日志成功,webrole 不会产生任何日志(任何!),而它应该。

我已经在 WebRole 上配置了 log4net 来调试并将 log4net 调试数据发送到 Trace 以检查一些问题,但它没有发送任何错误/警告。它也不会发送日志消息。

下面是 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]) log4net:defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy] log4net:为程序集创建存储库 [_my_referenced_assembly_,版本 = 1.3.0.20282,文化 = 中性,PublicKeyToken = null] log4net:程序集 [_my_referenced_assembly_, Version=1.3.0.20282, Culture=neutral, PublicKeyToken=null] 从 [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] 从 [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:程序集 [_my_WEB_assembly_,版本=1.3.0.20283,CultureToken=neutral,PublicKey =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”:失败。从 ConfigurationManager 获取“acs:idps”:通过([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。因此,在工人角色大会中,我有:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

在网络角色中,我有:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)]

正如我所说,一切正常,并且在本地运行时可以正常写入表实体。我的本地环境是 Windows 8 Pro,在 IIS 服务器(不是 IIS Express)中运行 Web 角色,即 IIS8。我也尝试将 WebRole executionContext 标记为,elevated但仍然没有任何反应。它就像 log4net 的一个黑洞。

我的自定义附加程序在 Web 和 Worker 项目中都引用的类库类型的单独程序集 .net Framework 4.5(完整)中定义。如前所述 - 在本地一切正常。定义我的自定义附加程序的程序集肯定已加载,因为它还包含我的 Web 应用程序的业务逻辑,它也可以在 Azure 中部署。

更新

有趣的发现。当我使用Debug构建配置时,一切都可以在任何地方运行(也可以使用 azure web 角色)。但是当我使用Release配置(这是打包和生产代码的默认配置)时,我似乎无法让 log4net 在任何地方工作。这意味着我无法使 Log4Net 甚至在本地使用Releaseconfig 运行。没有引发异常,也没有记录错误。多么奇怪……

4

2 回答 2

1

事实证明,Release构建导致问题。根据log4net 的 FAQ 部分,通过程序集级别属性配置 log4net 可能在配置中表现DEBUG不同RELEASE

在我的设置中,我使用的是static readonly property在声明时初始化的(基本控制器)。这似乎破坏了记录器配置。我将我的 Logger 实例移动到instance property我的 Web 应用程序类型,并将我的控制器属性更改为只返回应用程序的属性。现在在所有构建配置中一切正常。

于 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 回答