1. 不需要像log4net/Nlog/Common Logging配置,简单好用。
  2. 不用增加声明logger对象,可记录当前执行状况。
  3. 可以定义 维护功能模板的开发人员,以便用功能模块对于开发人员。
  4. 出处:https://git.oschina.net/lztkdr/Log_Solution
  5. 最后建议,如果要开发成网站页面来浏览日志内容的场景,推荐使用MngoDB、Sql Server 存储,做成页面的形式可以在线看到网站程序的日志内容。
public partial class _default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
int i = 0; int res = 10 / i; }
}

  

protected void Application_Error(object sender, EventArgs e)
{
if (Server.GetLastError() != null)
{
LogUtils.LogError("网站错误日志", Developer.SysDefault, Server.GetLastError());
}
}

  

日志类:

using System;
using System.Collections.Generic;
using System.Web;
using System.Text;
using System.Reflection;
using System.Collections;
using System.Collections.Specialized;
using System.Text.RegularExpressions;
using System.IO; namespace Utils
{
/// <summary>
/// 日志操作类
/// </summary>
public class LogUtils
{ private static object locker = new object();
/// <summary>
/// 获取请求相关信息
/// </summary>
/// <param name="level">日志级别</param>
/// <returns></returns>
private static List<string> GetRequestData(LogLevel level)
{
List<string> lstdata = new List<string>();
if (HttpContext.Current != null && HttpContext.Current.Request != null)
{
if (HttpContext.Current.Server != null)
{
lstdata.Add("Computer:" + HttpContext.Current.Server.MachineName);
}
HttpRequest Request = HttpContext.Current.Request;
if (Request.Url != null)
{
lstdata.Add("URI:" + Request.Url.AbsoluteUri);
}
if (Request.UrlReferrer != null)
{
lstdata.Add("UrlReferrer:" + Request.UrlReferrer.AbsoluteUri);
}
if (Request.ServerVariables != null)
{
#region 获取IP地址
Regex regex = new Regex("([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}");
string str_Ip = string.Empty;
if (!string.IsNullOrEmpty(Request.ServerVariables["REMOTE_ADDR"]))
{
str_Ip = Request.ServerVariables["REMOTE_ADDR"];
}
else if (!string.IsNullOrEmpty(Request.ServerVariables["HTTP_CDN_SRC_IP"]) && regex.IsMatch(Request.ServerVariables["HTTP_CDN_SRC_IP"]))
{
str_Ip = Request.ServerVariables["HTTP_CDN_SRC_IP"];
}
else if (!string.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) && regex.IsMatch(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]))
{
str_Ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}
string[] ip = str_Ip.Split(',');
#endregion
lstdata.Add("IP:" + ip[0]);
}
lstdata.Add("UserAgent:" + Request.UserAgent);
if (level == LogLevel.Warn)
{
lstdata.Add("POST信息:" + Log.GetCollectionData(Request.Form));
}
else if (level == LogLevel.Error)
{
lstdata.Add("POST信息:" + Log.GetCollectionData(Request.Form)); if (Request.Cookies != null && Request.Cookies.Count > 0)
{
List<string> lstCKInfo = new List<string>();
for (int j = 0; j < Request.Cookies.Count; j++)
{
HttpCookie item = Request.Cookies[j];
lstCKInfo.Add(item.Name + ":" + item.Value);
}
lstdata.Add("Cookie信息:" + string.Join(";", lstCKInfo.ToArray()));
}
}
}
return lstdata;
} /// <summary>
/// 写入日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="level">日志级别</param>
/// <param name="detail">日志详情</param>
/// <param name="createtime">记录时间</param>
public static void Write(string logName, Developer developer, LogLevel level, string detail, DateTime createtime)
{
Log log = new Log();
log.LogName = logName;
log.Level = level;
log.Developer = developer;
log.CreateTime = createtime;
List<string> lstDetails = GetRequestData(level);
lstDetails.Add(detail);
log.Detail = string.Join("\r\n\r\n", lstDetails.ToArray()); //todo :可以将日志写入 文件、数据库、MongoDB
//这里写入根目录 log文件夹
string logText = Log.GetModelData(log);
string fileName = DateTime.Now.ToString("yyyyMMdd") + ".log";
string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log");
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
fileName = Path.Combine(dir, fileName);
File.AppendAllText(fileName, logText, Encoding.UTF8);
} /// <summary>
/// 写入Info 日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="Info_objs">日志内容</param>
public static void LogInfo(string logName, Developer developer, params object[] Info_objs)
{
lock (locker)
{
List<string> lstDetails = new List<string>();
if (Info_objs != null && Info_objs.Length > 0)
{
List<string> lstInfo = new List<string>();
foreach (var item in Info_objs)
{
lstInfo.Add(Log.GetModelData(item));
}
lstDetails.Add("标记信息:" + string.Join(";", lstInfo.ToArray()));
}
Write(logName, developer, LogLevel.Info, string.Join("\r\n", lstDetails.ToArray()), DateTime.Now);
}
} /// <summary>s
/// 写入带 堆栈执行 的Info 日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="Info_objs">日志内容</param>
public static void LogWrite(string logName, Developer developer, params object[] Info_objs)
{
lock (locker)
{
List<string> lstDetails = new List<string>();
System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace(1, true);
System.Diagnostics.StackFrame frame = stack.GetFrame(0);
string execFile = frame.GetFileName();
string fullName = frame.GetMethod().DeclaringType.FullName;
string methodName = frame.GetMethod().Name;
int execLine = frame.GetFileLineNumber();
lstDetails.Add("文件路径:" + execFile + "\r\n");
lstDetails.Add("类全命名:" + fullName + "\r\n");
lstDetails.Add("执行方法:" + methodName + "\r\n");
lstDetails.Add("当前行号:" + execLine + "\r\n"); if (Info_objs != null && Info_objs.Length > 0)
{
List<string> lstInfo = new List<string>();
foreach (var item in Info_objs)
{
lstInfo.Add(Log.GetModelData(item));
}
lstDetails.Add("标记信息:" + string.Join(";", lstInfo.ToArray()));
}
Write(logName, developer, LogLevel.Info, string.Join("\r\n", lstDetails.ToArray()), DateTime.Now);
}
} /// <summary>
/// 写入Warn 日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="Info_objs">日志内容</param>
public static void LogWarn(string logName, Developer developer, params object[] Info_objs)
{
lock (locker)
{
List<string> lstDetails = new List<string>();
System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace(1, true);
System.Diagnostics.StackFrame frame = stack.GetFrame(0);
string execFile = frame.GetFileName();
string fullName = frame.GetMethod().DeclaringType.FullName;
string methodName = frame.GetMethod().Name;
int execLine = frame.GetFileLineNumber();
lstDetails.Add("文件路径:" + execFile + "\r\n");
lstDetails.Add("类全命名:" + fullName + "\r\n");
lstDetails.Add("执行方法:" + methodName + "\r\n");
lstDetails.Add("当前行号:" + execLine + "\r\n"); if (Info_objs != null && Info_objs.Length > 0)
{
List<string> lstInfo = new List<string>();
foreach (var item in Info_objs)
{
lstInfo.Add(Log.GetModelData(item));
}
lstDetails.Add("标记信息:" + string.Join(";", lstInfo.ToArray()));
}
Write(logName, developer, LogLevel.Warn, string.Join("\r\n", lstDetails.ToArray()), DateTime.Now);
}
} /// <summary>
/// 写入 Errorr日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="ex">异常对象(可为null)</param>
/// <param name="ext_InfoObjs">日志内容</param>
public static void LogError(string logName, Developer developer, Exception ex, params object[] ext_InfoObjs)
{
lock (locker)
{
List<string> lstDetails = new List<string>();
Exception currentEX = ex;
if (ex.InnerException != null)
{
currentEX = ex.InnerException;
}
lstDetails.Add("异常信息:" + Log.GetModelData(currentEX));
StringBuilder sb_extInfo = new StringBuilder();
if (ext_InfoObjs != null && ext_InfoObjs.Length > 0)
{
List<string> lst_ext_Inf = new List<string>();
foreach (var item in ext_InfoObjs)
{
lst_ext_Inf.Add(Log.GetModelData(item));
}
lstDetails.Add("标记信息:" + string.Join(";", lst_ext_Inf.ToArray()));
}
string detail = string.Join("\r\n\r\n", lstDetails.ToArray());
Write(logName, developer, LogLevel.Error, detail, DateTime.Now);
}
}
} /// <summary>
/// 程序日志
/// </summary>
public class Log
{
public Guid Id { get { return Guid.NewGuid(); } } /// <summary>
/// 日志名称
/// </summary>
public string LogName { get; set; } /// <summary>
/// 日志级别
/// </summary>
public LogLevel Level { get; set; } /// <summary>
/// 当前记录日志者
/// </summary>
public Developer Developer { get; set; } /// <summary>
/// 日志详细内容
/// </summary>
public string Detail { get; set; } /// <summary>
/// 日志时间
/// </summary>
public DateTime CreateTime { get; set; } #region private 反射 对象
/// <summary>
/// 得到对象的所有属性值
/// </summary>
/// <param name="obj">对象</param>
/// <returns></returns>
public static string GetModelData(object obj)
{
string valueParam = string.Empty;
StringBuilder sb = new StringBuilder();
if (obj == null || string.IsNullOrEmpty(obj.ToString()))
{
return string.Empty;
}
Type objType = obj.GetType(); if (IsSimpleType(objType))
{
valueParam = obj.ToString();
}
else
{
PropertyInfo[] proInfos = objType.GetProperties();
foreach (PropertyInfo proInfo in proInfos)
{
string name = proInfo.Name;
object objvalue = null;
string value = string.Empty;
try
{
objvalue = proInfo.GetValue(obj, null);
}
catch
{ }
if (objvalue == null)
{
value = string.Empty;
}
else
{
value = objvalue.ToString();
}
sb.AppendLine(name + ":" + value + "\r\n");
}
valueParam = sb.ToString().TrimEnd();
}
return valueParam;
} /// <summary>
/// 得到集合 数组中所有值
/// </summary>
/// <param name="obj">集合对象</param>
/// <returns></returns>
public static string GetCollectionData(ICollection obj)
{
if (obj == null || string.IsNullOrEmpty(obj.ToString()))
{
return string.Empty;
}
string valueParam = string.Empty;
Type objType = obj.GetType();
string typeName = objType.Name;
Type[] argumentsTypes = objType.GetGenericArguments(); #region isLstMark isDictMark
bool isLstMark = false;
if (argumentsTypes.Length == 1)
{
if (IsSimpleType(argumentsTypes[0]))
{
isLstMark = true;
}
}
else
{
isLstMark = (obj as IList) != null;
} bool isDictMark = false;
if (argumentsTypes.Length == 2)
{
if (IsSimpleType(argumentsTypes[0]) && IsSimpleType(argumentsTypes[1]))
{
isDictMark = true;
}
}
else
{
isDictMark = ((obj as IDictionary) != null);
}
#endregion if (objType.IsArray)
{
#region 数组类型
int arrRank = objType.GetArrayRank();
if (arrRank == 1)
{
Array arr = (Array)obj;
if (arr != null && arr.LongLength > 0)
{
List<string> lst = new List<string>();
foreach (var item in arr)
{
if (item != null)
{
lst.Add(item.ToString());
}
}
valueParam = string.Join(",", lst.ToArray());
}
}
#endregion
}
else if (isLstMark)
{
#region List
IEnumerable enumlst = obj as IEnumerable;
if (enumlst != null)
{
List<object> lsts = new List<object>();
foreach (var item in enumlst)
{
if (item != null)
{
lsts.Add(item.ToString());
}
}
if (lsts.Count > 0)
{
valueParam = string.Join(",", lsts.ToArray());
}
}
#endregion
}
else if (isDictMark)
{
#region Dictionary
IDictionary dict = obj as IDictionary;
if (dict != null && dict.Count > 0)
{
StringBuilder sb = new StringBuilder();
foreach (DictionaryEntry item in dict)
{
sb.AppendLine(item.Key + ":" + item.Value + "\r\n");
}
valueParam = sb.ToString();
}
#endregion
}
else if (obj is NameValueCollection)
{
#region NameValueCollection
NameValueCollection nvc = (NameValueCollection)obj;
if (nvc != null && nvc.Count > 0)
{
StringBuilder sb = new StringBuilder();
foreach (string key in nvc.AllKeys)
{
sb.AppendLine(key + ":" + nvc[key] + "\r\n");
}
valueParam = sb.ToString();
}
#endregion
}
else if (obj is ICollection)
{
#region ICollection
ICollection coll = obj as ICollection;
if (coll != null)
{
List<object> lstObjs = new List<object>();
foreach (var item in coll)
{
if (item != null)
{
lstObjs.Add(item.ToString());
}
}
if (lstObjs.Count > 0)
{
valueParam = string.Join(",", lstObjs.ToArray());
}
} #endregion
}
return valueParam.TrimEnd();
} public static bool IsSimpleType(Type type)
{
//IsPrimitive 判断是否为基础类型。
//基元类型为 Boolean、 Byte、 SByte、 Int16、 UInt16、 Int32、 UInt32、 Int64、 UInt64、 IntPtr、 UIntPtr、 Char、 Double 和 Single。
Type t = Nullable.GetUnderlyingType(type) ?? type;
if (t.IsPrimitive || t.IsEnum || t == typeof(string)) return true;
return false;
} #endregion #region 枚举 处理
/// <summary>
/// 根据枚举对象得到 枚举键值对
/// </summary>
/// <typeparam name="T">枚举</typeparam>
/// <returns></returns>
public static Dictionary<string, string> GetAllEnums<T>()
{
Dictionary<string, string> dict = null;
Type type = typeof(T);
string[] enums = Enum.GetNames(type);
if (enums != null && enums.Length > 0)
{
dict = new Dictionary<string, string>();
foreach (string item in enums)
{
string str = Enum.Parse(typeof(T), item).ToString();
T deve = (T)Enum.Parse(typeof(T), item);
string uid = Convert.ToInt32(deve).ToString();
dict.Add(str, uid);
}
}
return dict;
} /// <summary>
/// 根据枚举val获取枚举name
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="enumVal">枚举val</param>
/// <returns>枚举name</returns>
public static T GetEnumName<T>(int enumVal)
{
T t = (T)Enum.Parse(typeof(T), enumVal.ToString());
return t;
}
#endregion
} /// <summary>
/// 日志级别
/// </summary>
public enum LogLevel
{
Info = 0,
Warn = 1,
Error = 2
} /// <summary>
/// 日志记录开发者
/// </summary>
public enum Developer
{
/// <summary>
/// 系统默认
/// </summary>
SysDefault = 0, /// <summary>
/// 其他用户 小强 ^_^
/// </summary>
XiaoQiang = 115
} }

  

效果:

ASP.NET - 记录错误日志的更多相关文章

  1. ASP.NET记录错误日志的方式

    程序记录错误日志是一种看起来对一般用户没什么作用,但对程序开发者用处很大的东西,它能查出错误或异常的程序马迹.那么,常用的记录错误日志的方式有哪些呢? 大多数情况下使用的是 1.直接记录为txt/xm ...

  2. asp.net记录错误日志的方法

    1.说明 在调试发布后的asp.net项目时有可能会遇到意想不到的错误,而未能及时的显示.这就需要记录日志来跟踪错误信息,所以写了个简单的记录信息的方法,记录简单的文本信息也可以使用.此方法是以生成文 ...

  3. ASP.NET MVC中Log4Net记录错误日志的使用

    第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSection ...

  4. WebForm应用log4net记录错误日志——使用线程列队写入

    我的项目结构如下图: 日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包 线程日志帮助类 FlashLogger.cs 代码 using System; usin ...

  5. asp.net mvc中加入log4net记录错误日志

    直接上代码示例:https://share.weiyun.com/aff36f2547514cfefe129ebb8ccb28ef 首先添加加log4net的dll,推荐用nuget.... 贴上配置 ...

  6. Asp.Net MVC中记录错误日志保存到本地txt文件

    为了方便查询系统出错弄个错误日志出来对于维护运维来说是很有必要的. 1.在Asp.Net MVC项目中的App_Start添加一个用于处理异常类的文件ErrorLog让他继承HandleErrorAt ...

  7. asp.net 添加错误日志

    在开发程序中,错误日志很有必要.今天就把使用到的添加错误日志,记录下来,方便以后查看 利用的asp.net错误处理机制 Application_Error 贴出代码 protected void Ap ...

  8. C# 记录错误日志

    程序的错误日志如何记录下来? 可以在遇到异常时,Catch异常,然后把异常的信息输出到txt文件中即可 /// <summary> /// 错误日志 /// </summary> ...

  9. AspNetCore 使用log4net+IExceptionFilter 记录错误日志

    错误日志的好处我就不说了,大家都心里有数,那今天浩子就给大家说一说基本的错误日志吧这次通过log4net记录日志. 原来写过一个关于Nlog的日志框架,传送门为:https://www.cnblogs ...

随机推荐

  1. XCode 快速注释插件

    下载VVDocumenter-Xcode这个插件 打开编译后,重启Xcode 输入///,如效果图,Window->VVDocumenter自己定制风格

  2. C#注册表

    C#注册表情缘   记得当时刚接触C#的时候,喜欢编写各种小软件,而注册表系列和网络系列被当时的我认为大牛的必备技能.直到我研究注册表前一天我都感觉他是那么的高深. 今天正好有空,于是就研究了下注册表 ...

  3. quant_百度百科

    quant_百度百科     quant    编辑    quant的工作就是设计并实现金融的数学模型(主要采用计算机编程),包括衍生物定价,风险估价或预测市场行为等.所以quant更多可看为工程师 ...

  4. 构件图(Component Diagram)—UML图(八)

    构件图是显示代码自身结构的实现级别的图表.构件图由诸如源码文件.二进制代码文件.可运行文件或动态链接库 (DLL) 这种构件构成,并通过依赖关系相连接 以下这张图介绍了构件图的基本内容: 以下这张图是 ...

  5. 另一种数据库连接字符串的编写方式(Sqlbuilder)

    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); builder.DataSource = "&q ...

  6. 【转】android加载大量图片内存溢出的三种解决办法

    方法一: 在从网络或本地加载图片的时候,只加载缩略图. /** * 按照路径加载图片 * @param path 图片资源的存放路径 * @param scalSize 缩小的倍数 * @return ...

  7. 运行复制的ZooKeeper 部署

    运行复制的ZooKeeper 运行ZooKeeper 在一个独立模式下是方便评估的, 一些开发,和测试. 但是在生产,你应该运行ZooKeeper 在复制模式.一个复制的servers group 在 ...

  8. opencv视频播放

    在一个界面上显示一张图片.是一件非常easy的事情,但说到要显示视频.刚開始学习的人可能不知道怎么处理,事实上,一般来说能够理解为视频就是图片以人眼察觉不到的速度高速更新. 曾经用摄像头採集视频显示在 ...

  9. EF的两种延迟加载

    EF的两种延迟加载 EF的延迟加载一: 在一次查询以后得到temp,然后在temp上直接进行查询得到temp2,我们调用temp2的时候,是直接为temp生成sql脚本的,没有生成temp的脚本,也就 ...

  10. 11181 - Probability|Given

    N friends go to the local super market together. The probability of their buying something from them ...