|
- using Shadowsocks.Util;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Net.Sockets;
- using System.Text;
-
- namespace Shadowsocks.Controller
- {
- public class Logging
- {
- public static string LogFile;
-
- public static bool OpenLogFile()
- {
- try
- {
- string temppath = Utils.GetTempPath();
- LogFile = Path.Combine(temppath, "shadowsocks.log");
- FileStream fs = new FileStream(LogFile, FileMode.Append);
- StreamWriterWithTimestamp sw = new StreamWriterWithTimestamp(fs);
- sw.AutoFlush = true;
- Console.SetOut(sw);
- Console.SetError(sw);
-
- return true;
- }
- catch (IOException e)
- {
- Console.WriteLine(e.ToString());
- return false;
- }
- }
-
- public static void Debug(object o)
- {
-
- #if DEBUG
- Console.WriteLine(o);
- #endif
- }
-
- public static void LogUsefulException(Exception e)
- {
- // just log useful exceptions, not all of them
- if (e is SocketException)
- {
- SocketException se = (SocketException)e;
- if (se.SocketErrorCode == SocketError.ConnectionAborted)
- {
- // closed by browser when sending
- // normally happens when download is canceled or a tab is closed before page is loaded
- }
- else if (se.SocketErrorCode == SocketError.ConnectionReset)
- {
- // received rst
- }
- else if (se.SocketErrorCode == SocketError.NotConnected)
- {
- // close when not connected
- }
- else
- {
- Console.WriteLine(e);
- }
- }
- else if (e is ObjectDisposedException)
- {
- }
- else
- {
- Console.WriteLine(e);
- }
- }
- }
-
- // Simply extended System.IO.StreamWriter for adding timestamp workaround
- public class StreamWriterWithTimestamp : StreamWriter
- {
- public StreamWriterWithTimestamp(Stream stream) : base(stream)
- {
- }
-
- private string GetTimestamp()
- {
- return "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "] ";
- }
-
- public override void WriteLine(string value)
- {
- base.WriteLine(GetTimestamp() + value);
- }
-
- public override void Write(string value)
- {
- base.Write(GetTimestamp() + value);
- }
- }
-
- }
|