/****************************************************************************************************************
* *
* 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);
}
}
}