1

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

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

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

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。

4

2 回答 2

0

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

于 2013-02-15T23:06:49.033 回答
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”,这使我能够提取日志的内容,将它们上传到服务器,然后擦除本地日志,而无需创建单独的日志文件指定的时间/日期跨度。

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

于 2013-02-19T15:50:49.597 回答