Log4Net RollingFileAppender不能作为网络服务删除文件

本文关键字:网络服务 删除 文件 RollingFileAppender 不能 Log4Net | 更新日期: 2023-09-27 18:08:28

我让log4net每天在Windows 2008服务器上创建一个日志和调试文件,作为ASP的一部分。作为网络服务运行的MVC应用程序。它可以很好地创建日志,但也有一个清理操作正在运行,但这是一个删除文件的权限问题。我得到的错误是:

Access to the path 'C:'inetpub'Testing'MyApplication'log'Error-2016.08.22.log' is denied. 

如果我改变文件的权限,使网络服务有完全的控制,那么应用程序可以删除它。

代码如下:

    private void ConfigLog4Net(int maxAgeInDays)
    {
        var sFilename = AppDomain.CurrentDomain.BaseDirectory + @"'Log4Net.config";
        log4net.Config.XmlConfigurator.ConfigureAndWatch(
            new System.IO.FileInfo(sFilename));
        Log.InfoFormat("Log4Net Config - {0}", sFilename);
        var repository = LogManager.GetRepository() as Hierarchy;
        if (repository != null)
        {
            var appenders = repository.GetAppenders();
            if (appenders != null)
            {
                foreach (var appender in appenders)
                {
                    if (appender is RollingFileAppender)
                    {
                        var rollingFileAppender = appender as RollingFileAppender;
                        CleanupLogs(rollingFileAppender, maxAgeInDays);
                    }
                }
            }
        }
    }

    private void CleanupLogs(RollingFileAppender appender, int maxAgeInDays)
    {
        if (!File.Exists(appender.File)) return;
        var datePatternBits = appender.DatePattern.Split(new char[]{''''}, StringSplitOptions.None);
        if (datePatternBits.Count() != 5 || datePatternBits[0].Length > 0 || datePatternBits[4].Length > 0)
            throw new ApplicationException(
                string.Format(
                    "Log4Net RollingFileAppender ({0} DatePattern unexpected format. Expected '"''xxx''date''eee'''" {1},{2},{3}",
                    appender.Name, datePatternBits.Count(), datePatternBits[0].Length, datePatternBits[4].Length));
        List<string> logPatternsToKeep = new List<string>();
        for (var i = 0; i <= maxAgeInDays; i++)
            logPatternsToKeep.Add(DateTime.Now.AddDays(-i).ToString(appender.DatePattern));
        FileInfo fileInfo = new FileInfo(appender.File);
        var searchString = string.Format("{0}*{1}", datePatternBits[1], datePatternBits[3]);
        var folderFiles =
            fileInfo.Directory.GetFiles(searchString);
        var logFiles = folderFiles
            .Where(x => logPatternsToKeep.All(y => !x.Name.Contains(y) && x.Name != fileInfo.Name));
        foreach (var log in logFiles)
            if (File.Exists(log.FullName)) File.Delete(log.FullName);
    }

我是否需要对网络服务权限做些什么,或者我是否需要更改代码,以便它自动允许网络服务删除文件?

Log4Net RollingFileAppender不能作为网络服务删除文件

网络服务没有权限删除日志目录下的文件。

你需要给网络服务权限来删除C:'inetpub'Testing'MyApplication'log'目录下的文件(不是其中的文件,而是目录本身)。