@@ -12,14 +12,17 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
public static string LogFilePath; | public static string LogFilePath; | ||||
private static FileStream fs; | |||||
private static StreamWriterWithTimestamp sw; | |||||
public static bool OpenLogFile() | public static bool OpenLogFile() | ||||
{ | { | ||||
try | try | ||||
{ | { | ||||
LogFilePath = Utils.GetTempPath("shadowsocks.log"); | LogFilePath = Utils.GetTempPath("shadowsocks.log"); | ||||
FileStream fs = new FileStream(LogFilePath, FileMode.Append); | |||||
StreamWriterWithTimestamp sw = new StreamWriterWithTimestamp(fs); | |||||
fs = new FileStream(LogFilePath, FileMode.Append); | |||||
sw = new StreamWriterWithTimestamp(fs); | |||||
sw.AutoFlush = true; | sw.AutoFlush = true; | ||||
Console.SetOut(sw); | Console.SetOut(sw); | ||||
Console.SetError(sw); | Console.SetError(sw); | ||||
@@ -35,7 +38,10 @@ namespace Shadowsocks.Controller | |||||
private static void WriteToLogFile(object o) | private static void WriteToLogFile(object o) | ||||
{ | { | ||||
Console.WriteLine(o); | |||||
try { | |||||
Console.WriteLine(o); | |||||
} catch(ObjectDisposedException) { | |||||
} | |||||
} | } | ||||
public static void Error(object o) | public static void Error(object o) | ||||
@@ -48,6 +54,15 @@ namespace Shadowsocks.Controller | |||||
WriteToLogFile(o); | WriteToLogFile(o); | ||||
} | } | ||||
public static void clear() { | |||||
sw.Close(); | |||||
sw.Dispose(); | |||||
fs.Close(); | |||||
fs.Dispose(); | |||||
File.Delete(LogFilePath); | |||||
OpenLogFile(); | |||||
} | |||||
[Conditional("DEBUG")] | [Conditional("DEBUG")] | ||||
public static void Debug(object o) | public static void Debug(object o) | ||||
{ | { | ||||
@@ -149,25 +149,25 @@ namespace Shadowsocks.View | |||||
private void UpdateContent() | private void UpdateContent() | ||||
{ | { | ||||
using (StreamReader reader = new StreamReader(new FileStream(filename, | |||||
FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) | |||||
{ | |||||
reader.BaseStream.Seek(lastOffset, SeekOrigin.Begin); | |||||
string line = ""; | |||||
bool changed = false; | |||||
while ((line = reader.ReadLine()) != null) | |||||
{ | |||||
changed = true; | |||||
LogMessageTextBox.AppendText(line + Environment.NewLine); | |||||
} | |||||
if (changed) | |||||
{ | |||||
LogMessageTextBox.ScrollToCaret(); | |||||
try { | |||||
using(StreamReader reader = new StreamReader(new FileStream(filename, | |||||
FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) { | |||||
reader.BaseStream.Seek(lastOffset, SeekOrigin.Begin); | |||||
string line = ""; | |||||
bool changed = false; | |||||
while((line = reader.ReadLine()) != null) { | |||||
changed = true; | |||||
LogMessageTextBox.AppendText(line + Environment.NewLine); | |||||
} | |||||
if(changed) { | |||||
LogMessageTextBox.ScrollToCaret(); | |||||
} | |||||
lastOffset = reader.BaseStream.Position; | |||||
} | } | ||||
lastOffset = reader.BaseStream.Position; | |||||
} catch(FileNotFoundException) { | |||||
} | } | ||||
this.Text = I18N.GetString("Log Viewer") + | this.Text = I18N.GetString("Log Viewer") + | ||||
@@ -247,6 +247,8 @@ namespace Shadowsocks.View | |||||
#region Clean up the content in LogMessageTextBox. | #region Clean up the content in LogMessageTextBox. | ||||
private void DoCleanLogs() | private void DoCleanLogs() | ||||
{ | { | ||||
Logging.clear(); | |||||
lastOffset = 0; | |||||
LogMessageTextBox.Clear(); | LogMessageTextBox.Clear(); | ||||
} | } | ||||