2016-09-22 20 views
0

ネットワークサービスとして動作するASP.MVCアプリケーションの一部として、Windows 2008サーバー上でログとデバッグファイルを毎日作成しています。ログは正常に作成されますが、実行されるクリーンアップ操作もありますが、ファイルを削除する権限の問題があります。Log4Net RollingFileAppenderはファイルをネットワークサービスとして削除できません

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); 
    } 

は、私はサービスのアクセス権をネットワーク化するために行う必要があるか、私はそれが自動的にネットワークサービスは、ファイルを削除することを可能にするようにコードを変更する必要がないものがありますか?

答えて

2

Network Serviceには、ログディレクトリ内のファイルを削除する権限がありません。

C:\ inetpub \ Testing \ MyApplication \ log \ディレクトリ内のファイル(ディレクトリ自体のファイルではなくディレクトリ自体)を削除するには、ネットワークサービスのアクセス許可を与える必要があります。