Nik*_*sen 5 c# log4net multithreading log4net-configuration
我有一个"有趣"的问题,如果log4net来自ASP.NET MVC中的工作线程,它们不会写日志消息.当我添加<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />到我的log4net配置以及网站在我的服务器(IIS 8.0)上运行时,这似乎只是一个问题.在我自己的计算机上,log4net可以很好地记录消息 - 即使使用MinimalLock配置,如果我删除了这个'MinimalLock',它也会在服务器上的工作线程中记录消息.
这是一个例子:
public class MvcApplication : System.Web.HttpApplication
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
protected void Application_Start()
{
// This is logged just fine - with or without MinimalLock,
// both local and on server
log.Info("Logging ouside worker!");
// This is only logged without MinimalLock configured
// if the site is hosted on my server runnning IIS 8.0.
var thread = new Thread(() => log.Info("Logging inside worker!"));
thread.Start();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的log4net配置:
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="App_Data\log.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
</log4net>
Run Code Online (Sandbox Code Playgroud)
如果没有配置MinimalLock lockingModel,我将无法读取服务器上的日志文件,因此删除它不是一个真正的选择.我也无法避免记录工作线程,因为我需要记录Quartz.net产生的工作者内部的潜在错误.
我怀疑这是在服务器上权限的问题,但我对服务器的渠道非常有限,因为我不是管理员(我基本上只具有FTP访问 - 他们甚至不会给予我的MSSQL数据库的外部访问).
这是问题所在
如果我的怀疑是正确的,我应该向服务器管理员请求哪些更改才能解决问题?应该向哪个用户授予哪些权限,以便MinimalLock在我的托管环境中正常工作?
如果它不是权限问题,它可能是什么呢?
任何帮助深表感谢.提前致谢.
更新:
启用log4net的调试日志后,我在运行上面的示例代码时发现了以下错误(省略了完整路径):
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file App_Data\log.log. Access to the path 'App_Data\log.log' is denied.
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file App_Data\log.log. Access to the path 'App_Data\log.log' is denied.
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file App_Data\log.log. Access to the path 'App_Data\log.log' is denied.
log4net: ConfigureAndWatchHandler: Changed [web.config]
log4net: ConfigureAndWatchHandler: Changed [web.config]
log4net: Hierarchy: Shutdown called on Hierarchy [log4net-default-repository]
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file App_Data\log.log. Access to the path 'App_Data\log.log' is denied.
log4net:ERROR [RollingFileAppender] Could not close writer [log4net.Util.CountingQuietTextWriter]
log4net.Appender.FileAppender+LockingStream+LockStateException: The file is not currently locked
at log4net.Appender.FileAppender.LockingStream.AssertLocked()
at log4net.Appender.FileAppender.LockingStream.Flush()
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Dispose(Boolean disposing)
at System.IO.StreamWriter.Close()
at log4net.Util.QuietTextWriter.Close()
at log4net.Appender.TextWriterAppender.CloseWriter()
Run Code Online (Sandbox Code Playgroud)
这些只发生在服务器上.
我设法解决了这个问题。
在我的托管环境中,工作线程与与其父线程不同的 Windows 标识相关联。工作线程使用的身份仅对我的 App_Data/Logs 文件夹具有读取权限。由于我对服务器的访问受到限制,我创建了一个 .cshtml 文件,以编程方式向工作线程的标识添加写入和修改权限。