ASP.NET+MVC+使用+Log4net+記錄日志筆記

前言:

記錄系統中的日志,是一個好的項目產品必備的一個環節。每一個產品最終的目的都是要交予客戶使用,因為程序員代碼的開發水平參差不齊,Bug就成為了項目運維成本最大的因素之一。如何降低項目運維的成本呢,最重要的是要縮短開發人員在系統運維排查問題的時間成本。如果你的系統中很好的集成了日志框架。那么你可以更快更高效的定位問題、解決問題。從而降低系統運維的時間成本。今天小編給大家介紹Log4net日志框架如何在項目中 使用,希望能對大家有所幫助。

  1. Log4net 介紹

1、Log4net 是什么?

Log4net 是 Apache 旗下一個開源的日志框架的項目,它是Log4j 的一個復制版。Log4net中定義了多種日志信息輸出模式。它可以根據需要將日志輸出到控制臺、文本文件、windows 日志事件查看器中、括數據庫,郵件發送,以便我們可以根據日志快速定位線上系統的問題。

2、Log4net 日志等級

從高到底分別為:OFF > FATAL > ERROR > WARN > INFO > DEBUG ?> ALL

二、ASP.NET MVC 使用 Log4net 示例

2.1 如何安裝 Log4net Log4net

  1. 使用Nuget 安裝 Log4net(工具-NuGet包管理器-程序包管理器控制臺(N))

? ? ? ? ? ? ? ? ? ? ? ?

  1. 使用管理NuGet程序包功能找到Log4net進行安裝。

? ? ? ? ? ? ? ? ? ? ? ? ?

2.2 創建 log4net.config 配置文件 ,并且將該文件的屬性“復制到輸出目錄”修改為 “始終復制。

? ? ? ? ? ? ? ? ? ? ? ?

log4net.config內容如下:

<?xml version="1.0" encoding="utf-8" ?><configuration>  <configSections>    <p name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>  </configSections>    <log4net>    <root>      <level value="ALL" />      <appender-ref ref="LogFileAppender" />      <!--<appender-ref ref="EventLogAppender" />-->    </root>    <!--定義輸出到文件-->    <appender name ="LogFileAppender" type="log4net.Appender.RollingFileAppender">      <!--定義文件存放位置-->      <param name="File" value ="Logs\"/>      <param name="AppendToFile" value="true" />      <param name="MaxSizeRollBackups" value="100" />      <param name="MaxFileSize" value="10240" />      <param name="StaticLogFileName" value="false" />      <!--這是按日期產生文件夾-->      <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>      <param name="RollingStyle" value ="Date" />      <!--不以獨占方式記錄日志,僅在記錄每個日志的最短時間內鎖定,因為部署到服務器上遇到了文件被占用無法下載日志-->      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />      <layout type="log4net.Layout.PatternLayout">        <!--定義輸出格式-->        <!--示例 2018-08-20 12:10:49,348 -線程ID:[21] 日志級別:[INFO ] : [日志信息]-->        <!--<conversionPattern value="%newline %n記錄時間:%date %n線程ID:[%thread] %n日志級別: %-5level %n錯誤描述:%message%newline %n"/>-->        <conversionPattern value="%n==========                                  %n【日志級別】%-5level                                  %n【記錄時間】%date                                  %n【線程編號】[%thread]                                  %n【執行時間】[%r]毫秒                                  %n【出錯文件】%F                                  %n【出錯行號】%L                                  %n【出錯的類】%logger 屬性[%property{NDC}]                                  %n【錯誤描述】%message                                  %n【錯誤詳情】%newline"/>      </layout>      <!--過濾級別 FATAL > ERROR > WARN > INFO > DEBUG-->      <filter type="log4net.Filter.LevelRangeFilter">        <param name="LevelMin" value="DEBUG" />        <param name="LevelMax" value="FATAL" />      </filter>    </appender>    <!--定義輸出到 windows 事件中-->    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">      <layout type="log4net.Layout.PatternLayout">        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"></conversionPattern>      </layout>    </appender>  </log4net></configuration><?xml version="1.0" encoding="utf-8" ?><configuration>  <configSections>    <p name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>  </configSections>

2.3 新建LogHelper.cs通用日志類

? ? ? ? ? ? ? ? ? ? ? ?

代碼如下:

public class LogHelper    {        private ILog _log4Net = null;        private const string DEFAULT_LOGGER_NAME = "Logger";        /// <summary>        /// Prevents a default instance of the <see cref="LogWriter"/> class from being created.        /// </summary>        /// <param name="log4NetInstance">The log4net instance to be used.</param>        private LogHelper(ILog log4NetInstance)        {            _log4Net = log4NetInstance;        }/// <summary>        /// Gets a logger with the specified configuration name.        /// </summary>        /// <param name="configName">Name of the logger in the configuration.</param>        /// <returns>The logger obtained.</returns>        /// <exception cref="System.Configuration.ConfigurationException">Thrown when no logger with the specified configuration name was found.</exception>        public static LogHelper GetLogger(string configName)        {            var logger = LogManager.GetLogger(configName);            if (logger == null)            {                throw new ArgumentException(string.Format("No logger configuration named '{0}' was found in the configuration.", configName), "configName");            }            return new LogHelper(logger);        }/// <summary>        /// Gets the default.        /// </summary>        public static LogHelper Default        {            get            {                return GetLogger(DEFAULT_LOGGER_NAME);            }        }/// <summary>        /// Writes an information level logging message.        /// </summary>        /// <param name="message">The message to be written.</param>        public void WriteInfo(object message)        {            _log4Net.Info(message);        }/// <summary>        /// Writes a warning level logging message.        /// </summary>        /// <param name="message">The message to be written.</param>        public void WriteWarning(object message)        {            _log4Net.Warn(message);        }/// <summary>        /// Writes a warning level logging message.        /// </summary>        /// <param name="message">The message to be written.</param>        /// <param name="exception">The exception.</param>        public void WriteWarning(object message, System.Exception exception)        {            _log4Net.Warn(message, exception);        }/// <summary>        /// Writes the error.        /// </summary>        /// <param name="message">The message to be written.</param>        public void WriteError(object message)        {            _log4Net.Error(message);        }/// <summary>        /// Writes the error level logging message..        /// </summary>        /// <param name="message">The message to be written.</param>        /// <param name="exception">The exception.</param>        public void WriteError(object message, System.Exception exception)        {            _log4Net.Error(message, exception);        }/// <summary>        /// Writes the fatal error level logging message..        /// </summary>        /// <param name="message">The message to be written.</param>        public void WriteFatal(object message)        {            _log4Net.Fatal(message);        }/// <summary>        /// Writes the fatal error level logging message..        /// </summary>        /// <param name="message">The message to be written.</param>        /// <param name="exception">The exception.</param>        public void WriteFatal(object message, System.Exception exception)        {            _log4Net.Fatal(message, exception);        }public void DeleteLog()        {            string logDirPath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "Log");            if (!Directory.Exists(logDirPath)) return;            int days = 30;            foreach (string filePath in Directory.GetFiles(logDirPath))            {                DateTime dt;                DateTime.TryParse(Path.GetFileNameWithoutExtension(filePath).Replace(@"Log\", "").Replace(".", "-"), out dt);                if (dt.AddDays(days).CompareTo(DateTime.Now) < 0)                {                    File.Delete(filePath);                }            }        }    }

2.4 AssemblyInfo.cs 文件配置log4net.config

特別注意:針對為web項目要加載web項目對應的AssemblyInfo.cs文件中去,這一點很關鍵要不然就不能輸出日志文件

[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFileExtension = "config", ConfigFile = @"Configs\log4net.config")]

? ? ? ? ? ? ? ? ? ? ? ?

2.5 自定義日志異常處理文件:MyExceptionFileAttribute.cs

用來處理異常記錄日志文件,然后可以指定錯誤的跳轉頁面。

public override void OnException(ExceptionContext filterContext) {            base.OnException(filterContext);                   if (!string.IsNullOrWhiteSpace(filterContext.Exception.StackTrace))            {                LogHelper.Default.WriteError(filterContext.Exception.StackTrace);            }                //頁面跳轉到錯誤頁面                        filterContext.HttpContext.Response.Redirect("/Error");        }

2.6 Global.asax新增Log4Net的配置信息

Application_Start.cs 方法加入下面兩行代碼:

 // 注冊log4net log4net.Config.XmlConfigurator.Configure(); // 注冊異常日志文件 GlobalFilters.Filters.Add(new MyExceptionFileAttribute());

測試用法

LoginController.cs 代碼加一個異常

    public ActionResult Index()        {            int a = 0;            int b = 6 / a;            return View();        }

效果展示:

? ? ? ? ? ? ? ? ? ? ? ?

結語

本文主要簡單介紹ASP.NET MVC 使用 Log4net 的過程。具體的一些用法大家也可以互相交流,比如:如何錯誤日志如何發郵件、數據庫的方式存儲、日志文件異步存儲等等。后續小編會繼續更新相關內容和大家一起學習交流。

IT技術分享社區

個人博客網站:https://programmerblog.xyz

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git分支feature和hotfix分支

master: 主分支&#xff0c;主要用來版本發布。develop&#xff1a;日常開發分支&#xff0c;該分支正常保存了開發的最新代碼。feature&#xff1a;具體的功能開發分支&#xff0c;只與 develop 分支交互。release&#xff1a;release 分支可以認為是 master 分支的未測試版。…

linux查看鏡像的詳細信息,docker inspect命令查看鏡像詳細信息

# docker inspect ubuntu:18.04 // 查看鏡像的詳細信息[{"Id": "sha256:d131e0fa2585a7efbfb187f70d648aa50e251d9d3b7031edf4730ca6154e221e","RepoTags": ["ubuntu:18.04"],"RepoDigests": ["ubuntusha256:d26d529da…

Golang使用pkg-config自動獲取頭文件和鏈接庫的方法

為了能夠重用已有的C語言庫&#xff0c;我們在使用Golang開發項目或系統的時候難免會遇到Go和C語言混合編程&#xff0c;這時很多人都會選擇使用cgo。 話說cgo這個東西可算得上是讓人又愛又恨&#xff0c;好處在于它可以讓你快速重用已有的C語言庫&#xff0c;無需再用Golang重…

數據庫:SQLServer中with as 用法筆記

一、with as 概念介紹with as 也叫做子查詢部分&#xff08;subquery factoring&#xff09;&#xff0c;可以定義一個SQL段落&#xff0c;該SQL段落可以被整個SQL語句所用到類似于臨時表的作用。with as 可以提高你的SQL語句的可讀性&#xff0c;也有可以用在在UNION ALL的不同…

單詞

Screenshot 屏幕截圖,截圖 Dashboard n. 儀表盤 subscribe vt. 簽署&#xff1b;贊成&#xff1b;捐助 vi. 訂閱&#xff1b;捐款&#xff1b;認購&#xff1b;贊成&#xff1b;簽署 performance n. 性能&#xff1b;績效&#xff1b;表演&#xff1b;執行 optimization …

數據庫優化:SqlServer的with(nolock)關鍵字的用法介紹

一、with(nolock)的介紹數據庫寫查詢語句的時候,為了提升查詢性能,往往會在查詢的表后面加一個nolock,或者是with(nolock),其目的就是查詢的時候是不鎖定表,從而提高查詢速度的目的。但如果同一時間有多個用戶訪問同一資源的時候&#xff0c;如果并發用戶對該資源做了修改。則會…

對layoutInflater的理解

參考該博客&#xff1a;http://www.cnblogs.com/top5/archive/2012/05/04/2482328.html LayoutInflater是一個抽象類&#xff0c;通過調用其實例方法inflate()&#xff0c;將res/layout下的xml布局文件進行實例化&#xff0c;不同于findvirebyid()是找布局文件下的控件進行實例…

linux /root /etc,Linux知識:/root/.bashrc與/etc/profile的異同

要搞清bashrc與profile的區別&#xff0c;首先要弄明白什么是交互式shell和非交互式shell&#xff0c;什么是login shell 和non-login shell。交互式模式就是shell等待你的輸入&#xff0c;并且執行你提交的命令。這種模式被稱作交互式是因為shell與用戶進行交互。這種模式也是…

java多線程售票例子

代碼如下: public class Ticket1 implements Runnable {private int tickets 100;Overridepublic void run() {while (tickets > 0) {synchronized (Ticket.class) {if (tickets > 0) {tickets--;System.out.println(Thread.currentThread().getName() "正在賣票&…

推薦一款免費國產遠程辦公神器ToDesk,TeamViewer完美替代品

對于從事IT行業的人員來說&#xff0c;遠程軟件基本上是必備的軟件。之前使用用TeamViewer遠程辦公軟件&#xff0c;它的穩定性、延遲低、功能齊全很受廣大開發者的歡迎。唯一美中不足的是它是一款商業軟件。費用比較高。到現在基本上所有破解工具都無效了。所以不得不放棄這款…

[iOS] photoKit獲取所有照片

代碼: - (NSMutableArray *)getAllPhoto{NSMutableArray *arr [NSMutableArray array];// 所有智能相冊PHFetchResult *smartAlbums [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular optio…

用python寫linux中的ls,Python實現Linux環境下的ls命令

在Linux下使用ls命令結合正則表達式&#xff0c;能夠高效地進行文件搜索&#xff0c;并通過參數操作文件&#xff0c;于是就想用Python實現這個功能以便在Windows上使用import osimport reimport syspath os.getcwd()substr raw_input(The sub-string of the file (Support f…

蘋果臺式電腦怎么開機_龍華蘋果電腦回收公司,臺式電腦回收公司電話

龍華蘋果電腦回收公司,臺式電腦回收公司電話oDYIHx 通常液晶顯示器有VGA和DVI兩種種接口&#xff0c;其中VGA接口在長時間顯示后悔出現畫面模糊情況&#xff0c;需要校正才能恢復&#xff0c;然而DVi接口傳輸就比較穩定&#xff0c;它屬于全數字無損傳輸信號&#xff0c;在長…

AtomicInteger使用非阻塞算法,實現并發控制多線程實現售票

代碼如下: public class TicketDemo implements Runnable {private static volatile AtomicInteger ticketSum new AtomicInteger(20);private static int finalTotal 0;Overridepublic void run() {int count;while ((count ticketSum.decrementAndGet()) > 0) {System.…

數據庫:SQLServer 實現行轉列、列轉行用法筆記

在許多的互聯網項目當中&#xff0c;報表開發是整個項目當中很重要的一個功能模塊。其中會有一些比較復雜的報表統計需要行轉列或者列轉行的需求。今天給大家簡單介紹一下在SQLServer當中如何使用PIVOT、UNPIVOT內置函數實現數據報表的行轉列、列轉行。有需要的朋友可以一起學習…

硬件知識:串口通訊的起始、數據、停止位是怎么分配的?

串口是串行接口&#xff08;serial port&#xff09;的簡稱&#xff0c;也稱為串行通信接口或COM接口。串口通信是指采用串行通信協議&#xff08;serial communication&#xff09;在一條信號線上將數據一個比特一個比特地逐位進行傳輸的通信模式。串口按電氣標準及協議來劃分…

ES5 getter setter

最近在學習vuejs&#xff0c;了解到內部實現使用到了es5的Getters和Setters。之前看高程的時候&#xff0c;沒有重視這塊&#xff0c;今天查看一下文檔&#xff0c;了解了他們的作用&#xff0c;再次記錄一下&#xff0c;可供以后查看和共享。 定義Getters和Setters&#xff1a…

python 調用bat失敗_要想順利通過Python面試,你最起碼需要達到白銀段位!

近幾年 Python 非常熱門&#xff0c;在學術界和產業界的使用率顯著提高。目前學習Python的人數日益增多&#xff0c;Python在近3年的編程語言受歡迎度中一直處于榜首。今天我們就來講講在產業界&#xff0c;需要具備哪些能力才能獲得一個滿意的 Python 相關崗位 Offer。Python基…

多線程售票demo,用ReentrantLock實現

代碼: public class TicketReentLockDemo implements Runnable {private int ticketTotal 100;private Lock lock new ReentrantLock();Overridepublic void run() {while (ticketTotal > 0) {try {lock.lock();if (ticketTotal > 0) {try {TimeUnit.MILLISECONDS.sle…

在linux安裝不了apache,Apache 不能安裝在linux?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓官網下載了tar.gz的文件&#xff0c; 然后tar解壓&#xff0c; 可是走到 ./configureprefix/usr/local/apache/ 的時候就開始出現一些“NO”我怕這樣make會有問題&#xff0c; 請問大家碰到出現"no"的選項嘛&#xff1f;…