mirror of https://github.com/winsw/winsw
Merge 88ec4d5f43
into e4cf507bae
commit
21ed5e186d
|
@ -299,14 +299,24 @@ namespace WinSW
|
||||||
throw new InvalidDataException("Time Based rolling policy is specified but no pattern can be found in configuration XML.");
|
throw new InvalidDataException("Time Based rolling policy is specified but no pattern can be found in configuration XML.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var timeBasedRollingKeepFiles = e.SelectSingleNode("keepFiles");
|
||||||
string? pattern = patternNode.InnerText;
|
string? pattern = patternNode.InnerText;
|
||||||
int period = SingleIntElement(e, "period", 1);
|
int period = SingleIntElement(e, "period", 1);
|
||||||
return new TimeBasedRollingLogAppender(this.LogDirectory, this.LogName, this.OutFileDisabled, this.ErrFileDisabled, this.OutFilePattern, this.ErrFilePattern, pattern, period);
|
return new TimeBasedRollingLogAppender(
|
||||||
|
this.LogDirectory,
|
||||||
|
this.LogName,
|
||||||
|
this.OutFileDisabled,
|
||||||
|
this.ErrFileDisabled,
|
||||||
|
this.OutFilePattern,
|
||||||
|
this.ErrFilePattern,
|
||||||
|
pattern,
|
||||||
|
period,
|
||||||
|
timeBasedRollingKeepFiles == null ? TimeBasedRollingLogAppender.DefaultFilesToKeep : int.Parse(timeBasedRollingKeepFiles.InnerText));
|
||||||
|
|
||||||
case "roll-by-size":
|
case "roll-by-size":
|
||||||
sizeThreshold = SingleIntElement(e, "sizeThreshold", 10 * 1024) * SizeBasedRollingLogAppender.BytesPerKB;
|
sizeThreshold = SingleIntElement(e, "sizeThreshold", 10 * 1024) * SizeBasedRollingLogAppender.BytesPerKB;
|
||||||
int keepFiles = SingleIntElement(e, "keepFiles", SizeBasedRollingLogAppender.DefaultFilesToKeep);
|
int sizeBasedRollingKeepFiles = SingleIntElement(e, "keepFiles", SizeBasedRollingLogAppender.DefaultFilesToKeep);
|
||||||
return new SizeBasedRollingLogAppender(this.LogDirectory, this.LogName, this.OutFileDisabled, this.ErrFileDisabled, this.OutFilePattern, this.ErrFilePattern, sizeThreshold, keepFiles);
|
return new SizeBasedRollingLogAppender(this.LogDirectory, this.LogName, this.OutFileDisabled, this.ErrFileDisabled, this.OutFilePattern, this.ErrFilePattern, sizeThreshold, sizeBasedRollingKeepFiles);
|
||||||
|
|
||||||
case "append":
|
case "append":
|
||||||
return new DefaultLogAppender(this.LogDirectory, this.LogName, this.OutFileDisabled, this.ErrFileDisabled, this.OutFilePattern, this.ErrFilePattern);
|
return new DefaultLogAppender(this.LogDirectory, this.LogName, this.OutFileDisabled, this.ErrFileDisabled, this.OutFilePattern, this.ErrFilePattern);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
|
@ -104,10 +105,13 @@ namespace WinSW
|
||||||
|
|
||||||
protected string ErrFilePattern { get; }
|
protected string ErrFilePattern { get; }
|
||||||
|
|
||||||
|
protected string LogDirectory { get; private set; }
|
||||||
|
|
||||||
protected AbstractFileLogAppender(string logDirectory, string baseName, bool outFileDisabled, bool errFileDisabled, string outFilePattern, string errFilePattern)
|
protected AbstractFileLogAppender(string logDirectory, string baseName, bool outFileDisabled, bool errFileDisabled, string outFilePattern, string errFilePattern)
|
||||||
: base(outFileDisabled, errFileDisabled)
|
: base(outFileDisabled, errFileDisabled)
|
||||||
{
|
{
|
||||||
this.BaseLogFileName = Path.Combine(logDirectory, baseName);
|
this.BaseLogFileName = Path.Combine(logDirectory, baseName);
|
||||||
|
this.LogDirectory = logDirectory;
|
||||||
this.OutFilePattern = outFilePattern;
|
this.OutFilePattern = outFilePattern;
|
||||||
this.ErrFilePattern = errFilePattern;
|
this.ErrFilePattern = errFilePattern;
|
||||||
}
|
}
|
||||||
|
@ -216,13 +220,18 @@ namespace WinSW
|
||||||
{
|
{
|
||||||
public string Pattern { get; }
|
public string Pattern { get; }
|
||||||
|
|
||||||
|
public static int? DefaultFilesToKeep = null;
|
||||||
|
|
||||||
public int Period { get; }
|
public int Period { get; }
|
||||||
|
|
||||||
public TimeBasedRollingLogAppender(string logDirectory, string baseName, bool outFileDisabled, bool errFileDisabled, string outFilePattern, string errFilePattern, string pattern, int period)
|
public int? FilesToKeep { get; private set; }
|
||||||
|
|
||||||
|
public TimeBasedRollingLogAppender(string logDirectory, string baseName, bool outFileDisabled, bool errFileDisabled, string outFilePattern, string errFilePattern, string pattern, int period, int? filesToKeep)
|
||||||
: base(logDirectory, baseName, outFileDisabled, errFileDisabled, outFilePattern, errFilePattern)
|
: base(logDirectory, baseName, outFileDisabled, errFileDisabled, outFilePattern, errFilePattern)
|
||||||
{
|
{
|
||||||
this.Pattern = pattern;
|
this.Pattern = pattern;
|
||||||
this.Period = period;
|
this.Period = period;
|
||||||
|
this.FilesToKeep = filesToKeep;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Task LogOutput(StreamReader outputReader)
|
protected override Task LogOutput(StreamReader outputReader)
|
||||||
|
@ -251,6 +260,40 @@ namespace WinSW
|
||||||
{
|
{
|
||||||
writer.Dispose();
|
writer.Dispose();
|
||||||
copy.Writer = writer = new FileStream(this.BaseLogFileName + "_" + periodicRollingCalendar.Format + ext, FileMode.Create);
|
copy.Writer = writer = new FileStream(this.BaseLogFileName + "_" + periodicRollingCalendar.Format + ext, FileMode.Create);
|
||||||
|
|
||||||
|
if (this.FilesToKeep != null)
|
||||||
|
{
|
||||||
|
var logFiles = new List<string>();
|
||||||
|
|
||||||
|
foreach (string file in Directory.GetFiles(this.LogDirectory, "*" + ext))
|
||||||
|
{
|
||||||
|
DateTime createdAt = File.GetCreationTime(file);
|
||||||
|
|
||||||
|
if (this.BaseLogFileName + "_" + periodicRollingCalendar.GetFormatForDateTime(createdAt) + ext == file)
|
||||||
|
{
|
||||||
|
logFiles.Add(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logFiles.Sort((x, y) => File.GetCreationTime(x).CompareTo(File.GetCreationTime(y)));
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (this.FilesToKeep < logFiles.Count)
|
||||||
|
{
|
||||||
|
var filename = logFiles[0];
|
||||||
|
if (File.Exists(filename))
|
||||||
|
{
|
||||||
|
File.Delete(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
logFiles.RemoveAt(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
this.EventLogger.WriteEntry("Failed to roll log: " + e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,8 @@ namespace WinSW
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Format => this.currentRoll.ToString(this.format);
|
public string GetFormatForDateTime(DateTime datetime) => datetime.ToString(this.format);
|
||||||
|
|
||||||
|
public string Format => this.GetFormatForDateTime(this.currentRoll);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue