diff --git a/Main.cs b/Main.cs
index 46e3f6e..4b6f25b 100644
--- a/Main.cs
+++ b/Main.cs
@@ -225,7 +225,7 @@ namespace winsw
///
- /// Logmode to 'reset', 'roll' once or 'append' [default] the out.log and err.log files.
+ /// Logmode to 'reset', 'rotate' once or 'append' [default] the out.log and err.log files.
///
public string Logmode
{
@@ -464,9 +464,9 @@ namespace winsw
///
/// Copy stuff from StreamReader to StreamWriter
///
- private void CopyStream(StreamReader i, StreamWriter o)
+ private void CopyStream(Stream i, Stream o)
{
- char[] buf = new char[1024];
+ byte[] buf = new byte[1024];
while (true)
{
int sz = i.Read(buf, 0, buf.Length);
@@ -492,10 +492,11 @@ namespace winsw
while (true)
{
int len = data.Read(buf, 0, buf.Length);
- if (len == 0) break;
+ if (len == 0) break; // EOF
if (sz + len < THRESHOLD)
{// typical case. write the whole thing into the current file
w.Write(buf, 0, len);
+ sz += len;
}
else
{
@@ -520,7 +521,8 @@ namespace winsw
string src = baseName + "." + (j + 0) + ext;
if (File.Exists(dst))
File.Delete(dst);
- File.Move(src, dst);
+ if (File.Exists(src))
+ File.Move(src, dst);
}
File.Move(baseName + ext, baseName + ".0" + ext);
}
@@ -529,10 +531,14 @@ namespace winsw
LogEvent("Failed to rotate log: " + e.Message);
}
- w = new FileStream(baseName + ext, FileMode.Append);
+ // even if the log rotation fails, create a new one, or else
+ // we'll infinitely try to rotate.
+ w = new FileStream(baseName + ext, FileMode.Create);
sz = new FileInfo(baseName + ext).Length;
}
}
+
+ w.Flush();
}
data.Close();
w.Close();
@@ -623,8 +629,8 @@ namespace winsw
CopyFile(errorLogfilename, errorLogfilename + ".old");
}
- new Thread(delegate() { CopyStream(process.StandardOutput, new StreamWriter(new FileStream(outputLogfilename, fileMode))); }).Start();
- new Thread(delegate() { CopyStream(process.StandardError, new StreamWriter(new FileStream(errorLogfilename, fileMode))); }).Start();
+ new Thread(delegate() { CopyStream(process.StandardOutput.BaseStream, new FileStream(outputLogfilename, fileMode)); }).Start();
+ new Thread(delegate() { CopyStream(process.StandardError.BaseStream, new FileStream(errorLogfilename, fileMode)); }).Start();
}
private void LogEvent(String message)