azure - Log4Net 在本地开发结构和辅助角色中工作正常,但在 Web 角色中则不行

标签 azure log4net azure-web-roles

我有一个奇怪的情况:

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

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

这是log4net调试生成的日志(剥离了敏感数据):

log4net: log4net assembly [log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. Loaded from [D:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\59a01799\5b6b1a2\assembly\dl3\8d97587f\b9d49402_c202ce01\log4net.dll]. (.NET Runtime [4.0.30319.18010] on Microsoft Windows NT 6.2.9200.0) log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy] log4net: Creating repository for assembly [_my_referenced_assembly_, Version=1.3.0.20282, Culture=neutral, PublicKeyToken=null] log4net: Assembly [_my_referenced_assembly_, Version=1.3.0.20282, Culture=neutral, PublicKeyToken=null] Loaded From [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: Assembly [_my_referenced_assembly_, Version=1.3.0.20282, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified. log4net: Assembly [_my_referenced_assembly_, Version=1.3.0.20282, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy] log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy] Loaded "Microsoft.WindowsAzure.ServiceRuntime, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Getting "_some_setting_1_" from ServiceRuntime: PASS (_my_value1_). Getting "_some_setting_2_" from ServiceRuntime: PASS (_my_value2_). Getting "_some_setting_3_" from ServiceRuntime: PASS (_my_value3_). Getting "Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" from ServiceRuntime: PASS (_my_conn_string_). Getting "_some_setting_4_" from ServiceRuntime: PASS (_my_value4_). log4net: Creating repository for assembly [_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] Loaded From [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: Assembly [_my_WEB_assembly_, Version=1.3.0.20283, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified. log4net: Assembly [_my_WEB_assembly_, Version=1.3.0.20283, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy] log4net: repository [log4net-default-repository] already exists, using repository type [log4net.Repository.Hierarchy.Hierarchy] Getting "acs:idps" from ServiceRuntime: FAIL. Getting "acs:idps" from ConfigurationManager: PASS ([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。因此,在 worker 角色组装中我有:

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

在网络角色中我有:

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

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

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

更新

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

最佳答案

事实证明,Release 构建导致了问题。根据log4net's FAQ section ,通过程序集级别属性配置 log4net 在 DEBUGRELEASE 配置中可能表现不同。

在我的设置中,我使用了在声明时初始化的静态只读属性(基本 Controller 的)。这似乎导致了记录器配置的错误。我将 Logger 实例移至 Web 应用程序类型的实例属性,并将 Controller 属性更改为仅返回应用程序的属性。现在,所有构建配置中的一切都工作正常。

关于azure - Log4Net 在本地开发结构和辅助角色中工作正常,但在 Web 角色中则不行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14796587/

相关文章:

azure - GitHub 推送到 Azure 网站

azure - windows azure网站预览A记录专用IP

java - 在 Java 中使用 Visual Studio Code 的 Azure Functions 项目

azure - web.config 中的监控触发器不适用于 .net core Web 应用程序

具有静态文件扩展名的 Log4Net 复合 RollingFileAppender

log4net,这个配置怎么了

azure - 无法在同意屏幕中验证日历权限

c# - 以编程方式更改 log4net 日志记录级别

azure - 是否可以从已部署的 Web 角色获取 web.config?

azure - 如何以编程方式重新启动 Azure VM 角色 (PaaS VM)