首页 文章

Log4Net在本地开发结构,工作者角色中工作正常,但在Web角色中没有

提问于
浏览
1

我有一个奇怪的情况:

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

我已经在WebRole上配置了log4net来调试并将log4net调试数据发送到Trace中以检查某些问题,但它不会发送任何错误/警告 . 它也不发送记录消息 .

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

log4net:log4net assembly [log4net,Version = 1.2.11.0,Culture = neutral,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,Version = 1.3.0.20282,Culture = neutral,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:程序集[my_referenced_assembly,Version = 1.3.0.20282,Culture = neutral,PublicKeyToken = null]使用repository [log4net-default-repository]和存储库类型[log4net.Repository.Hierarchy.Hierarchy] log4net:创建存储库[log4net-default- repository]使用类型[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:程序集[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:Assembly [my_WEB_assembly,Version = 1.3.0.20283,Culture = neutral,PublicKeyToken = null]没有指定RepositoryAttribute . log4net:程序集[my_WEB_assembly,Version = 1.3.0.20283,Culture = neutral,PublicKeyToken = null]使用repository [log4net-default-repository]和存储库类型[log4net.Repository.Hierarchy.Hierarchy] log4net:repository [log4net-default-repository ]已经存在,使用存储库类型[log4net.Repository.Hierarchy.Hierarchy]从ServiceRuntime获取“acs:idps”:FAIL . 从ConfigurationManager获取“acs:idps”:PASS([my_value]) .

以下是我的app.config(for worker)和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)]

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

我的自定义appender在一个单独的Assembly,.net Framework 4.5(完整版)中定义,类型为Class Library,它在Web和Worker项目中都被引用 . 如前所述 - 当地一切正常 . 那个集会定义我的自定义appender肯定是加载的,因为它还包含我的Web应用程序的业务逻辑,它也可以在Azure中部署 .

UPDATE

有趣的发现 . 当我使用 Debug 构建配置时,一切都可以工作(azure web role也) . 但是当我使用 Release 配置(这是打包和 生产环境 代码的默认配置)时,我可以't seem to be able to make log4net working anywhere. Meaning that I can' t使Log4Net在本地运行 Release config . 没有引发异常,也没有记录错误 . 虽然它可能很奇怪......

2 回答

  • 1

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

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

  • 0

    关于Azure,我遇到了同样的问题 . 我遇到了在Release配置中没有记录任何内容,即使本地调试和发布都正常工作 . 我的问题不是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));
    

相关问题