網(wǎng)站首頁 編程語言 正文
本篇體驗(yàn)在ASP.NET MVC 4中使用Log4Net記錄日志。
通過NuGet安裝Log4Net。
需求是:當(dāng)出錯(cuò)時(shí)導(dǎo)向到Error.html靜態(tài)頁面,Log4Net記錄錯(cuò)誤信息。
大致的思路是:
1、寫一個(gè)記錄日志的接口
2、實(shí)現(xiàn)記錄日志接口的類,用Log4Net的API實(shí)現(xiàn)
3、在Web.config中配置Log4Net
4、在Global.asax中注冊Log4Net
5、自定義一個(gè)出錯(cuò)頁,以便在出錯(cuò)時(shí)導(dǎo)向到該靜態(tài)頁面
6、ASP.NET MVC默認(rèn)的異常過濾器是HandleErrorAttribute,我們需要自定義一個(gè)繼承HandleErrorAttribute的過濾器,并把自定義的過濾器注冊到全局過濾器中去
首先定義一個(gè)記錄日志的接口。
public interface ILoggerService
{
void Info(string message);
void Warn(string message);
void Debug(string message);
void Error(string message);
void Error(Exception ex);
void Fatal(string message);
void Fatal(Exception ex);
}
實(shí)現(xiàn)ILoggerService,使用用Log4Net的API實(shí)現(xiàn)。
public class LogHelper : ILoggerService
{
private ILog _logger;
public LogHelper()
{
_logger = LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
public void Info(string message) {
_logger.Info(message);
}
public void Warn(string message) {
_logger.Warn(message);
}
public void Debug(string message) {
_logger.Debug(message);
}
public void Error(string message) {
_logger.Error(message);
}
public void Error(Exception ex) {
_logger.Error(ex.Message, ex);
}
public void Fatal(string message) {
_logger.Fatal(message);
}
public void Fatal(Exception ex) {
_logger.Fatal(ex.Message, ex);
}
}
在Web.config中配置Log4Net。
<configuration> <configSections> ...... <!--日志的配置--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" /> </configSections> ...... <!--日志的配置開始--> <log4net> <root> <level value="ALL" /> <appender-ref ref="SysAppender" /> </root> <logger name="WebLogger"> <!--配置日志的級別,低于此級別的就不寫到日志里面去--> <level value="DEBUG" /> </logger> <!--系統(tǒng)日志的格式--> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net"> <param name="File" value="App_Data/" /> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" /> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout,log4net"> <!--<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />--> <conversionPattern value="{%level}%date{MM/dd HH:mm:ss} - %message%newline%newline"/> </layout> </appender> <!--控制臺日志的格式--> <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> </log4net> <!--日志的配置結(jié)束--> </configuration>
在全局文件Global.asax中注冊Log4Net。
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
......
//讀取日志 如果使用log4net,應(yīng)用程序一開始的時(shí)候,都要進(jìn)行初始化配置
log4net.Config.XmlConfigurator.Configure();
}
}
ASP.NET MVC默認(rèn)的異常過濾器是HandleErrorAttribute,我們需要自定義,繼承該類。
public class MyHandleExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
var log = new LogHelper();
log.Error("被系統(tǒng)過濾捕獲的異常" + filterContext.Exception);
filterContext.HttpContext.Response.Redirect("/Error.html");
}
}
自定義的異常過濾器當(dāng)讓要注冊到全局過濾器中去。打開App_Start文件夾中的FilterConfig類,修改如下:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new MyHandleExceptionAttribute());
}
}
在HomeController中故意留一個(gè)錯(cuò)誤。
public class HomeController : Controller
{
public ActionResult Index()
{
int a = 10;
int b = 0;
var result = a/b;
return View();
}
}
在項(xiàng)目根文件夾下頂一個(gè)Error.html靜態(tài)文件,用來呈現(xiàn)錯(cuò)誤提示信息。???
當(dāng)瀏覽器請求Home/Index視圖,導(dǎo)向到Error.html出錯(cuò)頁,Log4Net自動為我們在App_Data目錄下記錄了異常信息。?
原文鏈接:https://www.cnblogs.com/darrenji/p/4367623.html
相關(guān)推薦
- 2022-11-21 初識React及React開發(fā)依賴詳解_React
- 2022-09-21 詳解C語言中typedef和#define的用法與區(qū)別_C 語言
- 2022-03-07 android?studio實(shí)驗(yàn):?UI設(shè)計(jì)?ListView及事件響應(yīng)_Android
- 2022-03-20 docker中容器數(shù)據(jù)卷volume介紹_docker
- 2023-02-09 Go語言高效編程的3個(gè)技巧總結(jié)_Golang
- 2023-05-31 如何在ubuntu中切換使用不同版本的python_python
- 2023-01-29 Python?TypeError:?‘float‘?object?is?not?subscripta
- 2022-12-12 Android?WindowManager深層理解view繪制實(shí)現(xiàn)流程_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支