您的位置:首页 > 编程语言 > C#

C# 实现记录每个线程log日志

2009-09-12 23:38 651 查看
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Xml;
using System.Net;
using System.Text;
using System.Data;
using System.IO;
using System.Threading;
using System.Web;
namespace Sample
{
public enum VariableType
{
Text = -1,
FunctionName = 0,
Parameter = 1
}
public static class LogManagement
{
public static Dictionary<int, ThreadLog> _threadLogDictionary = new Dictionary<int, ThreadLog>();
private static ThreadLog ChooseThreadLog()
{
if (_threadLogDictionary.ContainsKey(Thread.CurrentThread.ManagedThreadId))
{
return _threadLogDictionary[Thread.CurrentThread.ManagedThreadId] as ThreadLog;
}
else
{
AddThreadLog();
return _threadLogDictionary[Thread.CurrentThread.ManagedThreadId] as ThreadLog;
}
}
private static void AddThreadLog()
{
if (!_threadLogDictionary.ContainsKey(Thread.CurrentThread.ManagedThreadId))
{
_threadLogDictionary.Add(Thread.CurrentThread.ManagedThreadId,
new ThreadLog());
}
}
private static void RemoveThreadLog()
{
if (_threadLogDictionary.ContainsKey(Thread.CurrentThread.ManagedThreadId))
{
_threadLogDictionary.Remove(Thread.CurrentThread.ManagedThreadId);
}
}
public static string ParkFuncParm(VariableType VbType, string name, string value)
{
return "<" + VbType.ToString() + " name = /"" + name + "/">" + value + "</" + VbType.ToString() + ">";
}
public static void CheckException(Exception exception)
{
if (_threadLogDictionary.ContainsKey(Thread.CurrentThread.ManagedThreadId))
{
ThreadLog TDLog = _threadLogDictionary[Thread.CurrentThread.ManagedThreadId];
TDLog.CheckException(exception);
}
else
{
AddThreadLog();
_threadLogDictionary[Thread.CurrentThread.ManagedThreadId].CheckException(exception);
}
}
public static void MakeLog(string description, string data)
{
ThreadLog TDLog = ChooseThreadLog();
if (TDLog != null)
{
TDLog.MakeLog(description, data);
}
}
public static void BeginLog(string functionName, string variableInfo,string note)
{
ThreadLog TDLog = ChooseThreadLog();
if (TDLog != null)
{
TDLog.BeginLog(functionName, variableInfo, note);
}
}
public static void EndLog(string Data)
{
ThreadLog TDLog = ChooseThreadLog();
if (TDLog != null)
{
TDLog.EndLog(Data);
}
}
public static string GetResult()
{
string ResultData = "<EmptyData></EmptyData>";
ThreadLog TDLog = ChooseThreadLog();
if (TDLog != null && TDLog.XmlDOM != null && TDLog.XmlDOM.DocumentElement != null)
{
ResultData =  TDLog.XmlDOM.DocumentElement.OuterXml;
TDLog.XmlDOM = null;
_threadLogDictionary.Remove(Thread.CurrentThread.ManagedThreadId);
}
return ResultData;
}
}
public class ThreadLog
{
private UInt32 _logId = 1;
private Boolean _hasInitialized = false;
private Stack<LogInformation> _logInfoStack = null;
private XmlDocument _logInfoDataDOM = null;

public XmlDocument XmlDOM
{
set { _logInfoDataDOM = value; }
get { return _logInfoDataDOM; }
}
public ThreadLog()
{
_logInfoStack = new Stack<LogInformation>();
_logInfoDataDOM = new XmlDocument();
}
private void InitializeQuicktakeLog()
{
_logInfoDataDOM.LoadXml("<LogEntry></LogEntry>");
XmlAttribute attr = _logInfoDataDOM.CreateAttribute("RequestURL");
attr.Value = (HttpContext.Current != null && HttpContext.Current.Request != null) ? string.Empty :
HttpContext.Current.Request.RawUrl;
_logInfoDataDOM.DocumentElement.Attributes.Append(attr);
attr = _logInfoDataDOM.CreateAttribute("BeginTime");
attr.Value = DateTime.Now.ToString();
_logInfoDataDOM.DocumentElement.Attributes.Append(attr);
attr = _logInfoDataDOM.CreateAttribute("TotalTime");
attr.Value = DateTime.Now.ToString();
_logInfoDataDOM.DocumentElement.Attributes.Append(attr);
attr = _logInfoDataDOM.CreateAttribute("ThreadId");
attr.Value = Thread.CurrentThread.ManagedThreadId.ToString();
_logInfoDataDOM.DocumentElement.Attributes.Append(attr);
_hasInitialized = true;
}
public void MakeLog(string description, string data)
{
if (!_hasInitialized)
{
InitializeThreadLog();
}
XmlElement XE = _logInfoDataDOM.CreateElement("Log");
_logInfoDataDOM.DocumentElement.AppendChild(XE);
XmlAttribute attr = _logInfoDataDOM.CreateAttribute("Id");
attr.Value = _logId.ToString();
_logId++;
XE.Attributes.Append(attr);
XmlElement XESub = _logInfoDataDOM.CreateElement("LogStep");
XESub.InnerText = data;
attr = _logInfoDataDOM.CreateAttribute("Description");
attr.Value = description;
XESub.Attributes.Append(attr);
XE.AppendChild(XESub);
}
public void BeginLog(string functionName, string variableInfo,string note)
{
LogInformation LogInfo = new LogInformation(_logId, note, functionName, variableInfo);
if (!_hasInitialized)
{
InitializeThreadLog();
}
_logInfoStack.Push(new LogInformation(_logId, note, functionName, variableInfo));
_logId++;
}

public void EndLog(string data)
{
if (_logInfoStack.Count != 0)
{
LogInformation logInfo = _logInfoStack.Pop();
logInfo.EndTime = DateTime.Now;
logInfo.TotalTime = logInfo.EndTime - logInfo.BeginTime;
XmlNode NodeXml = _logInfoDataDOM.DocumentElement as XmlNode;
if (NodeXml != null)
{
XmlElement LogXml = _logInfoDataDOM.CreateElement("Log");
NodeXml.AppendChild(LogXml);
XmlAttribute logidAttr = _logInfoDataDOM.CreateAttribute("Id");
logidAttr.Value = logInfo.Id.ToString();
LogXml.Attributes.Append(logidAttr);
XmlAttribute attr = _logInfoDataDOM.CreateAttribute("TotalTime");
attr.Value = (logInfo.EndTime - logInfo.BeginTime).TotalMilliseconds.ToString();
LogXml.Attributes.Append(attr);
attr = _logInfoDataDOM.CreateAttribute("BeginTime");
attr.Value = logInfo.BeginTime.ToString();
LogXml.Attributes.Append(attr);
LogXml.InnerXml = logInfo.FunctionInfo;
LogXml.InnerXml += logInfo.VariableInfo;
XmlElement LogXml2 = _logInfoDataDOM.CreateElement("Data");
LogXml.AppendChild(LogXml2);
LogXml2.InnerXml = data;
}
}
if (_logInfoStack.Count == 0)
{
if (_logInfoDataDOM.DocumentElement.Attributes["TotalTime"] != null)
{
_logInfoDataDOM.DocumentElement.Attributes["TotalTime"].Value = (
DateTime.Now - DateTime.Parse(_logInfoDataDOM.DocumentElement.Attributes["TotalTime"].Value)).TotalMilliseconds.ToString();
}
}
}

public void CheckException(Exception exception)
{
if (_logInfoStack.Count > 0)
{
LogInformation LogNode = _logInfoStack.Pop();
XmlElement ExcpElem = _logInfoDataDOM.CreateElement("ExceptionDescription");
ExcpElem.InnerXml = "<Exception>" + exception.Message + Environment.NewLine +exception.Source +
Environment.NewLine + exception.StackTrace + Environment.NewLine + "</Exception>" + LogNode.FunctionInfo + LogNode.VariableInfo;
_logInfoDataDOM.DocumentElement.AppendChild(ExcpElem);
_logInfoDataDOM.DocumentElement.Attributes["TotalTime"].Value = (DateTime.Now - DateTime.Parse(_logInfoDataDOM.DocumentElement.Attributes["BeginTime"].Value)).TotalMilliseconds.ToString();
_logInfoStack = null;
}
}

}
public class LogInformation
{
private uint _Id;
private TimeSpan _totalTime;
private DateTime _beginTime;
private DateTime _endTime;
private string _data = null;
private string _functionInfo = null;
private string _variableInfo = null;
private string _note = null;
public uint Id
{
set { _Id = value; }
get { return _Id; }
}
public TimeSpan TotalTime
{
set{ _totalTime = value; }
get { return _totalTime; }
}
public DateTime BeginTime
{
set { _beginTime = value; }
get { return _beginTime; }
}
public DateTime EndTime
{
set { _endTime = value; }
get { return _endTime; }
}
public string FunctionInfo
{
set { _functionInfo = value; }
get { return _functionInfo; }
}
public string VariableInfo
{
set { _variableInfo = value; }
get { return _variableInfo; }
}
public string Note
{
set { _note = value; }
get { return _note; }
}
public string Data
{
set { _data = value; }
get { return _data; }
}
public LogInformation(uint Id, string note, string functionNameInfo, string variableInfo)
{
Initialize();
_Id = Id;
_note = note;
_functionInfo = functionNameInfo;
_variableInfo = variableInfo;
}
private void Initialize()
{
_totalTime = TimeSpan.Zero;
_beginTime = DateTime.Now;
_endTime = _beginTime;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: