mirror of https://github.com/winsw/winsw
added log rotation support
git-svn-id: https://svn.kenai.com/svn/winsw~subversion/trunk@35 c8b2a3fe-9b5b-6a51-a37e-dc31b0e308faremotes/git-svn
parent
454e903a92
commit
f6dc186164
68
Main.cs
68
Main.cs
|
@ -478,6 +478,66 @@ namespace winsw
|
||||||
o.Close();
|
o.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Works like the CopyStream method but does a log rotation.
|
||||||
|
/// </summary>
|
||||||
|
private void CopyStreamWithRotation(FileStream i, string baseName, string ext)
|
||||||
|
{
|
||||||
|
int THRESHOLD = 10 * 1024 * 1024; // rotate every 10MB. should be made configurable.
|
||||||
|
|
||||||
|
byte[] buf = new byte[1024];
|
||||||
|
FileStream w = new FileStream(baseName + ext,FileMode.Append);
|
||||||
|
int sz = new FileInfo(baseName + ext).Length;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
int len = i.Read(buf,0,buf.Length);
|
||||||
|
if (len == 0) break;
|
||||||
|
if (sz + len < THRESHOLD)
|
||||||
|
{// typical case. write the whole thing into the current file
|
||||||
|
w.Write(buf, 0, len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// rotate at the line boundary
|
||||||
|
int s = 0;
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
if (buf[i] != 0x0A) continue;
|
||||||
|
if (sz + i < THRESHOLD) continue;
|
||||||
|
|
||||||
|
// at the line boundary and exceeded the rotation unit.
|
||||||
|
// time to rotate.
|
||||||
|
w.Write(buf, s, i + 1);
|
||||||
|
w.Close();
|
||||||
|
s = i + 1;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for (int j = 8; j >= 0; j--)
|
||||||
|
{
|
||||||
|
string d = baseName + "." + (j + 1) + ext;
|
||||||
|
string s = baseName + "." + (j + 0) + ext;
|
||||||
|
if (File.Exists(d))
|
||||||
|
File.Delete(d);
|
||||||
|
File.Move(s, d);
|
||||||
|
}
|
||||||
|
File.Move(baseName + ext, baseName + ".0" + ext);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
LogEvent("Failed to rotate log: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
w = new FileStream(baseName + ext, FileMode.Append);
|
||||||
|
sz = new FileInfo(baseName + ext).Length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i.Close();
|
||||||
|
w.Close();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Process the file copy instructions, so that we can replace files that are always in use while
|
/// Process the file copy instructions, so that we can replace files that are always in use while
|
||||||
/// the service runs.
|
/// the service runs.
|
||||||
|
@ -543,6 +603,14 @@ namespace winsw
|
||||||
string errorLogfilename = Path.Combine(logDirectory, baseName + ".err.log");
|
string errorLogfilename = Path.Combine(logDirectory, baseName + ".err.log");
|
||||||
string outputLogfilename = Path.Combine(logDirectory, baseName + ".out.log");
|
string outputLogfilename = Path.Combine(logDirectory, baseName + ".out.log");
|
||||||
|
|
||||||
|
if (descriptor.Logmode == "rotate")
|
||||||
|
{
|
||||||
|
string logName = Path.Combine(logDirectory, baseName);
|
||||||
|
new Thread(delegate() { CopyStreamWithRotation(process.StandardOutput, logName, ".out.log"); }).Start();
|
||||||
|
new Thread(delegate() { CopyStreamWithRotation(process.StandardError, logName, ".err.log"); }).Start();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
System.IO.FileMode fileMode = FileMode.Append;
|
System.IO.FileMode fileMode = FileMode.Append;
|
||||||
|
|
||||||
if (descriptor.Logmode == "reset")
|
if (descriptor.Logmode == "reset")
|
||||||
|
|
Loading…
Reference in New Issue