log4net(Log4Net教程)
大家好,相信到目前为止很多朋友对于log4net和Log4Net教程不太懂,不知道是什么意思?那么今天就由我来为大家分享log4net相关的知识点,文章篇幅可能较长,大家耐心阅读,希望可以帮助到大家,下面一起来看看吧!
1如何使用 log4net 日志框架
第一步:首先在项目中引用log4net.dll文件。
第二步:在Web.config文件中进行添加configSections的节点
复制代码代码如下:
configSections
section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/
!--配置一个结点 名称为log4net--
/configSections
第三步:添加log4net配置节点
复制代码代码如下:
log4net debug="true"
/log4net
然后在log4net节点下添加
写入本地文本文件中的配置
复制代码代码如下:
appender name="LogFileAppender" type="log4net.Appender.FileAppender"
!--定义的是日志记录到文件的附着器 name表示该附着器的名称--
!--在log4net中还有一个附着器RollingFileAppender 它表示会循环生成很多文件,举例来说,就是设置一共可以生成20个文件,每个文件的大小为2K,那么如果第一个、--
!--文件的大小超过2K,就会自动创建一个按顺序命名的文件--
param name="File" value="c:\Log\DBLog.txt" / !--日志记录的存在路径--
param name="AppendToFile" value="true" /!--为true就表示日志会附加到文件,为false,则会重新创建一个新文件--
layout type="log4net.Layout.PatternLayout"
!--输出内容控制--
param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /
/layout
/appender
注释很清楚,就不解释了。
写入指定邮箱的配置
复制代码代码如下:
appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"
!--设置发送电子邮件的附着器--
authentication value="Basic" /
to value="518@qq.com" /
from value="a@163.com" /
username value="帐号" /
password value="密码" /
subject value="程序异常日志记录邮件发送" /
smtpHost value="smtp.163.com" /
bufferSize value="512" /
lossy value="true" /
evaluator type="log4net.Core.LevelEvaluator"
threshold value="debug"/
/evaluator
layout type="log4net.Layout.PatternLayout"
conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" /
/layout
/appender
通过的是163邮箱服务器发送
将日志写入数据库的相关配置,还要建立一张对应的数据库表
复制代码代码如下:
appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"
!--存储到数据库的操作--
bufferSize value="10"/
connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/
connectionString value="server=.;database=Log4Net;user id=sa;password=saa"/
commandText value="INSERT INTO _Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @log_thread, @log_level, @log_logger, @log_message, @log_exception)"/
parameter
parameterName value="@log_date"/
dbType value="DateTime"/
layout type="log4net.Layout.RawTimeStampLayout"/!--可以认为是记录日志的时间--
/parameter
parameter
parameterName value="@log_thread"/
dbType value="String"/
size value="255"/
layout type="log4net.Layout.PatternLayout"
conversionPattern value="%thread"/!--记录日志时的线程号--
/layout
/parameter
parameter
parameterName value="@log_level"/
dbType value="String"/
size value="50"/
layout type="log4net.Layout.PatternLayout"
conversionPattern value="%level"/!--日志级别--
/layout
/parameter
parameter
parameterName value="@log_logger"/
dbType value="String"/
size value="255"/
layout type="log4net.Layout.PatternLayout"
conversionPattern value="%logger"/!--哪个记录器存储的该日志--
/layout
/parameter
parameter
parameterName value="@log_message"/
dbType value="String"/
size value="4000"/
layout type="log4net.Layout.PatternLayout"
conversionPattern value="%message"/!--日志信息--
/layout
/parameter
parameter
parameterName value="@log_exception"/
dbType value="String"/
size value="255"/
layout type="log4net.Layout.ExceptionLayout"/!--异常信息--
/parameter
/appender
2如何使用log4net记录日志
第一步:
添加log4net.dll的引用
第二步:
在AssemblyInfo.cs文件中添加下面一句话:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)]
意思是log4net会自动寻找配置文件App.config或Web.config从而获得并加载其中的配置信息。如果想log4net随时监视配置文件以便重新加载的话就要这样写按照上面一样写(winform程序ConfigFile为App.config)。
第三步:
配置Web.config
+ View Code
上面这段配置取自周公,配置的说明上面已经注释的比较详细了。
第四步:
在程序中记录信息。我们在项目下Default.aspx的Page_Load方法加入如下代码:
//获得log4net实例
ILog log = log4net.LogManager.GetLogger("LogFileAppender");
log.Info("Default.aspx下面的PageLoad方法被执行");
然后运行项目,可以发现在c:\log4netfile.txt中已经记录了一条日志信息:
记录时间:2011-04-21 21:26:17,729 线程ID:[4] 日志级别:INFO 出错类:LogFileAppender property:[(null)] - 错误描述:Default.aspx下面的PageLoad方法被执行
3MVC如何使用Log4Net进行错误日志记录
在Web应用运行过程中,我们难免会遇到程序运行异常,这个时候我们就应该将异常信息记录下来,以便开发人员和维护人员对异常原因进行还原,对异常原因进行修复。在ASP.NET平台中进行日志记录的组件也有很多,如Log4Net、CommonLogging等,我们这里选用Log4Net进行异常日志的记录。
1. 捕获异常
在ASP.NET MVC中提供了一个全局的异常处理过滤器:HandleErrorAttribute,可以通过该过滤器捕获异常信息。
我们在Models文件夹下新建类型Log4ExceptionAttribute,继承HandleErrorAttribute类,同时重写OnException方法来捕获异常数据:
using System.Web.Mvc;namespace PMS.WebApp.Models{ public class Log4ExceptionAttribute:HandleErrorAttribute { ///
/// 重写OnException方法来捕获异常数据 ///
///public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); //捕获当前异常数据 var ex = filterContext.Exception; } }}
新建过滤器后我们还需要在Global文件中调用的RegisterGlobalFilters方法中完成自己定义异常处理过滤的注册。
using System.Web.Mvc;using PMS.WebApp.Models;namespace PMS.WebApp{ public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); filters.Add(new Log4ExceptionAttribute()); } }}
2. 考虑到多用户并发操作时可能产生的问题,我们需要新建一个队列来进行异常信息的暂存,同时开辟一个线程专门对队列中的异常信息进行处理。
在Log4ExceptionAttribute类中新建一个静态的`异常类型的队列,在发生异常后,程序自动触发OnException方法,方法中将当前的异常信息入队后,跳转到错误页面。
using System;using System.Collections.Generic;using System.Web.Mvc;namespace PMS.WebApp.Models{ public class Log4ExceptionAttribute:HandleErrorAttribute { public static QueueExceptions=new Queue(); ///
/// 重写OnException方法来捕获异常数据 ///
///public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); //捕获当前异常数据 var ex = filterContext.Exception; //将异常数据入队 Exceptions.Enqueue(ex); //跳转到错误页面 filterContext.HttpContext.Response.Redirect("/Error.html"); } }}
Log4Net的配置是在应用程序配置文件中进行的,我们先在配置文件中进行Log4Net的配置。Log4Net需要配置的节点位置和SpringNet完全相同,首先需要在configSessions中新增子节点,然后在configuration节点中增加log4net节点完成具体配置。
...
在配置文件中可以对日志记录的信息、格式、文件名等作出具体的配置,下面是配置信息的详解
"1.0"?
在Global文件中的Application_Start方法中开启一个线程,用于将队列中的错误信息写入日志文件。
using System.Linq;using System.Threading;using System.Web.Http;using System.Web.Mvc;using System.Web.Optimization;using System.Web.Routing;using log4net;using PMS.WebApp.Models;using Spring.Web.Mvc;namespace PMS.WebApp{ // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明, // 请访问 public class MvcApplication : SpringMvcApplication//HttpApplication { protected void Application_Start() { log4net.Config.XmlConfigurator.Configure();//读取Log4Net配置信息 AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //开启一个线程,扫描异常信息队列. var filePath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem((a) = { while (true) { //判断队列中是否有数据 if (Log4ExceptionAttribute.Exceptions.Any()) { //出队一条异常信息 var ex = Log4ExceptionAttribute.Exceptions.Dequeue(); //若异常信息不为空 if (ex == null) continue; //将异常信息写入到日志文件中 var logger = LogManager.GetLogger("errorMsg"); logger.Error(ex.ToString()); } else { //若异常信息队列为空,则线程休息三秒 Thread.Sleep(3000); } } }, filePath); } }}
成功完成错误日志的配置。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
4log4net字符超过行限制
会将左边多出的字符截掉。log4net字符超过行限制会将左边多出的字符截掉,因此在输入的时候长度要小于30。log4net是一种帮助程序员,将日志语句输出到各种目标文件的输出工具,有了log4net,就可以在运行时启用日志记录,无需修改应用程序二进制文件。
5如何配置和使用log4net日志
1.先弄个日志记录的类
/// summary
/// 使用LOG4NET记录日志的功能,在WEB.CONFIG里要配置相应的节点
/// /summary
public class LogHelper
{
//log4net日志专用
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
public static void SetConfig()
{
log4net.Config.XmlConfigurator.Configure();
}
public static void SetConfig(FileInfo configFile)
{
log4net.Config.XmlConfigurator.Configure(configFile);
}
/// summary
/// 普通的文件记录日志
/// /summary
/// param name="info"/param
public static void WriteLog(string info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
/// summary
/// 错误日志
/// /summary
/// param name="info"/param
/// param name="se"/param
public static void WriteLog(string info, Exception se)
{
if (logerror.IsErrorEnabled)
{
logerror.Error(info, se);
}
}
}
2.WEB.CONFIG配置
在 configSections 节点上添加:
section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /
然后配置单独的节点:
!--日志--
log4net
logger name="logerror"
level value="ERROR" /
appender-ref ref="ErrorAppender" /
/logger
logger name="loginfo"
level value="INFO" /
appender-ref ref="InfoAppender" /
/logger
appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"
param name="File" value="E:\xxx.com\xx.xxx.com\App_Log\Error\ErrorLog.log" /
param name="AppendToFile" value="true" /
param name="MaxSizeRollBackups" value="100" /
param name="MaximumFileSize" value="1MB" /
param name="RollingStyle" value="Size" /
param name="StaticLogFileName" value="true" /
layout type="log4net.Layout.PatternLayout"
param name="ConversionPattern" value="%-5p %d [%c] %m%n" /
/layout
/appender
appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"
param name="File" value="E:\xxx.com\xxx.xxx.com\App_Log\Info\InfoLog.log" /
param name="AppendToFile" value="true" /
param name="MaxSizeRollBackups" value="100" /
param name="MaximumFileSize" value="1MB" /
param name="RollingStyle" value="Size" /
param name="StaticLogFileName" value="true" /
layout type="log4net.Layout.PatternLayout"
param name="ConversionPattern" value="%-5p %d [%c] %m%n" /
/layout
/appender
/log4net
3.在GOLBAL文件里调用写日志:
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
//初始日志的配置
LogHelper.SetConfig();
}
void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
Exception objExp = HttpContext.Current.Server.GetLastError();
string username = "";
string userid = "";
if (Session["ulogin"] != null)
{
string[] uinfo=Session["ulogin"].ToString().Split('|');
userid = uinfo[0];
username = uinfo[1];
}
Aotain114.Public.LogHelper.WriteLog("\r\n用户ID:"+userid+"\r\n用户名:"+username+"\r\n客户机IP:" + Request.UserHostAddress + "\r\n错误地址:" + Request.Url + "\r\n异常信息:" + Server.GetLastError().Message, objExp);
}
6log4net配置文件解析
log net
root
level value= ALL /
appender ref ref= rollingFile /
/root
appender name= rollingFile type= log net Appender RollingFileAppender log net
param name= File value= log txt /
param name= AppendToFile value= false /
param name= RollingStyle value= Date /
param name= DatePattern value= yyyy MM dd /
param name= StaticLogFileName value= true /
layout type= log net Layout PatternLayout log net
param name= ConversionPattern value= %d [%t] % p %c %m%n /
param name= Header value= header /
param name= Footer value= footer /
/layout
/appender
appender name= consoleApp type= log net Appender ConsoleAppender log net
layout type= log net Layout PatternLayout log net
param name= ConversionPattern value= %d [%t] % p %c %m%n /
/layout
/appender
logger name= Log NetTest LogTest
level value= DEBUG /
appender ref ref= rollingFile /
appender ref ref= coloredConsoleApp /
appender ref ref= SystemEvent /
/logger
/log net
log net配置节的XSD层次如下
log net
rootlevel /appender ref ref= //root
appender name= type= Appender的完全限定类名
param name= value= /
layout type= log net Layout PatternLayout log net
param name= value= /
/layout
/appender
logger
level value= /
appender ref ref= /
/logger
log net是log net配置节的根标记
root标记定义一个根级别的记录者 log net的记录者采用层级组织的 每一个LOGGER(ROOT也是一个LOGGER 只不过 他是祖先而已 别的方面 跟其他LOGGER一样) 都可以定义Level
level定义记录的日志级别 就是说 你要记录哪个级别以上的日志 级别由高往低依次是:
None
Fatal
ERROR
WARN
DEBUG
INFO
ALL
级别的定义要注意 如果你定义DEBUG 那么低于DEBUG级别以下的信息 将不会记入日志 啥意思呢?就是说 就算你在程序里 用()来写入一个日志信息 可是你在配置中指定level为DEBUG 由于INFO级别低于DEBUG 所以 不会被记入日志 这样的处理非常灵活
Logger还有一个配置就是appender ref了 ref是参照的意思 log net的架构非常有意思 可扩展性非常高非常值得借鉴 他分为四个要素:
logger
appender
layout
filter
logger是负责日志的记录者
appender提供记录的介质
layout负责把记入的内容格式化
filter负责把内容进行筛选
可以说 整个过程就是一个日志流水线 每个成员负责其中的一个环节
logger发出记录信息 appender接到信息 根据内部的layout配置对记录信息格式化 根据filter决定此信息是否被过滤掉 最后 将其序列化
因此 logger的appender ref就是定义说 LOGGER要找谁去将内容写入磁盘 流或其他介质 因此 十分重要吧
既然是ref引用 那肯定要定义这个被引用的appender对象了呀
每个appender都代表了一个输出介质
name属性指定其名称 type则是log net Appender命名空间的一个类的名称 意思是 指定使用哪种介质
log net支持的appender类型有十几种 最常用的有rollingFileAppender AdoNetAppender EventLogAppender FileAppender 分别把日志记入文件 系统日志和数据库
除此之外 appender内的其他参数都用param标记 以key/value形式定义于其内
这里有个小提示 每一个appender log net并没有在文档中提出他们需要哪些参数 那么 我们怎么知道呢?
原来 这些param的名称 你可以直接查对应的appender类的属性名即可 例如 使用EventLogAppender时 通过查看类的属性 我们知道其有
LogName ApplicationName属性 那么 意味着 你可以直接在这个APPENDER的param里加入以下内容:
param name= LogName value= Application /
param name= ApplicationName value= log netTest /
定义了appender的NAME及TYPE属性 以及使用param为其指定参数后 一个appender就建立了 你可以使用他的名字在LOGGER的appender ref中去 引用它 那么 引用它的LOGGER在写入日志时 就是写到了APPENDER中定义的介质中去了
一个LOGGER可以引用多个APPENDER 其结果是 同一个日志 被同时记录到多个介质中去 便如 同时发邮件 写入系统日志 发送到远程主机 不过 虽然可以这样做 但是还是要小心 因为 会对性能有一定的影响 除非你需要 否则 不要乱用此功能
另外 appender中可以定义可选的layout
layout的定义非常有必要 如果你不想将来看到你的日志会感觉头晕的话 虽然log net帮你写入日志 但是 日志信息的格式却是我们使用者自行定义的layout的type参数指定使用哪个类的定义来格式化 常用的有XmlLayout SimpleLayout PatternLayout 这个当然要根据你的需要 以及你要产生的格式来选啦 如果你要输出成XML文档格式 你肯定不能用simplelayout吧
layout使用param以KEY/VALUE形式定义其参数
各个Layout类使用的参数当然不一样啦 具体的 你可以去看各个Layout类的属性
其中 PatternLayout可以使用ConversionPattern参数来指定一个格式化字符串
以及可以指定一个Header参数 做为日志开头的字符串 Footer来指定结尾字符串
这里有一个小技巧 日志中开头和结尾总想产生回车符吧 虽然logger在写入一条日志会自动回车 可是Header和FOOTER却不会 咋办?用\n\r吗?(我从别人的BLOG上看到过)经实践 \n\r会原样定改日志 根本不会转换 其实 我们可以用XML实体呀 使用# ;# ;就可以在指定位置插入一个回车换行符了
最后 像log net的文档中说的那样 如果你不想你的日志文件变得很大 使读写的性能下降的话 建议你还是分级管理日志 把粒度变小点 也就是说 除了定义ROOT外 最后 对每一个模块或每一个实体 依据用途 目的 定义各自的LOGGER配置 这样的好处是日志被分散了 日志文件增长就没那么快了 每一个LOGGER的结构跟ROOT是一模一样的 这里不再叙述了 像前面说的那样 如果你相让日志产生层级关系 你可以跟他们的NAME属性像C#中的namespace那样命名就可以了
要说明的是 LOGGER的定义是非必须的 只是一种建议罢了 Log net的配置中 除了必须定义一个ROOT和一个APPENDER外 其他的都是可选的
lishixinzhi/Article/program/net/201311/11448
关于log4net和Log4Net教程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。