为什么 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 control
到 Everyone
...
Sooooo...实际上这是一个简单的问题。我的网站正在使用业务层,它们有自己的 log4net 实例,使用相同的配置文件...所以这只是一个锁定错误。
我把signalr日志封装改成使用业务层的log4net,现在一切正常
提示:当出现锁定错误时,log4net 似乎只在第一次尝试写入所述文件时记录它。
我有两个 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 control
到 Everyone
...
Sooooo...实际上这是一个简单的问题。我的网站正在使用业务层,它们有自己的 log4net 实例,使用相同的配置文件...所以这只是一个锁定错误。
我把signalr日志封装改成使用业务层的log4net,现在一切正常
提示:当出现锁定错误时,log4net 似乎只在第一次尝试写入所述文件时记录它。