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. TTL电平与RS232电平的区别

    TTL电平与RS232电平的区别   工作中遇到一个关于电平选择的问题,居然给忘记RS232电平的定义了,当时无法反应上来,回来之后查找资料才了解两者之间的区别,视乎两年多的时间,之前非常熟悉的一些常 ...

  2. ContentProvider的一些总结

    ContentProvider中的URI, The URI that identifies the provider   一个特定的uri对应着唯一一个内容提供者, 谷歌官方文档里的说明, Query ...

  3. shell的wc命令统计 head tail命令详解

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...

  4. IntelliJ idea 14 集成 tomcat 7

    来到公司第一个任务就是先把web项目跑起来,所以如何在IntelliJ idea14中把Tomcat集成起来也是个不小的问题. 首先确认你的idea 14 不是 Communit Edition 社区 ...

  5. three.js 源代码凝视(十四)Math/Sphere.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  6. 【BZOJ1132】【POI2008】Tro 计算几何 叉积求面积

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  7. e-mail Web端管理

    邮件是和上海的一家微软的代理商合作的,管理很方便,但是目前感觉他家的邮件过滤机制有问题.

  8. Java--CyclicBarrier使用简介

    CyclicBarrier介绍 (一)一 个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时 ...

  9. Qt信号槽的一些事(第一次知道信号还有返回值,以及Qt::UniqueConnection)

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...

  10. Amlogic开关机按键功能实现

    在做AMlogic项目的时候,配置按键后,发现电源键仅仅能关机,不能开机,非常是郁闷 后来发现是漏掉了一个地方没有配置,firmware/arc_power/irremote2arc.c 这个文件中面 ...