背景
日志无论是对于开发人员、运维人员和最终用户都是一笔财富,是不是所有类型的日志都要AOP呢?本着交流的目的,这里先说一些看法,希望大家多批评。
常见的日志类型
异常日志
概念:记录异常的日志。
考虑:日志框架需要对不同的异常采用不同的日志方式,比如:那些为了向UI层返回消息的异常是不用记录到日志的,对于未期望异常也需要有不同的日志输入方式。
方式:AOP,适合在边界类使用(靠近系统边界的地方)。
事务:不需要参与业务事务。
服务对象:开发人员、运维人员。
示例:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Web.Mvc; 7 8 using Common.Logging; 9 using Happy.Web.Mvc.Newtonsoft; 10 11 namespace Happy.Web.Mvc.ExceptionHanding 12 { 13 /// <summary> 14 /// 处理应用程序未捕获的异常。 15 /// </summary> 16 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 17 public class WriteExceptionResultAttribute : FilterAttribute, IExceptionFilter 18 { 19 /// <inheritdoc /> 20 public void OnException(ExceptionContext filterContext) 21 { 22 var exception = filterContext.Exception; 23 24 this.LogException(exception); 25 26 filterContext.Result = ExceptionInformationProviderRegistry.CreateErrorResult(exception); 27 28 filterContext.ExceptionHandled = true; 29 } 30 31 private void LogException(Exception exception) 32 { 33 if (FriendlyExceptionRegistry.Contains(exception.GetType())) 34 { 35 return; 36 } 37 38 LogManager.GetCurrentClassLogger().Error(exception); 39 } 40 } 41 }
操作日志
概念:记录用户操作的日志。
考虑:这类日志的格式很难统一,每个操作都需要自己的消息格式和参数,因为最终用户要看,还需要提供友好的界面。
方式:帮助方法,适合在应用层使用。
事务:要参与业务事务。
服务对象:运维人员、最终用户。
示例:省略。
性能监控日志、程序状态跟踪等
概念:记录开发人员感兴趣的任何内容。
考虑:监控的级别可能是整个业务事务或某一层的调用,甚至是某个方法。
方式:AOP或帮助方法。
事务:不要参与业务事务。
服务对象:运维人员、开发人员。
示例:省略。
备注
系统设计的时候最好就确定日志的需求。