《WebApi》----将异常堆栈信息写入日志文件

时间:2021-09-22 15:18:11

    以前我们的程序如果在开发中出现错误,我们可以轻松捕获异常信息,但是如果是程序在服务器上运行,并且是生产环境的服务器,如果这时候程序出现异常,我们既不想让错误信息暴露给用户,这样对用户不友好,也不行将错误信息吞并,吞并的话不利于我们Debug,那么,现在小编给提供个好办法,将异常信息写入到日志中。

    小编做的项目目前服务器程序运行的是WebApi,我们可以写一个日志类,此类可以将错误的堆栈信息写入txt文件,下面是代码。

    1、日志类代码

public class Log
{
/// <summary>
/// 写入日志.
/// </summary>
/// <param name="strList"></param>
/// <remarks> </remarks>
/// <Description>将错误信息写入日志文件(*.txt)</Description>
public static void WriteLog(params object[] strList)
{
//如果传过strList无内容,直接返回,不写日志
if (strList.Count() == 0) return;
//获取本地服务器路径
string strDicPath = System.Web.HttpContext.Current.Server.MapPath("~/temp/log/");
//创建日志路径
string strPath = strDicPath + string.Format("{0:yyyy年-MM月-dd日}", DateTime.Now) + "日志记录.txt";
//如果服务器路径不存在,就创建一个
if (!Directory.Exists(strDicPath)) Directory.CreateDirectory(strDicPath);
//如果日志文件不存在,创建一个
if (!File.Exists(strPath)) using (FileStream fs = File.Create(strPath)) ;
//读取日志文件中的信息
string str = File.ReadAllText(strPath);
StringBuilder sb = new StringBuilder();
//将错误信息写入sb
foreach (var item in strList)
{
sb.Append("\r\n" + DateTime.Now.ToString() + "-----" + item + "");
}
//将错误信息写入txt
File.WriteAllText(strPath, sb.ToString() + "\r\n-----z-----\r\n" + str);
}


/// <summary>
/// 写入日志.
/// </summary>
/// <param name="strList">The STR list.</param>
/// <remarks></remarks>
/// <Description></Description>
public static void WriteLog(Action DefFunc, Func<string> ErrorFunc = null)
{
try
{
DefFunc();
}
catch (Exception ex)
{
string strDicPath = System.Web.HttpContext.Current.Server.MapPath("~/temp/log/");
string strPath = strDicPath + string.Format("{0:yyyy年-MM月-dd日}", DateTime.Now) + "日志记录.txt";
if (!Directory.Exists(strDicPath)) Directory.CreateDirectory(strDicPath);
if (!File.Exists(strPath)) using (FileStream fs = File.Create(strPath)) ;
string str = File.ReadAllText(strPath);
StringBuilder sb = new StringBuilder();
if (ErrorFunc != null)
{
sb.Append("\r\n" + DateTime.Now.ToString() + "-----" + ErrorFunc());
}
sb.Append("\r\n" + DateTime.Now.ToString() + "-----" + ex.Message);
sb.Append("\r\n" + DateTime.Now.ToString() + "-----" + ex.StackTrace);
File.WriteAllText(strPath, sb.ToString() + "\r\n--z--------\r\n" + str);

}
}
}<span style="font-size:18px;"></span>

    2、业务逻辑代码

    我们将有可能出现的业务逻辑代码用Try...Catch包起来,在Catch中调用日志类,写入异常信息。代码如下

public List<EmployeeServices> LoadData()
{
try
{

//我们的业务逻辑代码
//我在此省略
}
catch (Exception ex)
{
//调用日志类的写日志的方法,将错误信息传入
Log.WriteLog(ex.Message);
//调用日志类的写日志的方法,将错误堆栈跟踪信息传入
Log.WriteLog(ex.StackTrace);
throw;
}

}

    这个方法在帮助我们调试服务器的程序的时候非常有帮助,将错误信息写入txt文件,我们可以很清楚的查找出代码出错在哪行,因为什么出错,这个可是一个DeBug的好助手啊!