log4net没有使用MinimalLock模型登录工作线程

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)

这些只发生在服务器上.

Nik*_*sen 1

我设法解决了这个问题。

在我的托管环境中,工作线程与与其父线程不同的 Windows 标识相关联。工作线程使用的身份仅对我的 App_Data/Logs 文件夹具有读取权限。由于我对服务器的访问受到限制,我创建了一个 .cshtml 文件,以编程方式向工作线程的标识添加写入和修改权限。