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);
}
我是否需要对网络服务权限做些什么,或者我是否需要更改代码,以便它自动允许网络服务删除文件?
网络服务没有权限删除日志目录下的文件。
你需要给网络服务权限来删除C:'inetpub'Testing'MyApplication'log'目录下的文件(不是其中的文件,而是目录本身)。