using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Threading; using System.Runtime.CompilerServices; namespace EAS.Distributed { /// /// 文本文件日志记录器。 /// /// /// 日志输出到文本文件。 /// class TextLogger:IDisposable { private string path = "logs"; private bool m_PathOK = false; #region 公共属性 /// /// 日志路径。 /// public string Path { get { return this.path; } set { this.path = value; } } #endregion void Initialize() { } /// /// 文件名称。 /// public string FileName { get; set; } #region 求基础路径 /// /// 求日志记录的基础路径。 /// /// string GetBasePath() { return XUpdate.Instance.GetBaseDirectory(); } #endregion #region ILogger 成员 public void Info(string message) { if (message == null) return; StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format("{0},Info - {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message)); this.AppendLineText(sb); } public void Warn(string message) { if (message == null) return; StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format("{0},Warn - {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message)); this.AppendLineText(sb); } public void Debug(string message) { if (message == null) return; StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format("{0},Debug - {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message)); //sb.AppendLine(); this.AppendLineText(sb); } public void Error(string message) { if (message == null) return; StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format("{0},Error - {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message)); //sb.AppendLine(); this.AppendLineText(sb); } public void Error(Exception exc) { if (exc == null) return; System.Exception exc2 = exc; while (true) { long ml = GC.GetTotalMemory(false); double memory = (double)ml / (1024 * 1024); StringBuilder sb = new StringBuilder(); if (exc2 is System.Reflection.TargetInvocationException) { //continue; } else if (exc2 is System.Reflection.TargetParameterCountException) { //continue; } else if (exc2 is System.Reflection.TargetException) { //continue; } else { sb.AppendLine("[类型]:Error"); sb.AppendLine("[线程]:" + Thread.CurrentThread.ManagedThreadId.ToString()); sb.AppendLine("[内存]:" + memory.ToString("F2") + "M"); sb.AppendLine("[时间]:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); sb.AppendLine("[内容]:" + exc2.Message); sb.AppendLine("[来源]:" + exc2.Source); sb.AppendLine("[目标]:" + exc2.TargetSite); sb.AppendLine("[堆栈]:" + exc2.StackTrace); this.AppendLineText(sb); } if (exc2.InnerException == null) break; exc2 = exc2.InnerException; } } #endregion /// /// 2013-09-30,多线程排列写日志会导致页面转向之后会话和应用结束和重启,shit,Fuck iis。 /// /// /// [MethodImpl(MethodImplOptions.Synchronized)] void AppendLineText(StringBuilder sb) { try { using (StreamWriter writer = this.GetStreamWriter()) { lock (writer) { writer.WriteLine(sb); } } } catch (System.Exception exc) { // } } StreamWriter GetStreamWriter() { StreamWriter m_Writer = null; string m_Directory = this.Path; #region 处理路径 if (!this.m_PathOK) { if (m_Directory.StartsWith("..\\")) { string m_Path = this.GetBasePath(); while (true) { m_Path = Directory.GetParent(m_Path).ToString(); m_Directory = m_Directory.Substring(3, m_Directory.Length - 3); if (!m_Directory.StartsWith("..\\")) { m_Directory = System.IO.Path.Combine(m_Path, m_Directory); break; } } } else if (this.Path.IndexOf(":") < 0) { string m_Path = this.GetBasePath(); m_Directory = System.IO.Path.Combine(m_Path, this.Path); } if (m_Directory.StartsWith("file:\\")) { m_Directory = m_Directory.Substring(6, m_Directory.Length - 6); } this.path = m_Directory; this.m_PathOK = true; } #endregion if (!Directory.Exists(m_Directory)) Directory.CreateDirectory(m_Directory); //升级日志。 m_Directory = System.IO.Path.Combine(m_Directory, "update"); if (!Directory.Exists(m_Directory)) Directory.CreateDirectory(m_Directory); //当天记录。 if (!string.IsNullOrEmpty(this.FileName)) { m_Directory = System.IO.Path.Combine(m_Directory,string.Format("{0}.log",this.FileName)); } else { m_Directory = System.IO.Path.Combine(m_Directory, string.Format("{0}.log",DateTime.Now.ToString("yyyyMMdd"))); } if (File.Exists(m_Directory)) m_Writer = File.AppendText(m_Directory); else m_Writer = File.CreateText(m_Directory); return m_Writer; } #region IDisposable 成员 void IDisposable.Dispose() { } #endregion } }