记录日志(日志处理)
1.对方法的调用:
对日志加以分类处理,是的在项目中排查问题时,能够快速准确地定位错误,并迅速解决,从而极大程度上提高效率,利于整体的工作的开展。
- TimeSpan理解:
private string DateDiff(DateTime DateTime1, DateTime DateTime2)
{string dateDiff = null;
TimeSpan ts = DateTime1.Subtract(DateTime2).Duration();
dateDiff = ts.Days.ToString()+"天"+ ts.Hours.ToString()+"小时"+ ts.Minutes.ToString()+"分钟"+ ts.Seconds.ToString()+"秒";
return dateDiff;
}
(1)DateTime值类型代表了一个从公元0001年1月1日0点0分0秒到公元9999年12月31日23点59分59秒之间的具体日期时刻。因此,你可以用DateTime值类型来描述任何在想象范围之内的时间。
一个DateTime值代表了一个具体的时刻 ;
(2)TimeSpan值包含了许多属性与方法,用于访问或处理一个TimeSpan值
下面的列表涵盖了其中的一部分:
Add:与另一个TimeSpan值相加; Days:返回用天数计算的TimeSpan值。 Duration:获取TimeSpan的绝对值;
Hours:返回用小时计算的TimeSpan值 ;Milliseconds:返回用毫秒计算的TimeSpan值; Minutes:返回用分钟计算的TimeSpan值;
Negate:返回当前实例的相反数; Seconds:返回用秒计算的TimeSpan值;Subtract:从中减去另一个TimeSpan值;
Ticks:返回TimeSpan值的tick数; TotalDays:返回TimeSpan值表示的天数;TotalHours:返回TimeSpan值表示的小时数;
TotalMilliseconds:返回TimeSpan值表示的毫秒数; TotalMinutes:返回TimeSpan值表示的分钟数;TotalSeconds:返回TimeSpan值表示的秒数;
1 #region 日志处理 2 3 Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory + "InsureLog\\" + "日志测试系统"); 4 string strLog="4D5FE190-1CC6-4E88-97FE-E66A6868E3FB^57.7|BE7CCB47-2A09-4BCD-BBB4-8F3604B4226F^229|E2E352FA-A4A5-4DD5-B545-D5FD5274F220^4.90|"; 5 string strSysName="日志测试系统"; 6 string strEndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); 7 //保险系统名称、日志类型、日志内容、交易参数、交易结束时间 8 LogProcess.RecordLog(strSysName, "1", strLog, "222", strEndTime);//2018-03-06 10:12:13.001 9 Console.WriteLine(strEndTime); 10 #endregion 日志处理 11 string str = strEndTime.Substring(strEndTime.Length - 3);//截取字符串最后的三位 12 string str1 = strEndTime.Substring(0,strEndTime.Length - 4);//从右向左数,删去四位字符串 13 Console.WriteLine(str+"|"+str1); 14 15 16 DateTime str2 = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); 17 DateTime str3 = Convert.ToDateTime("2018-03-07 15:06:07.001"); 18 TimeSpan ts = str2 - str3; 19 string str4 = ts.Milliseconds.ToString(); 20 Console.WriteLine("测试时间:"+str4+"毫秒"); 21 22 23 Console.ReadKey();
2.方法主体:
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Windows.Forms; 7 8 namespace TestPublicLog 9 { 10 public class LogProcess 11 { 12 private static string strStartTime="2018-03-07 15:13:01.001";//全局变量,记录日志开始时间 13 14 /// <summary> 15 /// 记录日志处理 16 /// </summary> 17 /// <param name="strSysName">保险系统名称【不可空】</param> 18 /// <param name="logType">日志类型:1表示正常日志,0表示异常日志【不可空】</param> 19 /// <param name="logContent">日志内容【不可空】</param> 20 /// <param name="tradeParameter">交易参数【可空】(存放重要入参)</param> 21 /// <param name="logTime">记录时间(精确到ms毫秒),格式:yyyy-MM-dd HH:mm:ss.fff【可空】</param> 22 public static void RecordLog(string strSysName, string logType, string logContent, string tradeParameter, string logTime) 23 { 24 try 25 { 26 string strComPath = AppDomain.CurrentDomain.BaseDirectory + "InsureLog\\" + strSysName;//路径公共部分 27 string normal_Path = strComPath + "\\正常日志"; //正常日志保存路径 28 string abnormal_Path = strComPath + "\\异常日志"; //异常日志保存路径 29 30 if (string.IsNullOrEmpty(logType)) 31 { 32 MessageBox.Show("日志的【状态参数】或【类型参数】输入为空!", "调用医保日志写入方法失败:", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 33 return; 34 } 35 else 36 { 37 if (logType == "0") 38 { 39 //调用创建日志文件方法,传入不同日志路径 40 GetLog(logType, strSysName, normal_Path, logTime, tradeParameter, logContent); //在正常日志中写入日志 41 GetLog(logType, strSysName, abnormal_Path, logTime, tradeParameter, logContent);//在异常日志中写入日志 42 } 43 else if (logType == "1") 44 { 45 GetLog(logType, strSysName, normal_Path, logTime, tradeParameter, logContent); //在正常日志中写入日志 46 } 47 else 48 { 49 MessageBox.Show("日志【类型参数】输入错误!", "调用医保日志写入方法失败:", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 50 return; 51 } 52 } 53 } 54 catch (Exception ex) 55 { 56 MessageBox.Show("医保日志写入失败:" + ex.ToString(), "运行时错误", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 57 } 58 } 59 60 #region 创建日志文件 61 /// <summary> 62 /// 创建日志文件 63 /// </summary> 64 /// <param name="logType">日志类型</param> 65 /// <param name="strSysName">保险系统名称</param> 66 /// <param name="m_path">日志路径</param> 67 /// <param name="logTime">记录日志的时间</param> 68 /// <param name="tradeParameter">交易参数</param> 69 /// <param name="logContent">日志内容</param> 70 public static void GetLog(string logType, string strSysName, string m_path, string logTime, string tradeParameter, string logContent) 71 { 72 try 73 { 74 string fileName = "LogRecord_" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; 75 DirectoryInfo m_DirInfo = new DirectoryInfo(m_path); 76 if (!m_DirInfo.Exists) 77 { 78 Directory.CreateDirectory(m_path);//创建文件夹 79 } 80 FileStream fs = new FileStream(m_path + "\\" + fileName, FileMode.Append, FileAccess.Write); 81 StreamWriter sw = new StreamWriter(fs); //文件流 82 if (string.IsNullOrEmpty(logTime)) 83 { 84 //获取开始时间(精确到ms毫秒) 85 strStartTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); 86 if (string.IsNullOrEmpty(tradeParameter)) 87 { 88 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n" + "日志内容:" + logContent + "\r\n");//正式使用时,须获取服务器时间 89 } 90 else 91 { 92 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n" + "日志内容:" + logContent + "\r\n" + "交易参数:" + tradeParameter + "\r\n");//正式使用时,须获取服务器时间 93 } 94 } 95 else 96 { 97 string getTimeDiffer = GetTimeDiffer(strStartTime, logTime); 98 if (getTimeDiffer == "0") 99 { 100 MessageBox.Show("获取交易耗时失败!"); 101 } 102 else 103 { 104 if (string.IsNullOrEmpty(tradeParameter)) 105 { 106 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + "本次交易耗时:" + getTimeDiffer + "\r\n" + "日志内容:" + logContent + "\r\n"); 107 } 108 else 109 { 110 sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + "本次交易耗时:" + getTimeDiffer + "\r\n" + "日志内容:" + logContent + "\r\n" + "交易参数:" + tradeParameter + "\r\n"); 111 } 112 } 113 } 114 sw.Close(); 115 fs.Close(); 116 } 117 catch (Exception ex) 118 { 119 MessageBox.Show("创建日志错误:"+ex.ToString(), "调用【创建日志文件】方法失败:", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 120 } 121 } 122 #endregion 创建日志文件 结束 123 124 #region 解析时间差(计算耗时) 125 /// <summary> 126 /// 解析时间差(计算耗时) 127 /// </summary> 128 /// <param name="strStartTime">开始时间</param> 129 /// <param name="strEndTime">结束时间,即传入的时间</param> 130 /// <returns></returns> 131 public static string GetTimeDiffer(string strStartTime, string strEndTime) 132 { 133 try 134 { 135 // string类型转DateTime类型 136 DateTime strTimeStart = Convert.ToDateTime(strStartTime); 137 DateTime strTimeEnd = Convert.ToDateTime(strEndTime); 138 string dateDiff = null;//定义时间差值 139 //定义时间间隔 140 TimeSpan startTime = new TimeSpan(strTimeStart.Ticks); 141 TimeSpan endTime = new TimeSpan(strTimeEnd.Ticks); 142 TimeSpan ts = endTime.Subtract(startTime).Duration(); 143 //显示时间 144 //ts.Days.ToString() + "天" + ts.Hours.ToString() + "小时" + ts.Minutes.ToString() + "分钟" 145 dateDiff = ts.Seconds.ToString() + "秒" + ts.Milliseconds.ToString() + "毫秒"; 146 return dateDiff; 147 } 148 catch (Exception ex) 149 { 150 MessageBox.Show("获取时间差值失败:" + ex.ToString(), "运行时错误", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 151 return "0"; 152 } 153 154 } 155 #endregion 解析时间差(计算耗时)结束 156 } 157 }