我有一个评估者“有趣的”问题,如果log4net来自ASP.NET MVC的工作线程内部,则log4net不会写日志消息。仅当我将<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();
    }

}

这是我的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>

如果没有配置MinimalLocklockingModel,我将无法读取服务器上的日志文件,因此删除它实际上不是一个选择。我也无法避免在工作线程内部进行日志记录,因为我需要在Quartz.net产生的工作程序内部记录潜在的错误。

我怀疑这是服务器上的权限问题,但是我对服务器的访问非常有限,因为我不是管理员(我基本上只有FTP访问权限-他们甚至都不会授予我对MSSQL DB的外部访问权限)。

这是的问题

如果我的怀疑是正确的,我应该要求服务器管理员进行哪些更改以解决该问题?为了使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()

这些仅在服务器上发生。

最佳答案

我设法解决了这个问题。

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

关于c# - log4net不使用MinimalLock模型登录工作线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27493863/

10-17 01:42