【问题标题】:Log4net not working on AzureLog4net 在 Azure 上不起作用
【发布时间】:2018-10-01 02:49:16
【问题描述】:

Log4net 在本地运行良好,但在 Azure 上,它只创建文件和标头。没有日志写入文件。错误地说文件被另一个程序使用,我添加了 .它在本地创建所有日志。

框架:.net 4.5, Log4net 版本:2.0.3

web.config:

<configuration>
    <configSections>   
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
      </configSections>
    <appSettings>
            <add key="log4net.Internal.Debug" value="true"/>
    </appSettings> 

    <log4net>
        <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <param name="File" value="D:\home\site\wwwroot\log\ErrorLog.log" />
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%n %d [%t] %-5p %c %m%n" />
            </layout>
        </appender>
        <appender name="ALogger" type="HeaderOnceAppender">
          <file type="log4net.Util.PatternString" value="D:\home\site\wwwroot\log\A\ALogger_.csv" />
          <appendToFile value="true" />
          <preserveLogFileNameExtension value="true" />
          <rollingStyle value="Date" />
          <datePattern value="dd-MM-yyyy-HH" />
          <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
          <layout type="log4net.Layout.PatternLayout">
            <header value="Connection Id,Source,DateTime,Event,Logger Source,Stack trace" />
            <conversionPattern value="%n%message,%stacktracedetail{5}" />
          </layout>
        </appender>     
        <appender name="BLogger" type="HeaderOnceAppender">
          <file type="log4net.Util.PatternString" value="D:\home\site\wwwroot\log\B\BLogger_.csv" />
          <appendToFile value="true" />
          <preserveLogFileNameExtension value="true" />
          <rollingStyle value="Date" />
          <datePattern value="dd-MM-yyyy" />
          <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
          <layout type="log4net.Layout.PatternLayout">
            <header value="Process,Message,DateTime" />
            <conversionPattern value="%n%message" />
          </layout>
    </appender> 
        <root>
          <level value="All" />
          <appender-ref ref="LogFileAppender" />
        </root>
        <logger name="ALogger" additivity="False">
          <level value="All" />
          <appender-ref ref="ALogger" />
        </logger>   
        <logger name="BLogger" additivity="False">
          <level value="All" />
          <appender-ref ref="BLogger" />
        </logger>
      </log4net>
</configuration>

Appender 类:

public class HeaderOnceAppender : RollingFileAppender
    {
        protected override void WriteHeader()
        {
            if (LockingModel.AcquireLock().Length == 0)
            {
                base.WriteHeader();
            }
        }
    }

public class xyzOperationLogger
{
    public readonly static ILog ALogger;
    public readonly static ILog BLogger;
    public readonly static ILog System;

    static xyzOperationLogger()
    {
        System = LogManager.GetLogger("System");            
        ALogger = LogManager.GetLogger("ALogger");
        BLogger = LogManager.GetLogger("BLogger");            
        log4net.Config.XmlConfigurator.Configure();
    }
}

Log4net 日志: log4net:打开文件以写入 [D:\home\site\wwwroot\log\ErrorLog.log] 附加 [True] log4net:错误 [FileAppender] 错误代码:GenericFailure。无法获取文件 D:\home\site\wwwroot\log\ErrorLog.log 的锁定。该进程无法访问文件“D:\home\site\wwwroot\log\ErrorLog.log”,因为它正被另一个进程使用。 log4net:创建了 Appender [LogFileAppender]

log4net: Searched for existing files in [D:\home\site\wwwroot\log\A]
log4net: curSizeRollBackups starts at [0]
log4net: [20-04-2018] vs. [20-04-2018]
log4net: Opening file for writing [D:\home\site\wwwroot\log\A\ALogger_.csv] append [True]
log4net: Created Appender [A]
log4net: Adding appender named [A] to logger [ALogger].

same error for BLogger:

log4net:ERROR [HeaderOnceAppender] ErrorCode: GenericFailure. Unable to acquire lock on file D:\home\site\wwwroot\log\B\BLogger_.csv. The process cannot access the file 'D:\home\site\wwwroot\log\B\BLogger_.csv' because it is being used by another process.

【问题讨论】:

  • 如果您对 ErrorLog.log 有此问题,您可以将&lt;lockingModel type="log4net.Appender.FileAppender+MinimalLock" /&gt; 添加到您的配置文件中。有些人有same problem,它说在您的程序集中删除[assembly: log4net.Config.XmlConfigurator(Watch = true)] 这一行。 cs 文件。
  • @JoeyCai 感谢您的回答。使用 有帮助。它从 Error.log 文件中删除了锁。但我现在遇到了新错误。 log4net: Hierarchy Threshold [] log4net: 关闭 Hierarchy [log4net-default-repository]

标签: azure azure-web-app-service log4net


【解决方案1】:

此问题已被多个人报告为问题LOG4NET-178

问题似乎是由 LOG4NET 配置损坏计时问题 引起的启动后立即停止记录。

解决问题的第一步是启用此处所述的 log4net 内部调试功能并修复所有弹出的错误。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

如果问题仍然存在,comment 建议将 LOG4NET 配置从 web.config 移出到单独的文件中,例如 log4net.config。

最后,如果前面的两个步骤都没有帮助并且问题仍然存在,您可以尝试通过调用类构造函数中的配置调用来解决事件计时问题,如comment 中所述。

此外,如果您使用配置属性,则必须调用 log4net 以允许它读取属性。对 LogManager.GetLogger 的简单调用将导致调用程序集上的属性被读取和处理。

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

并对日志进行任何调用(即使是在附加过程中过滤或评估的日志,它也应该强制 log4net 评估您的存储库/层次结构)

static Program()
{
    Log.Debug("Application loaded.");
}

不要忘记在您的配置中添加&lt;log4net debug="true"&gt; 这一行。 更多详情请参考thread

【讨论】:

    【解决方案2】:

    其中一个问题可能是由确认顺序引起的:

    static xyzOperationLogger()
    {
        System = LogManager.GetLogger("System");            
        ALogger = LogManager.GetLogger("ALogger");
        BLogger = LogManager.GetLogger("BLogger");            
        log4net.Config.XmlConfigurator.Configure();
    }
    

    加载配置后配置记录器:

    static xyzOperationLogger()
    {
        log4net.Config.XmlConfigurator.Configure(); 
        System = LogManager.GetLogger("System");            
        ALogger = LogManager.GetLogger("ALogger");
        BLogger = LogManager.GetLogger("BLogger");            
    }
    

    【讨论】:

    • 我试过了,但没用。我的文件锁定错误消失了,但我收到了这个新错误 log4net: Hierarchy Threshold [] log4net: Shutdown called on Hierarchy [log4net-default-repository]
    • 此问题仅在 Azure 上发生。 Log4net 在本地环境中运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多