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.mzph.cn/news/271714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库:SQLServer中with as 用法笔记

一、with as 概念介绍with as 也叫做子查询部分&#xff08;subquery factoring&#xff09;&#xff0c;可以定义一个SQL段落&#xff0c;该SQL段落可以被整个SQL语句所用到类似于临时表的作用。with as 可以提高你的SQL语句的可读性&#xff0c;也有可以用在在UNION ALL的不同…

数据库优化:SqlServer的with(nolock)关键字的用法介绍

一、with(nolock)的介绍数据库写查询语句的时候,为了提升查询性能,往往会在查询的表后面加一个nolock,或者是with(nolock),其目的就是查询的时候是不锁定表,从而提高查询速度的目的。但如果同一时间有多个用户访问同一资源的时候&#xff0c;如果并发用户对该资源做了修改。则会…

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;它的稳定性、延迟低、功能齐全很受广大开发者的欢迎。唯一美中不足的是它是一款商业软件。费用比较高。到现在基本上所有破解工具都无效了。所以不得不放弃这款…

苹果台式电脑怎么开机_龙华苹果电脑回收公司,台式电脑回收公司电话

龙华苹果电脑回收公司,台式电脑回收公司电话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…

数据库:SQLServer中in和 exists函数用法笔记

今天给大家分享一下SQLServer中in和 exists 用法&#xff0c;希望能对大家有所帮助。一、IN 用法确定指定的值是否与子查询或列表中的数据相匹配。1.1 语法格式test_expression [ NOT ] IN ( subquery | expression [ ,...n ] )1.2 参数说明test_expression为任意有…

什么是m叉树_不懂数据库索引的底层原理?那是因为你心里没点b树

前几天下班回到家后正在处理一个白天没解决的bug&#xff0c;厕所突然传来对象的声音&#xff1a; 对象&#xff1a;xx&#xff0c;你有《时间简史》吗&#xff1f; 我&#xff1a;我去&#xff01;妹子&#xff0c;你这啥癖好啊&#xff0c;我有时间也不会去捡屎啊&#xff01…

可重入锁是什么和demo

可重入锁 reentrantlock是独占锁且可重入的 synchronized 也可以重入 可重入意思就是这个线程已经获取锁了&#xff0c;你再获取该锁还能获取 获取的还是原来的锁 不会出现问题 可以降低编程难度 代码如下: new Thread(new Runnable() {Overridepublic void run() {synchr…

linux 安装python 3.x,Linux 安装python3.x步骤

本文转发自博客园非真的文章&#xff0c;内容略有改动linux系统本身默认安装有2.x版本的python&#xff0c;版本x根据不同版本系统有所不同&#xff0c;通过python --V 或 python --version 查看系统自带的python版本。有一些系统命令时需要用到python2&#xff0c;不能卸载&am…

数据库:SQLServer中游标的用法笔记

一、游标的概念知识游标可以理解为SQL Server的一种数据访问机制&#xff0c;它允许用户访问数据的维度是数据行。用户可以对每一行数据进行单独处理&#xff0c;从而降低系统开销和潜在的阻隔情况&#xff0c;游标主要用于存储过程&#xff0c;触发器和 T_SQL复杂的脚本中&…

BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 第一眼以为是组合.然后更滑稽的是用错误的方法手算样例居然算出来是对的...我数学是有多差... 题解也是看了好半天,有点难理解. 感觉…

智慧政务解决方案(28页)pdf_【金众电子】智慧政务解决方案

智慧政务解决方案立式党建广告机广告机简介&#xff1a;KC-立式政务广告机(室内/室外可选)液晶屏幕特别卖点&#xff1a;安装简易、亮度调节、实时更新、传输安全应用场所&#xff1a;各种需要文化传播的政务机构、政府机关、会议场所等。双立柱政务文化栏/宣传栏文化栏简介&am…

笨办法学linux dhcp,了解网关、DNS、子网掩码、MAC地址、DHCP

原标题&#xff1a;了解网关、DNS、子网掩码、MAC地址、DHCP什么是网关、DNS、子网掩码&#xff0c;它有什么作用&#xff0c;确实&#xff0c;我们平时在网络中总是在不断的提到网关&#xff0c;却很少真正的去了解它。一、什么是网关1、什么是网关网关是一种充当转换重任的计…