Development Class C#

/****************************************************************************************************************
*                                                                                                               *
* Copyright (C) 2011 5173.com                                                                                   *
* This project may be copied only under the terms of the Apache License 2.0.                                    *
* Please visit the project Home Page http://bqqapicsharp.codeplex.com/ for more detail.                         *
*                                                                                                               *
****************************************************************************************************************/
namespace BQQAPIClient.Core.Utility
{
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Reflection;
    using System.Text;
    using System.Threading;
    public enum LogLevel
    {
        None = 0,
        Debug = 1,
        Info = 2,
        Warning = 3,
        Error = 4,
    }
    internal class Logger
    {
        private static object locker = new object();
        private static StreamWriter sw;
        private static LogLevel logLevel;
        private static Timer changePathTimer;
        private static readonly int CHANGEPATHINTERVAL = 60 * 1000;
        private static readonly string LOGFILENAMEFORMAT = "yyyyMMddHH";
        private static readonly string LOGLINEFORMAT = "HH:mm:ss_ffff";
        static Logger()
        {
            changePathTimer = new Timer(state =>
            {
                sw.Close();
                InitStreamWriter();
            }, null, CHANGEPATHINTERVAL, CHANGEPATHINTERVAL);
            InitStreamWriter();
        }
        public static void Dispose()
        {
            lock (locker)
            {
                changePathTimer.Dispose();
                sw.Flush();
                sw.Close();
            }
        }
        public static void SetLogLevel(LogLevel level)
        {
            logLevel = level;
        }
        private static void InitStreamWriter()
        {
            sw = new StreamWriter(GetLogFileName(), true, Encoding.UTF8, 1024);
            sw.AutoFlush = true;
        }
        private static string GetLogFileName()
        {
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log");
            if (!Directory.Exists(path)) Directory.CreateDirectory(path);
            string file = DateTime.Now.ToString(LOGFILENAMEFORMAT) + ".txt";
            return Path.Combine(path, file);
        }
        public static void Debug(string s)
        {
            if ((int)logLevel <= (int)LogLevel.Debug)
                Log(LogLevel.Debug, s);
        }
        public static void Debug(string format, params object[] args)
        {
            if ((int)logLevel <= (int)LogLevel.Debug)
                Log(LogLevel.Debug, format, args);
        }
        public static void Info(string s)
        {
            if ((int)logLevel <= (int)LogLevel.Info)
                Log(LogLevel.Info, s);
        }
        public static void Info(string format, params object[] args)
        {
            if ((int)logLevel <= (int)LogLevel.Info)
                Log(LogLevel.Info, format, args);
        }
        public static void Warning(string s)
        {
            if ((int)logLevel <= (int)LogLevel.Debug)
                Log(LogLevel.Warning, s);
        }
        public static void Warning(string format, params object[] args)
        {
            if ((int)logLevel <= (int)LogLevel.Debug)
                Log(LogLevel.Warning, format, args);
        }
        public static void Error(string s)
        {
            if ((int)logLevel <= (int)LogLevel.Error)
                Log(LogLevel.Error, s);
        }
        public static void Error(string format, params object[] args)
        {
            if ((int)logLevel <= (int)LogLevel.Error)
                Log(LogLevel.Error, format, args);
        }
        private static void Log(LogLevel logLevel, string s)
        {
            lock (locker)
            {
                sw.WriteLine(WrapWithContext(logLevel, s));
            }
        }
        private static void Log(LogLevel logLevel, string format, params object[] args)
        {
            Log(logLevel, string.Format(format, args));
        }
        private static string WrapWithContext(LogLevel logLevel, string s)
        {
            StackTrace strackTrace = new StackTrace();
            StackFrame[] stackFrames = strackTrace.GetFrames();
            StackFrame stackFrame = null;
            for (int i = 0; i < stackFrames.Length; i++)
            {
                if (stackFrames[i].GetMethod().ReflectedType != typeof(Logger))
                {
                    stackFrame = stackFrames[i];
                    break;
                }
            }
            MethodBase methodBase = stackFrame.GetMethod();
            string method = string.Format("{0}.{1}", methodBase.DeclaringType.Name, methodBase.Name);
            return string.Format("[{0}] @{3} #{4} {1} - {2}", logLevel, method, s, DateTime.Now.ToString(LOGLINEFORMAT), Thread.CurrentThread.ManagedThreadId);
        }
    }
}