我有一个奇怪的情况:
我已将自定义 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 甚至在本地使用Release
config 运行。没有引发异常,也没有记录错误。多么奇怪……