using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Reflection;
namespace MCServerHelper
{
internal static class LogUtility
{
private static readonly object syncObject = new object();
private static string logPath = string.Empty;
private static void CreateLogFile()
{
// not thread safe, just for test
if (string.IsNullOrEmpty(logPath))
{
// Create a log file
DirectoryInfo pathInfo = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + Path.DirectorySeparatorChar + "MCServerHelper");
if (!pathInfo.Exists)
{
pathInfo.Create();
}
FileInfo logFile = new FileInfo(pathInfo.FullName + Path.DirectorySeparatorChar + "logfile.txt");
if (!logFile.Exists)
{
logFile.Create();
}
logPath = logFile.FullName;
}
}
public static void LogException(Exception ex)
{
CreateLogFile();
if (!string.IsNullOrEmpty(logPath))
{
using (StreamWriter writer = new StreamWriter(logPath, true))
{
writer.WriteLine(DateTime.Now.ToString());
writer.WriteLine(ex.Message);
writer.WriteLine(ex.Source);
writer.WriteLine(ex.TargetSite);
writer.WriteLine(ex.StackTrace);
StackTrace trace = new StackTrace(ex);
if (trace.FrameCount > 0)
{
StackFrame frame = trace.GetFrame(0);
if (frame != null)
{
MethodBase method = frame.GetMethod();
writer.WriteLine(string.Format("{0}, Line {1}", method.Name, frame.GetFileLineNumber()));
}
}
writer.WriteLine();
}
if (ex.InnerException != null)
{
LogException(ex.InnerException);
}
}
}
public static void LogMessage(string message)
{
CreateLogFile();
if (!string.IsNullOrEmpty(logPath))
{
using (FileStream stream = new FileStream(logPath, FileMode.Append, FileAccess.Write))
{
using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
{
writer.WriteLine(DateTime.Now.ToString());
writer.WriteLine(message);
writer.WriteLine("");
}
}
}
}
}
}