简介:

几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。

经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。

Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。

官方网站:http://logging.apache.org/log4net/

使用方法:

  1、下载Log4Net,地址如下:http://logging.apache.org/log4net/download_log4net.cgi  , 解压

2、 在Web 项目中添加 log4net.dll 文件的引用。

3、在Web项目根目录下创建log4net.config配置文件(也可以直接添加到webconfig文件中)

log4net.config 文件配置如下:

配置文件代码:

<?xml version="1.0" encoding="utf-8"?>
<configuration> <!-- Register a section handler for the log4net section -->
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler"/>
</configSections> <log4net>
<!--声明跟节点 和设置 默认level-->
<!--在框架的体系里,所有的日志对象都是根日志(root logger)的后代。 因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在<root>标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过<appender-ref>标签定义日志对象使用的Appender对象。<appender-ref>声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定<logger>标签的additivity属性为false而改变。
<logger name="testApp.Logging" additivity="false"></logger>
Additivity的值缺省是true.-->
<root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender" />
</root> <!--定义logger实例-->
<!--<logger> 元素预定义了一个具体日志对象的设置。然后通过调用LogManager.GetLogger(“RollingFileAppender”)函数,你可以检索具有该名字的日志。如果LogManager.GetLogger(…)打开的不是预定义的日志对象,则该日志对象会继承根日志对象的属性。知道了这一点,我们可以说,其实<logger>标签并不是必须的。-->
<logger name="RollingFileAppender">
<level value="DEBUG"/>
<appender-ref ref="RollingLogFileAppender" />
</logger> <logger name="FileAppender">
<level value="DEBUG"/>
<appender-ref ref="FileAppender" />
</logger> <!--设置appender 形式-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--日志路径-->
<file type="log4net.Util.PatternString" value="Log/%date{yyyy-MM}/"/>
<!--是否是向文件中追加日志-->
<appendToFile value="true"/>
<!--指明日志滚动方式。"Composite"指文件名同时按size和date来命名,一般就用这个。还有其他3个取值:Once(每次程序启动新生成一个)、Size、Date。当RollingStyle=Composite时,如果File参数设为"D:\WebTest\MyLog_" ,那么文件名将是:"MyLog_2015-11-27.txt-->
<rollingStyle value="Date"/>
<!--日志文件名格式为:2018-02-05.LOG-->
<datePattern value="yyyy-MM-dd.LOG"/>
<!--日志文件名是否是固定不变的-->
<staticLogFileName value="false"/>
<!--限定每个日志文件不超过10M-->
<maximumFileSize value="10000" />
<!--到达限制大小后会生成一个新文件,如"2015-11-27.txt.1",依此类推,当生成"2015-11-27.txt.10"之后,再满了就要回头覆盖第一个文件了-->
<maxSizeRollBackups value="10" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %nLog Time:%utcdate %nThread ID:[%thread] %nLog %method Level: %-5level %n%message%newline %n"/>
</layout>
</appender> <appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log-file.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender> <!--log4net.Layout.PatternLayout中的转换模式(ConversionPattern)-->
<!--
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,例如:
模式字符串为:%-10c -%m%n
代码为:
ILog log=LogManager.GetLogger(“Exam.Log”);
log.Debug(“Hello”);
则输出为下面的形式:
Exam.Log - Hello
%L:输出语句所在的行号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充
例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
-->
</log4net> </configuration>

  4、在项目中添加一个LogHelper.cs的类 方便在项目其他页面中调用

LogHelper.cs 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;
using System.IO;
using System.Diagnostics;
namespace Log4net_Demo.Common
{
public class LogHelper
{
public static ILog log;
static LogHelper()
{ } public static void Info(object message)
{
if (log.IsInfoEnabled)
{
log.Info(message);
}
} public static void Info(object message, Exception exception)
{
if (log.IsInfoEnabled)
{
//add common logs
log.Info(message, exception);
} } public static void Error(object message)
{
if (log.IsErrorEnabled)
{
//add error logs
log.Error(message);
}
}
public static void Error(object message, Exception exception)
{
if (log.IsErrorEnabled)
{
//add error logs
log.Error(message, exception);
}
} public static void Warn(object message)
{
if (log.IsWarnEnabled)
{
//add warning logs
log.Warn(message);
}
}
public static void Warn(object message, Exception exception)
{
if (log.IsWarnEnabled)
{
//add warning logs
log.Warn(message, exception);
} } public static void Debug(object message)
{
if (log.IsDebugEnabled)
{
//add debug logs
log.Debug(message);
}
} #region logapp public static void Info(string logAppender, object message, string fileName = null)
{
GetLogger(logAppender, fileName);
if (log.IsInfoEnabled)
{
log.Info(message);
}
}
static string baseLogDirectory = $"{AppDomain.CurrentDomain.BaseDirectory}\\Log\\{DateTime.Now.ToString("yyyy-MM")}\\FIMService\\";
private static void GetLogger(string logAppender, string fileName)
{
try
{
if (!string.IsNullOrEmpty(fileName))//若FileName不为空,则修改写入文件名称
{
var repository = LogManager.GetRepository();
var appenders = repository.GetAppenders();
var targetApder = appenders.First(p => p.Name == $"{logAppender}FileAppender") as log4net.Appender.RollingFileAppender;
if (string.IsNullOrEmpty(baseLogDirectory))
{
baseLogDirectory = targetApder.File;
}
targetApder.File = $"{baseLogDirectory}{fileName}";
//targetApder.Writer = new System.IO.StreamWriter(targetApder.File, targetApder.AppendToFile, targetApder.Encoding);//只更新Write方法,Log日志无法写入,暂未找到解决方案
//激活更改,缺点:会更新Repository
targetApder.ActivateOptions();
}
log = LogManager.GetLogger(logAppender);//重新获取Logger
}
catch (Exception ex)
{
if (!EventLog.SourceExists("My Application"))
EventLog.CreateEventSource("My Application", "System"); EventLog eventLog = new EventLog("System");
eventLog.Source = "My Application";
eventLog.WriteEntry(string.Format("log4net error , message {0}", ex.Message));
} } public static void Info(string logAppender, object message, Exception exception)
{
log = LogManager.GetLogger(logAppender);
if (log.IsInfoEnabled)
{
//add common logs
log.Info(message, exception);
} } public static void Error(string logAppender, object message)
{
log = LogManager.GetLogger(logAppender);
if (log.IsErrorEnabled)
{
//add error logs
log.Error(message);
}
}
public static void Error(string logAppender, object message, Exception exception)
{
log = LogManager.GetLogger(logAppender);
if (log.IsErrorEnabled)
{
//add error logs
log.Error(message, exception);
}
} public static void Warn(string logAppender, object message)
{
log = LogManager.GetLogger(logAppender);
if (log.IsWarnEnabled)
{
//add warning logs
log.Warn(message);
}
}
public static void Warn(string logAppender, object message, Exception exception)
{
log = LogManager.GetLogger(logAppender);
if (log.IsWarnEnabled)
{
//add warning logs
log.Warn(message, exception);
} } public static void Debug(string logAppender, object message)
{
log = LogManager.GetLogger(logAppender);
if (log.IsDebugEnabled)
{
//add debug logs
log.Debug(message);
} }
public static void Debug(string logAppender, object message, Exception exception)
{
log = LogManager.GetLogger(logAppender);
if (log.IsDebugEnabled)
{
//add debug logs
log.Debug(message, exception);
} }
#endregion /// <summary>
/// 输出日志到Log4Net
/// </summary>
/// <param name="t"></param>
/// <param name="ex"></param>
#region static void WriteLog(Type t, Exception ex) public static void WriteLog(Type t, Exception ex)
{
log4net.ILog log = log4net.LogManager.GetLogger(t);
log.Error("Error", ex);
} #endregion /// <summary>
/// 输出日志到Log4Net
/// </summary>
/// <param name="t"></param>
/// <param name="msg"></param>
#region static void WriteLog(Type t, string msg) public static void WriteLog(Type t, string msg)
{
log = log4net.LogManager.GetLogger(t);
log.Error(msg);
} #endregion
}
}

  5、在项目代码中读取log4net.config 配置,这里有4中读取配置的方法。

a、在该web项目中的AssemblyInfo.cs文件中添加(注意放对位置,放在命名空间外)

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

b、Global.asax.cs中添加(位置也是在命名空间外)  [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

c、 在Global.asax.cs中 Application_Start方法中添加  log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo($@"{ AppDomain.CurrentDomain.BaseDirectory }\log4net.config"));

d、直接在要调用的controller\页面上添加 (位置也是在命名空间外) [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]   我个人不推荐这种方法 太繁重了 因为一个项目不可能就一两个页面 要   用到log日志功能的

6、在代码中使用log4net 记录错误日志   使用前面新建的LogHelper.cs 直接记录,页面传id=0 进入HomeController

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Log4net_Demo.Common; namespace Log4net_Demo.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index(int id)
{
try
{
int result = 8/id;
}
catch (Exception e)
{
LogHelper.Error(LogAppender.RollingFileAppender, e.ToString(), e);
} return View();
}
}
}

  

结果:

Web项目中使用Log4net 案例的更多相关文章

  1. asp.net Web项目中使用Log4Net进行错误日志记录

      使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...

  2. web项目中的 log4net的配置

    最近用log4net,网上查了很多资料,照着网上的配置大多都不管用,可能我还是有什么地方配置的不对.看出来的朋友平指出.下面是我自己亲测的,可以用! 1.web项目中的web.config 配置log ...

  3. ASP.NET MVC4 Web项目中使用Log4Net记录日志到文件和数据库。

    下载与.netframework版本向对应的log4net.dll ,然后添加引用.下载地址:http://logging.apache.org/log4net/download_log4net.cg ...

  4. ASP.NET MVC Web项目中使用Log4Net记录日志,并按照日志类型分文件存储

    1.创建MvcLog4Net项目 2.创建 空的MVC项目 3.项目创建完成的效果 4.选择项目,点击鼠标右键,在弹出菜单中选择“管理解决方案的 NuGet 程序包” 5. 在NuGet浏览界面: 点 ...

  5. C# 在项目中配置Log4net

    我们介绍一下在项目中配置log4net,是Apache基金会旗下的. 无论在什么环境中,配置log4net的逻辑都一样. 1)文件配置 首先在项目加载文件中,配置log4net加载项. 在Web项目中 ...

  6. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

  7. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  8. Web 项目中分享到微博、QQ空间等分享功能

    Web 项目中分享到微博.QQ空间等分享功能 网上有很多的模板以及代码,但是有很多都不能分享内容,简单的测试了下: 以新浪微博为例,文本框中的内容是title属性,下面的链接是url属性,如果你的链接 ...

  9. 【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能

    在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能. 项目是用springMVC+spring+hibernate实现 (和这个没有多大关系) 第一步: 首先 ...

随机推荐

  1. office常用技巧汇总

    1.excel篇 (1)一次选择多行 可以利用SHIFT+鼠标实现,点第一行,按下鼠标,点200行,就能实现1~200行选择了. 总结:就是一直按住shift键,鼠标点击要选择的首行,再点击尾行.

  2. 'while' statement cannot complete without throwing an exception

    You are probably using Android Studio or IntelliJ. If so, you can add this above your method contain ...

  3. git 命令从入门到放弃

    o(︶︿︶)o  由于项目使用 git 作为版本控制工具,自己可以进行一些常用操作但是有时候还是会忘掉,导致每次遇到 git 命令的使用问题时就要再查一遍,效率就立马降下来了,所以今天就来一个从头到尾 ...

  4. .net mvc 几种跨域获取数据方案

    方案一: 在web.conflg配置文件system.webServer节点中添加以下节点配置 <!--允许 "所有网站" 跨域访问写法:--><httpProt ...

  5. python 排序 归并排序

    算法思想 迭代法: 归并算法一共有两种思想,笼统的说,这两种思想的区别就在于一种不分割未排序的序列(直接将序列看为n个个数为1的子序列),这种称为---迭代法 直接从队头开始,两两合并为一个个数为2的 ...

  6. 阻止鼠标右键和F5刷新

    //禁止刷新的事件发生 document.onkeydown = function(){ if(event.keyCode==116){ event.keyCode = 0; event.cancel ...

  7. 【案例】电子生产中的排程问题如何解决?APS助力智能化排产

    共进电子是典型的消费类电子制造企业,以ODM业务为主,立足双O(OEM/ODM),发展自主品牌.其中,生产模式特点包括: 批量制造.多品种小批量.面向订单生产: 产品结构复杂,设计变更频繁:生产计划复 ...

  8. C# 读取Excel文件数据

    1.首先需要在管理NuGet程序包中添加外部包:ExcelDataReader,添加好后,不要忘记在命名空间那里引用. 2.定义文件流,将文件流传入IExcelDataReader类型的对象excel ...

  9. Linux的DNS正向解析部署

    前面介绍了DNS的作用及其相关的结果.Linux服务之DNS介绍 下面开始有关DNS的服务部署.<DNS正向解析示例> 工具:虚拟机 centos7 配置:Linux   IP 192.1 ...

  10. 通过async实现协程的延迟执行及结果获取

    在上一次https://www.cnblogs.com/webor2006/p/12022065.html对于协程的async和wait进行了初步的学习,其可以加速执行的性能,其实对于async它是提 ...