日志记录到根目录Log文件夹,文件夹中分LogError与LogInfo文件夹
web.config配置:
在mvc过滤器中记录异常信息
public void OnException(ExceptionContext filterContext) { lock (obj) { var httpContext = filterContext.RequestContext.HttpContext.Request; // 在出现未处理的错误时运行的代码 if (!httpContext.Url.ToString().Contains(".")) { string logText = "\r\n------------- 异常信息 ---------------------------------------------------------------"; logText += "\r\n发生时间:" + DateTime.Now.ToString(); logText += "\r\n发生异常页:" + httpContext.Url.ToString(); logText += "\r\n异常信息:" + filterContext.Exception.Message; logText += "\r\n错误源:" + filterContext.Exception.Source; logText += "\r\n堆栈信息:" + filterContext.Exception.StackTrace; logText += "\r\n-----------------------------------------------------------------------------------------\r\n"; //日志物理路径 string path = httpContext.MapPath("~/Log/"); WebLog.WriteLog(logText, path); filterContext.RequestContext.HttpContext.Server.ClearError(); //filterContext.RequestContext.HttpContext.Response.Redirect("/Home/Error"); } } }
Global.asax.cs,设置
public class MvcApplication : System.Web.HttpApplication { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); //配置日志,读取配置信息 LogHelper.SetConfig(); } protected void Application_Error(Object sender, EventArgs e) { //记录错误日志 Exception objExp = HttpContext.Current.Server.GetLastError(); LogHelper.WriteLog("\r\n客户机IP:" + Request.UserHostAddress + "\r\n错误地址:" + Request.Url + "\r\n异常信息:" + Server.GetLastError().Message, objExp); } }
LogHelper.cs设置
public class LogHelper { public LogHelper() { } public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); //选择的配置 public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); //选择 的配置 public static void SetConfig() { log4net.Config.XmlConfigurator.Configure(); } /// /// 设置文件路径 /// /// public static void SetConfig(FileInfo configFile) { log4net.Config.XmlConfigurator.Configure(configFile); } ////// 写系统信息日志 /// /// public static void WriteLog(string info) { if (loginfo.IsInfoEnabled) { loginfo.Info(info); } } ////// 写错误日志 /// /// /// public static void WriteLog(string Error, Exception se) { if (logerror.IsErrorEnabled) { logerror.Error(Error, se); } } }
LogError 记录效果:
客户机IP:::1错误地址:http://localhost:8134/Admin/Scripts/js/ligerui.expand.js异常信息:未找到路径“/Admin/Scripts/js/ligerui.expand.js”的控制器或该控制器未实现 IController。 System.Web.HttpException (0x80004005): 未找到路径“/Admin/Scripts/js/ligerui.expand.js”的控制器或该控制器未实现 IController。 在 System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) 在 System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) 在 System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) 在 System.Web.Mvc.MvcHandler.<>c__DisplayClass6.b__2() 在 System.Web.Mvc.SecurityUtil.<>c__DisplayClassb`1. b__a() 在 System.Web.Mvc.SecurityUtil. b__0(Action f) 在 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) 在 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust[TResult](Func`1 func) 在 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 在 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) 在 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
LogInfo记录效果:
客户机IP:::1错误地址:http://localhost:8134/Admin/Department/GetDeptGridTree异常信息:可为空的对象必须具有一个值。 System.InvalidOperationException: 可为空的对象必须具有一个值。 在 System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) 在 System.Nullable`1.get_Value()省略异常描述···
也可独立出配置文件:
using System;using System.Collections.Generic;using System.ComponentModel;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace PrintService.Helper{ public enum LogCategory { [Description("调试")] Debug, [Description("信息")] Info, [Description("警告")] Warn, [Description("错误")] Error, [Description("过错")] Fault } public class LogHelper { private static readonly log4net.ILog infoLogger = log4net.LogManager.GetLogger("loginfo"); //选择的配置 private static readonly log4net.ILog errorLogger = log4net.LogManager.GetLogger("logerror"); //选择 的配置 private static readonly log4net.ILog warnLogger = log4net.LogManager.GetLogger("logwarn"); //选择 的配置 private static readonly log4net.ILog debugLogger = log4net.LogManager.GetLogger("logdebug"); //选择 的配置 static LogHelper() { string configPath = Path.Combine(PathHelper.ConfigDir, "LogServiceConfig.xml"); if (!File.Exists(configPath)) { throw new FileNotFoundException("找不到日志服务配置文件!"); } log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(configPath)); } /// /// 记录log信息到文件中 /// /// 需要记录的信息 /// log类型 /// 异常信息 public static void Log(string message, LogCategory category, Exception exception = null) { try { switch (category) { case LogCategory.Debug: { debugLogger.Debug(message); break; } case LogCategory.Info: { infoLogger.Info(message); break; } case LogCategory.Warn: { if (null == exception) { warnLogger.Warn(message); } else { warnLogger.Warn(message, exception); } break; } case LogCategory.Error: { if (null == exception) { errorLogger.Error(message); } else { errorLogger.Error(message, exception); } break; } } } catch (Exception ex) { throw; } } ////// 写基本信息日志 /// /// public static void Log(string mesage) { Log(mesage, LogCategory.Info, null); } ////// 出错信息日志 /// /// public static void Log(Exception exception) { Log("error message:", LogCategory.Error, exception); } }}using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace PrintService.Helper{ ////// 路径管理类 /// public class PathHelper { private static string _appDir; private static string _binDir; private static string _configDir; private static string _dataDir; static PathHelper() { //网站与后台服务路径不同,网站需要上翻一级;后台服务则不需要;通过判断使用的配置文件是否是web.config来判断是网站,还是服务。 bool isWeb = false; var appDomain = AppDomain.CurrentDomain; if (appDomain != null) { var startInfo = appDomain.SetupInformation; if (startInfo != null) { if (startInfo.ConfigurationFile != null) { if (startInfo.ConfigurationFile.EndsWith("web.config", StringComparison.OrdinalIgnoreCase)) { isWeb = true; //配置文件是网站 } } } } _appDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase.Substring(8))); //获取此处配置文件在程序目录 //_appDir = _appDir.Substring(0, _appDir.Length - 4); if (isWeb) { _appDir = _appDir.Substring(0, _appDir.LastIndexOf("\\", StringComparison.Ordinal)); // LastIndexOf("\\") => LastIndexOf(@"\"),向上翻一级 } _binDir = Path.Combine(_appDir, "bin\\"); //合并目录 _configDir = Path.Combine(_appDir, "Config\\"); _dataDir = Path.Combine(_appDir, "App_Data\\"); } #region 公共目录 ////// 应用程序所在的目录 /// public static string AppDir { get { return _appDir; } } ////// Bin文件所在的目录 /// public static string BinDir { get { return _binDir; } } ////// 根目录中的Cinfig文件夹 /// public static string ConfigDir { get { return _configDir; } } ////// 根目录中的App_Data文件夹 /// public static string DataDir { get { return _dataDir; } } #endregion }}配置文件:LogHelper.Log("测试Error!", LogCategory.Error);
log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).
Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口。你可以参考在/extension目录下的几个例子。
log4net.Layout.PatternLayout中的转换模式(ConversionPattern)
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,例如:
模式字符串为:%-10c -%m%n
代码为:
ILog log=LogManager.GetLogger(“Exam.Log”);
log.Debug(“Hello”);
则输出为下面的形式:
Exam.Log - Hello
%L:输出语句所在的行号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充
Logger
作用:直接与应用交互的组件,用于触发日志事件
级别(日志事件) 优先级
OFF 6 FATAL 5 ERROR 4 WARN 3 INFO 2 DEBUG 1 ALL 0
其他参考
http://www.cnblogs.com/zhangchenliang/p/4546352.html