为什么 log4net 随机停止使用 SignalR 登录?

Why does log4net randomly stops to log with SignalR?

我有两个 SignalR 服务器使用 redis 背板并使用 log4net。当我启动应用程序时,一切正常,日志文件已正确写入两台服务器。但有时,日志文件不再写入,内部调试日志显示:

log4net: Opening file for writing [C:\myLogPath\] append [True]

...每次必须记录新行(按秒计算超过 100 次 - 这是预期的记录率)且没有任何错误消息,无论是之前还是之后。问题同时发生在两台服务器上——记录的最后一行完全相同;这就是我写 SignalR 服务器使用背板的原因。这是我的 log4net.config :

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
        <param name="File" value="C:\myLogPath\SignalR\log.txt" />
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        <appendToFile value="true" />
        <rollingStyle value="Date" />
        <maxSizeRollBackups value="-1" />
        <maximumFileSize value="100MB" />
        <datePattern value="ddMMyyyy" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date - %-5level - %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

我确定文件没有被卷起,因为 maxSizeRollBackups 设置为 -1(相当于无限)并且 log.txt 文件权重 ~16MB,远离 maximumFileSize。我试过使用和不使用 MinimalLock,没有任何效果。


这里是 Startup class,我在这里启动 log4net :

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            Common.Logger.Start(ConfigurationManager.AppSettings["pathLog4net"]);
            Common.Logger.Info("Démarrage SignalR");

            //Connect to backplane, make some DI, singletons initialisations...

            Common.Logger.Info("Mapping");
            app.Map("/signalr", map =>
            {
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration
                {
                    EnableJSONP = true,
                    EnableDetailedErrors = HttpContext.Current.IsDebuggingEnabled
                };
                map.RunSignalR(hubConfiguration);
            });
        }
    }

...和封装log4net的Common.Logger class :

    public static class Logger
    {
        private static log4net.ILog Log { get; set; }

        static Logger()
        {
            Log = log4net.LogManager.GetLogger(typeof(Logger));
        }

        public static void Start(string path)
        {
            log4net.Config.XmlConfigurator.Configure(new FileInfo(path));
        }

        public static void Error(object msg)
        {
            Log.Error(msg);
        }

        public static void Info(object msg)
        {
            Log.Info(msg);
        }
    }

每个集线器方法都会调用 Logger.Info 方法,所以我想知道这是否可能是并发问题,但 log4net 文档指出它是安全的 - 虽然我不知道它在哪个级别是;并且问题恰好在同一时间发生在第二个 SignalR 上。每次我重新启动应用程序时,日志都会在未定义的时间内工作,然后再次停止。

我尝试更改 log4net 配置,禁用内部日志,但没有任何效果。我不知道该怎么办了……为什么日志停止了?为什么 log4net 无法附加到文件,即使内部日志显示 Opening file [...] append [True] ?如果有人知道我将永远感激:)


编辑:显然正确设置了权限 - 我很生气我可耻地尝试 Full controlEveryone...

Sooooo...实际上这是一个简单的问题。我的网站正在使用业务层,它们有自己的 log4net 实例,使用相同的配置文件...所以这只是一个锁定错误。

我把signalr日志封装改成使用业务层的log4net,现在一切正常

提示:当出现锁定错误时,log4net 似乎只在第一次尝试写入所述文件时记录它。