SLF释放文件锁

时间:2013-02-15 22:46:01

标签: c# file-locking

我有一个使用SLF进行日志记录的程序。这个程序每周7天,每天24小时运行,我想每天晚上将日志文件上传到远程服务器,以便日后查看。

我的问题是,如何在不关闭程序的情况下释放日志的文件锁?

我希望暂停日志记录,上传日志,删除日志文件或删除内容,然后继续记录。

ILogger logger = LoggerService.GetLogger(typeof(TaskScheduler).FullName);

// Other initialization here

foreach (var task in managedTasks.OrderBy(t => t.Priority))
{
    if (task.NextRunTime <= DateTime.Now)
    {
        dataManager.CurrentStatus = AppStatus.Running;
        if (task.Name == "Log Sender")
        {
             logger = null;
        }

        // Run the task

        if (task.Name == "Log Sender")
        {
            logger = LoggerService.GetLogger(typeof(TaskScheduler).FullName);
        }

        dataManager.CurrentStatus = AppStatus.Idle;
    }
}

目前,当我这样做时,我仍然会收到IOException,因为该文件仍被任务计划程序锁定。

编辑:如果有帮助的话,我在log4net上使用SLF。

2 个答案:

答案 0 :(得分:0)

我认为这是一个设计问题,而不是技术问题。记录单个文件中每天的事件,第二天您可以使用昨天的日志文件执行任何操作。您可以根据需要缩短日志周期(例如,每12小时一次)。

答案 1 :(得分:0)

发布此问题并获得建议后重新考虑我的设计。我开始研究为每个日期创建滚动日志文件。我碰巧遇到了这个问题,完全解决了我的问题:

<appender name="InfoRollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
  <param name="File" value="log.txt" />
  <param name="StaticLogFileName" value="true"/>
  <maximumFileSize value="1024KB" />
  <appendToFile value="true" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%logger: %date{dd MMM yyyy HH:mm:ss} [%thread] %-5level - %message %newline" />
  </layout>
</appender>

我在app.config中配置了log4net appender以跟随lockingModel包含一个“MinimalLock”,这使我能够提取日志内容,将它们上传到服务器然后删除本地日志而无需单独创建指定时间/日期范围的日志文件。

再次感谢大家的帮助,如果没有您的建议,我不会偶然发现这个方便的改变。