失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > .NET Core整合log4net以及全局异常捕获实现2

.NET Core整合log4net以及全局异常捕获实现2

时间:2024-02-15 16:21:36

相关推荐

.NET Core整合log4net以及全局异常捕获实现2

Startup代码

1 public static ILoggerRepository repository { get; set; } 2 public Startup(IConfiguration configuration) 3 { 4 Configuration = configuration; 5 repository = LogManager.CreateRepository("NetCoreRepository"); 6 XmlConfigurator.Configure(repository, new FileInfo("log4net.config")); 7 InitRepository.loggerRepository = repository; 8 } 9 10 public IConfiguration Configuration { get; }11 12 // This method gets called by the runtime. Use this method to add services to the container.13 public void ConfigureServices(IServiceCollection services)14 {15 services.Configure<CookiePolicyOptions>(options =>16 {17 // This lambda determines whether user consent for non-essential cookies is needed for a given request.18 options.CheckConsentNeeded = context => true;19 options.MinimumSameSitePolicy = SameSiteMode.None;20 });21 22 23 services.AddMvc(o => o.Filters.Add(typeof(GlobalExceptions))).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);24 }25 26 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.27 public void Configure(IApplicationBuilder app, IHostingEnvironment env)28 {29 if (env.IsDevelopment())30 {31 app.UseDeveloperExceptionPage();32 }33 else34 {35 app.UseExceptionHandler("/Home/Error");36 }37 38 app.UseStaticFiles();39 app.UseCookiePolicy();40 41 app.UseMvc(routes =>42 {43 routes.MapRoute(44 name: "default",45 template: "{controller=Home}/{action=Index}/{id?}");46 });47 }

log4net.xml

1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <log4net> 4<!-- 错误日志类--> 5<logger name="logerror"> 6 <level value="ALL" /> 7 <appender-ref ref="ErrorAppender" /> 8</logger> 9<!-- 错误日志附加介质-->10<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">11 <!--日志文件路径-->12 <param name="File" value="Log\\LogError\\" />13 <!--是否是向文件中追加日志-->14 <param name="AppendToFile" value="true" />15 <!--log保留天数-->16 <param name="MaxSizeRollBackups" value="1000" />17 <!--最大文件大小-->18 <param name="MaxFileSize" value="10240" />19 <!--日志文件名是否是固定不变的-->20 <param name="StaticLogFileName" value="false" />21 <!--日志文件名格式为:-08-31.log-->22 <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />23 <!--日志根据日期滚动-->24 <param name="RollingStyle" value="Date" />25 <param name="Encoding" value="utf-8" />26 <!--信息日志布局-->27 <layout type="log4net.Layout.PatternLayout">28 <param name="ConversionPattern" value="&lt;!--异常信息头--&gt;%n【异常时间】:%d [%t] ;%n【异常级别】:%-5p %n%m %n &lt;!--异常信息尾部--&gt;%n" />29 </layout>30</appender>31 32<!-- 信息日志类 -->33<logger name="loginfo">34 <level value="ALL" />35 <appender-ref ref="InfoAppender" />36</logger>37<!-- 信息日志附加介质-->38<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">39 <!--日志文件路径-->40 <param name="File" value="Log\\LogInfo\\" />41 <!--是否是向文件中追加日志-->42 <param name="AppendToFile" value="true" />43 <!--log保留天数-->44 <param name="MaxSizeRollBackups" value="100" />45 <param name="MaxFileSize" value="1" />46 <!--日志文件名是否是固定不变的-->47 <param name="StaticLogFileName" value="false" />48 <!--日志文件名格式为:-08-31.log-->49 <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;" />50 <!--日志根据日期滚动-->51 <param name="RollingStyle" value="Date" />52 <param name="Encoding" value="utf-8" />53 <!--信息日志布局-->54 <layout type="log4net.Layout.PatternLayout">55 <param name="ConversionPattern" value="&lt;!--信息头&gt;%n日志时间:%d [%t] &lt;BR&gt;%n日志级别:%-5p %n%m %n &lt;信息尾&gt;" />56 </layout>57</appender>58 </log4net>59 60 61 <!-- To customize the core module uncomment and edit the following section. 62 For more info see /fwlink/?linkid=838655 -->63 <!--64 <system.webServer>65<handlers>66 <remove name="aspNetCore"/>67 <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>68</handlers>69<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />70 </system.webServer>71 -->72 73 </configuration>

1public class GlobalExceptions : IExceptionFilter 2{ 3 private readonly IHostingEnvironment _env; 4 public GlobalExceptions(IHostingEnvironment env) 5 { 6 _env = env; 7 } 8 public void OnException(ExceptionContext context) 9 {10 var json = new JsonErrorResponse();11 //这里面是自定义的操作记录日志12 if (context.Exception.GetType() == typeof(UserOperationException))13 {14 json.Message = context.Exception.Message;15 if (_env.IsDevelopment())16 {17 json.DevelopmentMessage = context.Exception.StackTrace;//堆栈信息18 }19 context.Result = new BadRequestObjectResult(json);//返回异常数据20 }21 else22 {23 json.Message = "发生了未知内部错误";24 if (_env.IsDevelopment())25 {26 json.DevelopmentMessage = context.Exception.StackTrace;//堆栈信息27 }28 context.Result = new InternalServerErrorObjectResult(json);29 }30 31 //采用log4net 进行错误日志记录32 LogHelper.ErrorLog(json.Message, context.Exception);33 34 }35}36public class InternalServerErrorObjectResult : ObjectResult37{38 public InternalServerErrorObjectResult(object value) : base(value)39 {40 StatusCode = StatusCodes.Status500InternalServerError;41 }42}

public class JsonErrorResponse{/// <summary>/// 生产环境的消息/// </summary>public string Message { get; set; }/// <summary>/// 开发环境的消息/// </summary>public string DevelopmentMessage { get; set; }}

1 public static class InitRepository 2{ 3 public static ILoggerRepository loggerRepository { get; set; } 4} 5 6public static class LogHelper 7{ 8 public static readonly ILog logerror = LogManager.GetLogger(InitRepository.loggerRepository.Name, "logerror"); 9 10 public static readonly ILog loginfo = LogManager.GetLogger(InitRepository.loggerRepository.Name, "loginfo");11 12 #region 全局异常错误记录持久化13 /// <summary>14 /// 全局异常错误记录持久化15 /// </summary>16 /// <param name="throwMsg"></param>17 /// <param name="ex"></param>18 public static void ErrorLog(string throwMsg, Exception ex)19 {20 string errorMsg = string.Format("【抛出信息】:{0} \n【异常类型】:{1} \n【异常信息】:{2} \n【堆栈调用】:{3}", new object[] { throwMsg,21 ex.GetType().Name, ex.Message, ex.StackTrace });22 23 logerror.Error(errorMsg);24 }25 #endregion26 27 #region 自定义操作记录28 /// <summary>29 /// 自定义操作记录,与仓储中的增删改的日志是记录同一张表30 /// </summary>31 /// <param name="throwMsg"></param>32 /// <param name="ex"></param>33 public static void WriteLog(string throwMsg, Exception ex)34 {35 string errorMsg = string.Format("【抛出信息】:{0} \n【异常类型】:{1} \n【异常信息】:{2} \n【堆栈调用】:{3}", new object[] { throwMsg,36 ex.GetType().Name, ex.Message, ex.StackTrace });37 38 logerror.Error(errorMsg);39 }40 #endregion41}

/// <summary>/// 操作日志/// </summary>public class UserOperationException : Exception{public UserOperationException() { }public UserOperationException(string message) : base(message) { }public UserOperationException(string message, Exception innerException) : base(message, innerException) { }}

public class ErrorViewModel{public string RequestId { get; set; }public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);}

如果觉得《.NET Core整合log4net以及全局异常捕获实现2》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。