跟王者荣耀很像的:哪两个英雄最像

log4net 独立配置文件设置 - ASP.NET技巧 - 大学IT网
当前位置: >
> log4net 独立配置文件设置
关键词:&&阅读(216) 赞(17)
[摘要]本文是对log4net 独立配置文件设置的讲解,对学习ASP.NET编程技术有所帮助,与大家分享。
1. 新建一个配置文件log4net.config,配置方法同成web.config或app.config一致;
&?xml version="1.0" encoding="utf-8"?&&configuration&
&configSections&
&section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/&
&/configSections&
&log4net debug="true"&
&logger name="myLogger"&
&level value="INFO"/&
&appender-ref ref="AdoNetAppender_SqlServer"/&
&!--sql server数据库1--&
&appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender"&
&!-- BufferSize 为缓冲区大小,只有日志记录超5 条才会一块写入到数据库 --&
&!-- 或写为&param name="BufferSize" value="10" /& --&
&bufferSize value="0"/&
&!-- 引用 --&
&!--2.0这是对应sql2008 如是另外配置--&
&connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c"/&
&!-- 连接数据库字符串 --&
&connectionString value="Data Source=.;Initial Catalog=LUser ID=Password=123456;" /&
&!-- 插入到表Log --&
&commandText value = "INSERT INTO Mylogger ([EVENTTYPE],[TIMESTAMP],[EVENTCATEGORY],[EVENT_ID],[COMPUTERNAME],[MAC_ADDRESS],[USERNAME],[SOURCETYPE],[SOURCE],[DESCRIPTION],[COLLECTDATE]) VALUES (@Event_Type,@log_date, @EventCategory, @Event_ID, @ComputerName,@Mac_Address,@UserName,@SourceType,@Source,@Description,@CollectDate) "/&
&!-- 日志类型,这里均为3 --&
&parameter&
&parameterName value = "@Event_Type"/&
&dbType value = "Int32"/&
&!--&dbType value = "String"/&
&size value = "50"/&--&
&!-- LogComponent 是类所在的命名空间,MyLayout 是自定义属性所在的类,这是我们自己要写的部分,将在下面介绍。 --&
&layout type = "SuperAuth.Infrastructure.MyLayout"&
&!-- 当用到property 时,就表明这是用户自定义的字段属性啦,是log4net 中所没有提供的字段。 --&
&conversionPattern value = "%property{Event_Type} "/&
&/parameter&
&!-- 日志记录时间,RawTimeStampLayout 为默认的时间输出格式 --&
&parameter&
&parameterName value = "@log_date"/&
&dbType value = "DateTime"/&
&layout type = "log4net.Layout.RawTimeStampLayout"/&
&!-- /这里呢是获取log4net 中提供的日志时间 --&
&/parameter&
&!-- 日志分类描述 --&
&parameter&
&parameterName value = "@EventCategory"/&
&dbType value = "String"/&
&size value = "50"/&
&layout type = "SuperAuth.Infrastructure.MyLayout"&
&conversionPattern value = "%property{EventCategory}"/&
&/parameter&
&!-- 日志分类号 --&
&parameter&
&parameterName value = "@Event_ID"/&
&dbType value = "Int32"/&
&layout type = "SuperAuth.Infrastructure.MyLayout"&
&conversionPattern value = "%property{Event_ID}"/&
&/parameter&
&!-- 计算机IP --&
&parameter&
&parameterName value = "@ComputerName"/&
&dbType value = "String"/&
&size value = "50"/&
&layout type = "SuperAuth.Infrastructure.MyLayout"&
&conversionPattern value = "%property{ComputerName}"/&
&/parameter&
&!-- 计算机Mac 信息 --&
&parameter&
&parameterName value = "@Mac_Address"/&
&dbType value = "String"/&
&size value = "50 "/&
&layout type = "SuperAuth.Infrastructure.MyLayout"&
&conversionPattern value = "%property{Mac_Address}"/&
&/parameter&
&!-- 登陆系统用户名 --&
&parameter&
&parameterName value = "@UserName"/&
&dbType value = "String"/&
&size value = "50"/&
&layout type = "SuperAuth.Infrastructure.MyLayout"&
&conversionPattern value = "%property{UserName}"/&
&/parameter&
&!-- 事件来源类型,这里默认为Rier --&
&parameter&
&parameterName value = "@SourceType"/&
&dbType value = "String"/&
&size value = "20"/&
&layout type = "SuperAuth.Infrastructure.MyLayout"&
&conversionPattern value = "%property{SourceType}"/&
&/parameter&
&!-- 事件来源 --&
&parameter&
&parameterName value = "@Source "/&
&dbType value = "String"/&
&size value = "50"/&
&layout type = "SuperAuth.Infrastructure.MyLayout"&
&conversionPattern value = "%property{Source}"/&
&/parameter&
&!-- 事件描述 --&
&parameter&
&parameterName value = "@Description "/&
&dbType value = "String"/&
&size value = "4000"/&
&layout type = "SuperAuth.Infrastructure.MyLayout"&
&conversionPattern value = "%property{Description}"/&
&/parameter&
&!-- 日志收集时间 --&
&parameter&
&parameterName value = "@CollectDate"/&
&dbType value = "DateTime"/&
&layout type="log4net.Layout.RawTimeStampLayout" /&
&/parameter&
&/appender&
&/log4net&
&system.web&
&compilation debug="true" targetFramework="4.6.2" /&
&httpRuntime targetFramework="4.6.2" /&
&/system.web&
&/configuration&
2.建立相关的类文件如下:
public class LogHelper
private LogHelper()
SetConfig();
private static readonly log4net.ILog loginfo =LogManager.GetLogger("myLogger");
private static bool IsLoadConfig =
private static void SetConfig()
XmlConfigurator.Configure();
/// &summary&
/// 记录日志
/// &/summary&
/// &param name="info"&提示信息&/param&
public static void WriteLog(string info)
if (!IsLoadConfig)
SetConfig();
IsLoadConfig =
if (loginfo.IsInfoEnabled)
/// &summary&
/// 记录日志
/// &/summary&
/// &param name="info"&提示信息&/param&
public static void WriteLog(object info)
if (!IsLoadConfig)
SetConfig();
IsLoadConfig =
if (loginfo.IsInfoEnabled)
/// &summary&
/// 记录异常
/// &/summary&
/// &param name="info"&错误&/param&
/// &param name="ex"&Exception&/param&
public static void WriteLog(string info, Exception ex)
if (!IsLoadConfig)
SetConfig();
IsLoadConfig =
if (loginfo.IsErrorEnabled)
loginfo.Error(info, ex);
3.在使用类的地方引入log4net.config如下
[assembly: XmlConfigurator(ConfigFile= @"Log4net.config", Watch = true)]
4.最重要的一步,也是很多人出错的地方,右键log4net.config点击属性,按如下设置即可。
相关ASP.NET技巧推荐> 日志信息
浅谈Linux下的syslog守护进程:syslog是Linux下默认的日志守护进程。任何希望生成日志信息的
Linux环境-日志、资源和限制。日志:系统运行时或者程序运行时会产生很多信息,通常将其
Log4j配置介绍:Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输
linux日志文件过大,想要截取执行时间的日志信息 如何截取。
CentOS6 5下MariaDB日志及事物详解和基本操作语句。错误日志:通常时指错误日志的相关信息,
如何在Ubuntu 14 04上利用Logstash与Kibana实现日志信息集中化。在本篇教程中,我们将探讨Logstas
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是
rsyslog简介:在CentOS上rsyslog服务专门负责记录系统日志信息(更早的版本系统使用的是syslog,
【简介】中高端的飞塔防火墙通常本身都会自带硬盘,用来保存日志等信息,而低端防火墙
日志对于开发来说是非常重要的,不管是调试数据查看、bug问题追踪定位、数据信息收集统
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是
Log4j 由三个重要的组件构成: 日志信息的优先级, 日志信息的输出目的地,日志信息的输
错误日志记录了MySQL运行过程中所有较为严重的警告和错误信息,以及MySQL Server每次启动和
日志对于开发来说是非常重要的,不管是调试数据查看、bug问题追踪定位、数据信息收集统
Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j ,我们可以控制日志信息输送的目的地
Log4J是Apache的一个开放源代码的项目。通过使用Log4J,程序员可以控制日志信息输送的目的
日志服务是根据日志配置文件进行提供相应的功能服务,对于各种服务的信息等级的设定将
为了减轻服务器运行负担,所以我打算将一些基本信息初始化,存入缓存中,这样在进行一
Log4J是Apache的一个开放源代码的项目。通过使用Log4J,程序员可以控制日志信息输送的目的
前提:    IDE环境为Android Studio,熟悉LogCat,知道如何查看日志信息
工具:    An
Android Log史上最强大的 最易用的 Logcat工具,在所有开发中,日志输出极为重要。Android 为我
使用logback轻松管理日志:最近才开始在项目中使用logback,有一种相见恨晚的感觉,因为它
大数据学习——Flume介绍与安装,Flume是Cloudera提供的日志收集系统。Flume支持在日志系统中
关于搜狗实验室用户查询日志的分析,这里主要利用Sql Server数据库来演示基本的分析方法
Apache日志记录组件Log4j反序列化漏洞影响所有2 x版本。
漫谈无文件恶意软件的发展历史,究竟什么是“无文件恶意软件(fileless malware)”?谈到这个
迪普的自安全网络是怎样的一个安全?日,迪普科技在杭州召开合作伙伴大会,牛
安全事件响应之五步进阶,常言道:屋漏偏逢连夜雨,我同学所供职的公司最近真是祸不单
Uber回应擅自跟踪个人iPhone:为保障账户安全,美国科技媒体网站4月23日消息称,苹果公司
浅析微博APP的信息流机制与社交行为私密性,社交软件对我们日常生活的影响已经越来越大
热门文章热门标签
09月01日 |
09月01日 |
09月01日 |
09月02日 |
09月02日 |
09月02日 |
09月02日 |
09月02日 |log4net配置-疾风资料库
log4net配置
发布时间: 03:16&&&&发布人:
log4net配置
1、概述log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文主要是介绍如何在Visual Studio2008中使用log4net快速创建系统日志,如何扩展以输出自定义字段。2、一个简单的使用实例第一步:在项目中添加对log4net.dll的引用,这里引用版本是1.2.10.0。第二步:程序启动时读取log4net的配置文件。如果是CS程序,在根目录的Program.cs中的Main方法中添加:log4net.Config.XmlConfigurator.Configure();如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加:log4net.Config.XmlConfigurator.Configure();无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句:[assembly: log4net.Config .XmlConfigurator()]也可以使用自定义的配置文件,具体请参见4.4 关联配置文件。第三步:修改配置文件。如果是CS程序,则在默认的App.config文件(没有新建一个)中添加内容;如果是BS程序,则添加到Web.config文件中,添加内容一样,这里不再列出。App.config文件添加内容如下:&?xmlversion="1.0"encoding="utf-8"?&&configuration&&configSections&&sectionname="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /&&/configSections&&log4net&&root&&levelvalue="WARN"/&&appender-refref="LogFileAppender"/&&appender-refref="ConsoleAppender"/&&/root&&loggername="testApp.Logging"&&levelvalue="DEBUG"/&&/logger&&appendername="LogFileAppender"type="log4net.Appender.FileAppender" &&paramname="File"value="log-file.txt"/&&paramname="AppendToFile"value="true"/&&layouttype="log4net.Layout.PatternLayout"&&paramname="Header"value="[Header]"/&&paramname="Footer"value="[Footer]"/&&paramname="ConversionPattern"value="%d [%t] %-5p %c[%x] - %m%n" /&&/layout&&filtertype="log4net.Filter.LevelRangeFilter"&&paramname="LevelMin"value="DEBUG"/&&paramname="LevelMax"value="WARN"/&&/filter&&/appender&&appendername="ConsoleAppender"type="log4net.Appender.ConsoleAppender" &&layouttype="log4net.Layout.PatternLayout"&&paramname="ConversionPattern"value="%d [%t] %-5p %c [%x]- %m%n" /&&/layout&&/appender&&/log4net&&/configuration&第四步:在程序使用。log4net.ILog log = log4net.LogManager.GetLogger("testApp.Logging");//获取一个日志记录器<(DateTime.Now.ToString() + ": login success");//写入一条新log这样就将信息同时输出到控制台和写入到文件名为"log-file.txt"的文件中,其中"log-file.txt"文件的路径是当前程序运行所在目录;也可以定义为绝对路径,配置如:&paramname="File"value="C:\log-file.txt"/&就写入C盘根目录下log-file.txt文件中,具体使用技巧参见4.2.1。本例的实现请参见8.6附件。3、Log4net的主要组成部分3.1 AppendersAppenders用来定义日志的输出方式,即日志要写到那种介质上去。较常用的Log4net已经实现好了,直接在配置文件中调用即可,可参见上面配置文件例子;当然也可以自己写一个,需要从log4net.Appender.AppenderSkeleton类继承。它还可以通过配置Filters和Layout来实现日志的过滤和输出格式。已经实现的输出方式有:AdoNetAppender将日志记录到数据库中。可以采用SQL和存储过程两种方式。AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。AspNetTraceAppender能用asp.net中Trace的方式查看记录的日志。BufferingForwardingAppender在输出到子Appenders之前先缓存日志事件。ConsoleAppender将日志输出到应用程序控制台。EventLogAppender将日志写到WindowsEventLog。FileAppender 将日志输出到文件。ForwardingAppender发送日志事件到子Appenders。LocalSyslogAppender将日志写到localsyslogservice(仅用于UNIX环境下)。MemoryAppender将日志存到内存缓冲区。NetSendAppender将日志输出到WindowsMessengerservice.这些日志信息将在用户终端的对话框中显示。OutputDebugStringAppender将日志输出到Debuger,如果程序没有Debuger,就输出到系统Debuger。如果系统Debuger也不可用,将忽略消息。RemoteSyslogAppender通过UDP网络协议将日志写到Remotesyslogservice。RemotingAppender通过.NETRemoting将日志写到远程接收端。RollingFileAppender将日志以回滚文件的形式写到文件中。SmtpAppender将日志写到邮件中。SmtpPickupDirAppender将消息以文件的方式放入一个目录中,像IIS SMTP agent这样的SMTP代理就可以阅读或发送它们。TelnetAppender客户端通过Telnet来接受日志事件。TraceAppender将日志写到.NETtrace系统。UdpAppender将日志以无连接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。3.2 Filters使用过滤器可以过滤掉Appender输出的内容。过滤器通常有以下几种:DenyAllFilter阻止所有的日志事件被记录LevelMatchFilter只有指定等级的日志事件才被记录LevelRangeFilter日志等级在指定范围内的事件才被记录LoggerMatchFilter与Logger名称匹配,才记录PropertyFilter消息匹配指定的属性值时才被记录StringMathFilter消息匹配指定的字符串才被记录3.3 LayoutsLayout用于控制Appender的输出格式,可以是线性的也可以是XML。一个Appender只能有一个Layout。最常用的Layout应该是经典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然后还有IRawLayout,XMLLayout等几个,使用较少。Layout可以自己实现,需要从log4net.Layout.LayoutSkeleton类继承,来输出一些特殊需要的格式,在后面扩展时就重新实现了一个Layout。SimpleLayout简单输出格式,只输出日志级别与消息内容。RawTimeStampLayout用来格式化时间,在向数据库输出时会用到。样式如"yyyy-MM-dd HH:mm:ss"ExceptionLayout需要给Logger的方法传入Exception对象作为参数才起作用,否则就什么也不输出。输出的时候会包含Message和Trace。PatterLayout使用最多的一个Layout,能输出的信息很多,使用方式可参见上面例子中的配置文件。PatterLayout的格式化字符串见文后附注8.1。3.4 LoggersLogger是直接和应用程序交互的组件。Logger只是产生日志,然后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。Logger提供了多种方式来记录一个日志消息,也可以有多个Logger同时存在。每个实例化的Logger对象对被log4net作为命名实体(Named Entity)来维护。log4net使用继承体系,也就是说假如存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每个Logger都继承了它祖先的属性。所有的Logger都从Root继承, Root本身也是一个Logger。日志的等级,它们由高到底分别为:OFF & FATAL&ERROR&WARN&INFO&DEBUG &ALL高于等级设定值方法(如何设置参见"配置文件详解")都能写入日志,Off所有的写入方法都不写到日志里,ALL则相反。例如当我们设成Info时,logger.Debug就会被忽略而不写入文件,但是FATAL, ERROR,WARN,INFO会被写入,因为他们等级高于INFO。在具体写日志时,一般可以这样理解日志等级:FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。ERROR(一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。DEBUG(调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。Logger实现的ILog接口,ILog定义了5个方法(Debug,Inof,Warn,Error,Fatal)分别对不同的日志等级记录日志。这5个方法还有5个重载。以Debug为例说明一下,其它的和它差不多。ILog中对Debug方法的定义如下:voidDebug(object message);voidDebug(object message, Exception ex);还有一个布尔属性:boolIsDebugEnabled { }如果使用Debug(object message, Exception ex),则无论Layout中是否定义了%exception,默认配置下日志都会输出Exception。包括Exception的Message和Trace。如果使用Debug(object message),则日志是不会输出Exception。最后还要说一个LogManager类,它用来管理所有的Logger。它的GetLogger静态方法,可以获得配置文件中相应的Logger:log4net.ILog log = log4net.LogManager.GetLogger("logger-name");3.5 Object Renders它将告诉logger如何把一个对象转化为一个字符串记录到日志里。(ILog中定义的接口接收的参数是Object,而不是String。)例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。所以要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,然后注册它(我们在本文中的扩展不使用这种方法,而是直接实现一个自定义的Layout)。这时logger就会知道如何把Orange记录到日志中了。3.6 RepositoryRepository主要用于日志对象组织结构的维护。4、配置文件详解4.1 配置文件构成主要有两大部分,一是申明一个名为"log4net"的自定义配置节,如下所示:&configSections&&sectionname="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /&&/configSections&二是&log4net&节的具体配置,这是下面要重点说明的。4.1.1&log4net&所有的配置都要在&log4net&元素里定义。支持的属性:debug可选,取值是true或false,默认是false。设置为true,开启log4net的内部调试。update可选,取值是Merge(合并)或Overwrite(覆盖),默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库。threshold可选,取值是repository(库)中注册的level,默认值是ALL。支持的子元素:appender0或多个logger0或多个renderer0或多个root最多一个param0或多个4.1.2&root&实际上就是一个根logger,所有其它logger都默认继承它,如果配置文件里没有显式定义,则框架使用根日志中定义的属性。root元素没有属性。支持的子元素:appender-ref0个或多个,要引用的appender的名字。level最多一个。只有在这个级别或之上的事件才会被记录。param0个或多个,设置一些参数。4.1.3&logger&支持的属性:name必须的,logger的名称additivity可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender。支持的子元素:appender-ref0个或多个,要引用的appender的名字。level最多一个。只有在这个级别或之上的事件才会被记录。param0个或多个,设置一些参数。4.1.4&appender&定义日志的输出方式,只能作为 log4net 的子元素。name属性必须唯一,type属性必须指定。支持的属性:name必须的,Appender对象的名称type必须的,Appender对象的输出类型支持的子元素:appender-ref0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。filter0个或多个,定义此app使用的过滤器。layout最多一个。定义appender使用的输出格式。param0个或多个,设置Appender类中对应的属性的值。实际上&appender&所能包含的子元素远不止上面4个。4.1.5&layout&布局,只能作为&appender&的子元素。支持的属性:type必须的,Layout的类型支持的子元素:param0个或多个,设置一些参数。4.1.6&filter&过滤器,只能作为&appender&的子元素。支持的属性:type必须的,Filter的类型支持的子元素:param0个或多个,设置一些参数。4.1.7&param&&param&元素可以是任何元素的子元素。支持的属性:name必须的,取值是父对象的参数名。value可选的,value和type中,必须有一个属性被指定。value是一个能被转化为参数值的字符串。type可选的,value和type中,必须有一个属性被指定。type是一个类型名,如果type不是在log4net程序集中定义的,就需要使用全名。支持的子元素:param0个或多个,设置一些参数。4.2&appender&配置&appender&在配置文件中至少有一个,也可以有多个,有些&appender&类型还可以引用其他&appender&类型,具体参数可参见上表。下面只对写入回滚文件与输出到数据库(这里使用SQL数据库)配置体会说一下,其他配置可参考官方网站:http://logging.apache.org/log4net/release/config-examples.html4.2.1写入回滚文件&appendername="ReflectionLayout"type="log4net.Appender.RollingFileAppender,log4net"&&!--日志文件路径,"/"与"\"作用相同,到达的目录相同,文件夹不存在则新建--&&!--按文件大小方式输出时在这里指定文件名,并且当天的日志在下一天时在文件名后自动追加当天日期形成新文件。--&&!—按照日期形式输出时,直接连接元素DatePattern的value形成文件路径。此处使用这种方式--&&!--param的名称,可以直接查对应的appender类的属性名即可,这里要查的就是RollingFileAppender类的属性--&&paramname="File"value="D:/Log/"/&&!--是否追加到文件--&&paramname="AppendToFile"value="true"/&&!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--&&lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/&&!—使用Unicode编码--&&Encodingvalue="UTF-8"/&&!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--&&paramname="MaxSizeRollBackups"value="10"/&&!--是否只写到一个文件中--&&paramname="StaticLogFileName"value="false"/&&!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--&&paramname="RollingStyle"value="Composite"/&&!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]--&&!—此处按日期产生文件夹,文件名固定。注意&的位置--&&paramname="DatePattern"value="yyyy-MM-dd/&ReflectionLayout.log&"/&&!—这是按日期产生文件夹,并在文件名前也加上日期--&&paramname="DatePattern"value="yyyyMMdd/yyyyMMdd&-TimerServer.log&"/&&!—这是先按日期产生文件夹,再形成下一级固定的文件夹—&&paramname="DatePattern"value="yyyyMMdd/&TimerServer/TimerServer.log&"/&&!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--&&paramname="maximumFileSize"value="500KB"/&&!--计数类型为1,2,3…--&&paramname="CountDirection"value="1"/&&!—过滤设置,LevelRangeFilter为使用的过滤器。--&&filtertype="log4net.Filter.LevelRangeFilter"&&paramname="LevelMin"value="DEBUG"/&&paramname="LevelMax"value="WARN"/&&/filter&&!--记录的格式。一般用log4net.Layout.PatternLayout布局--&&!—此处用继承了log4net.Layout.PatternLayout的自定义布局,TGLog.ExpandLayout2为命名空间。%property{Operator}、%property{Action}是自定义的输出--&&layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog"&&paramname="ConversionPattern"value="记录时间:&#65533;te 线程ID:[%thread] 日志级别:%-5level 记录类:%logger操作者ID:%property{Operator} 操作类型:%property{Action}%n当前机器名:%property%n当前机器名及登录用户:%username %n记录位置:%location%n 消息描述:%property{Message}%n异常:%exception%n 消息:%message%newline%n%n" /&&/layout&&/appender&注意这些配置属性有些是可选的,如果需要,一定要写正确,否则要么输出的不是自己想要的结果,要么干脆不输出任何信息。4.2.1写入SQL数据库需要在相应的数据库中准备好一张表,创建语句如下:CREATETABLE [Log] ([ID] [int]IDENTITY (1, 1) NOT NULL ,[Date][datetime] NOT NULL ,[Thread][varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,[Level][varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,[Logger][varchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,[Operator][int] NULL ,[Message][text] COLLATE Chinese_PRC_CI_AS NULL ,[ActionType] [int] NULL ,[Operand][varchar] (300) COLLATE Chinese_PRC_CI_AS NULL ,[IP][varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,[MachineName] [varchar] (100) COLLATEChinese_PRC_CI_AS NULL ,[Browser][varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[Location][text] COLLATE Chinese_PRC_CI_AS NULL ,[Exception][text] COLLATE Chinese_PRC_CI_AS NULL)&appendername="ADONetAppender"type="log4net.Appender.ADONetAppender,log4net"&&!--BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库--&&bufferSizevalue="10"/&&!—或写为&param name="BufferSize" value="10"/&--&&!--引用--&&connectionTypevalue="System.Data.SqlClient.SqlConnection,System.Data, Version=1.0.3300.0, Culture=neutral,PublicKeyToken=b77a5c" /&&!--连接数据库字符串--&&connectionStringvalue="datasource=.;initial catalog=Tintegrated security=persistsecurity info=TUser ID=Password=;" /&&!--插入到表Log--&&commandTextvalue="INSERTINTO Log([Date],[Thread],[Level],[Logger],[Operator],[Message],[ActionType],[Operand],[IP],[MachineName],[Browser],[Location],[Exception])VALUES (@log_date, @thread, @log_level, @logger,@operator,@message,@action_type,@operand,@ip,@machineName,@browser,@location,@exception)"/&&!—日志记录时间,RawTimeStampLayout为默认的时间输出格式--&&parameter&&parameterNamevalue="@log_date"/&&dbTypevalue="DateTime"/&&layouttype="log4net.Layout.RawTimeStampLayout"/&&/parameter&&!--线程号--&&parameter&&parameterNamevalue="@thread"/&&dbTypevalue="String"/&&!—长度不可以省略,否则不会输出--&&sizevalue="100"/&&layouttype="log4net.Layout.PatternLayout"&&conversionPatternvalue="%thread"/&&/layout&&/parameter&&!--日志等级--&&parameter&&parameterNamevalue="@log_level"/&&dbTypevalue="String"/&&sizevalue="100"/&&layouttype="log4net.Layout.PatternLayout"&&conversionPatternvalue="%level"/&&/layout&&/parameter&&!--日志记录类名称--&&parameter&&parameterNamevalue="@logger"/&&dbTypevalue="String"/&&sizevalue="200"/&&layouttype="log4net.Layout.PatternLayout"&&conversionPatternvalue="%logger"/&&/layout&&/parameter&&!--操作者。这个是自定义的输出字段,使用重新实现的布局器ReflectionLayout--&&parameter&&parameterNamevalue="@operator"/&&!—设置为Int32时只有bufferSize的value&="1"才正确输出,没有找出原因。--&&dbTypevalue="Int16"/&&layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog"&&conversionPatternvalue="%property{Operator}"/&&/layout&&/parameter&&!--操作对象--&&parameter&&parameterNamevalue="@operand"/&&dbTypevalue="String"/&&sizevalue="300"/&&layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog"&&conversionPatternvalue="%property{Operand}"/&&/layout&&/parameter&&!—IP地址--&&parameter&&parameterNamevalue="@ip"/&&dbTypevalue="String"/&&sizevalue="20"/&&layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog"&&conversionPatternvalue="%property{IP}"/&&/layout&&/parameter&&!--机器名--&&parameter&&parameterNamevalue="@machineName"/&&dbTypevalue="String"/&&sizevalue="100"/&&layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog"&&conversionPatternvalue="%property{MachineName}"/&&/layout&&/parameter&&!--浏览器--&&parameter&&parameterNamevalue="@browser"/&&dbTypevalue="String"/&&sizevalue="50"/&&layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog"&&conversionPatternvalue="%property{Browser}"/&&/layout&&/parameter&&!—日志消息--&&parameter&&parameterNamevalue="@message"/&&dbTypevalue="String"/&&sizevalue="3000"/&&layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog"&&conversionPatternvalue="%property{Message}"/&&/layout&&/parameter&&!--动作类型--&&parameter&&parameterNamevalue="@action_type"/&&dbTypevalue="Int16"/&&layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog"&&conversionPatternvalue="%property{ActionType}"/&&/layout&&/parameter&&!—记录日志的位置--&&parameter&&parameterNamevalue="@location"/&&dbTypevalue="String"/&&sizevalue="2000"/&&layouttype="log4net.Layout.PatternLayout"&&conversionPatternvalue="%location"/&&/layout&&/parameter&&!—异常信息。ExceptionLayout为异常输出的默认格式--&&parameter&&parameterNamevalue="@exception"/&&dbTypevalue="String"/&&sizevalue="4000"/&&layouttype="log4net.Layout.ExceptionLayout"/&&/parameter&&/appender&注意:向表中输出的字段不能多于数据表本身字段,而反之则可以,但这些多余字段一定使其可以为空,否则便写不到数据库;输出字段的类型一定是对应数据表字段数据类型可以隐式转换的,而且长度也不能超过,否则也不能写入;数据表字段设置尽量可以为空,这样可以避免一条日志记录存在空数据导致后面的日志都记录不了。4.3&logger&的配置在配置文件&appender&中的配置好了输出的介质,格式,过滤方式,还要定义日志对象&logger&。在框架的体系里,所有的日志对象都是根日志(root logger)的后代。 因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在&root&标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过&appender-ref&标签定义日志对象使用的Appender对象。&appender-ref&声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定&logger&标签的additivity属性为false而改变。&root&不显式申明时使用默认的配置。我觉得在使用时不定义&root&,自定义多个&logger&,在程序中记录日志时直接使用&logger&的name来查找相应的&logger&,这样更灵活一些。例如:&!--同时写两个文件和数据库--&&loggername="ReflectionLayout"&&levelvalue="DEBUG"/&&appender-refref="HashtableLayout"/&&appender-refref="ReflectionLayout"/&&appender-refref="ADONetAppender"/&&/logger&4.4关联配置文件log4net默认关联的是应用程序的配置文件App.config(BS程序是Web.config),可以使用程序集自定义属性来进行设置。下面来介绍一下这个自定义属性:log4net.Config.XmlConifguratorAttribute。XmlConfiguratorAttribute有3个属性:ConfigFile:配置文件的名字,文件路径相对于应用程序目录(AppDomain.CurrentDomain.BaseDirectory)。ConfigFile属性不能和ConfigFileExtension属性一起使用。ConfigFileExtension: 配置文件的扩展名,文件路径相对于应用程序的目录。ConfigFileExtension属性不能和ConfigFile属性一起使用。Watch:如果将Watch属性设置为true,就会监视配置文件。当配置文件发生变化的时候,就会重新加载。如果ConfigFile和ConfigFileExtension都没有设置,则使用应用程序的配置文件App.config(Web.config)。可以在项目的AssemblyInfo.cs文件里添加以下的语句://监视默认的配置文件,App.exe.config[assembly: log4net.Config.XmlConfigurator(Watch= true)]//监视配置文件,App.exe.log4net。[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]//使用配置文件log4net.config,不监视改变。注意log4net.config文件的目录,BS程序在站点目录//下,CS则在应用程序启动目录下,如调试时在\bin\Debug下,一般将文件属性的文件输出目录调为//始终复制即可[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]//使用配置文件log4net.config,不监视改变[assembly: log4net.Config.XmlConfigurator()]也可以在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里一定是绝对路径,如下所示://这是在BS程序下,使用自定义的配置文件log4net.xml,使用Server.MapPath("~") +//@"\log4net.xml"来取得路径。 \log4net.xml为相对于站点的路径//ConfigureAndWatch()相当于Configure(Watch = true)log4net.Config.XmlConfigurator.ConfigureAndWatch(newSystem.IO.FileInfo(Server.MapPath("~") + @"\log4net.xml"));//这是在CS程序下,可以用以下方法获得:stringassemblyFilePath =Assembly.GetExecutingAssembly().LstringassemblyDirPath =Path.GetDirectoryName(assemblyFilePath);stringconfigFilePath =assemblyDirPath + "";log4net.Config.XmlConfigurator.ConfigureAndWatch(newFileInfo(configFilePath));或直接使用绝对路径://使用自定义的配置文件,直接绝对路径为:c:/log4net.configlog4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(@"c:/log4net.config"));5、如何记录日志Log4net使用很方便,先申明一个封装类ILog的对象,如下:log4net.ILog log = log4net.LogManager.GetLogger("ReflectionLayout");其中"ReflectionLayout"便是我们自定义的日志对象&logger&的name的值。对应5个日志输出级别,log有5 个方法,每个方法都有两个重载,使用如下:try{log.Debug("这是一个测试!");}catch(Exception ec){log.Error("出现错误!", ec);}如果我们需要输出的消息是要区别开来,不按一个字符串全部输出,就需要进行一些扩展了。
[log4net]webapi中使用log4net
[log4net]webapi中使用log4net——简介下面介绍如何在webapi中安装,配置log4net[log4net]webapi中使用log4net——知识点vs2010[log4net]webapi中使用log4net——详细知识[log4net]webapi中使用log4net 一从nuget下载log4net[log4net]webapi中使用log4net 二在webconfig中加入关于log4net的配置,其中可以有很复杂的配置,这里只做最基本的。&section name=&log4net& type=&log4net.Config.Log4NetConfigurationSectionHandler, log4net&&&/section&&log4net&&appender name=&FileAppender& type=&log4net.Appender.FileAppender&&&param name=&File& value=&mylogfile.txt&/&&param name=&AppendToFile& value=&true&/&&layout type=&log4net.Layout.PatternLayout&&&param name=&ConversionPattern& value=&%d - %m%n&/&&/layout&&/appender&&root&&level value=&ALL&/&&appender-ref ref=&FileAppender&/&&/root&&/log4net&配置的具体位置如图所示[log4net]webapi中使用log4net 三在WebApiConfig.cs 中加上(也可以在global中加)log4net.Config.XmlConfigurator.Configure();[log4net]webapi中使用log4net 四新增一个简单的loghelper类,加入一个测试方法private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(&LogHelper&);public static void WriteLog(string msg){<(msg);}[log4net]webapi中使用log4net 五然后把write方法加载需要写log的方法中即可LogHelper.WriteLog(&hello can you hear me~&);[log4net]webapi中使用log4net 六然后在浏览器上运行api/values,就可以看到项目中多了一个mylogfile.txt文件[log4net]webapi中使用log4net 七如果不想每个方法中都写一遍write,或者当需要追踪每一次api请求。那就需要把log4net写在Filter中首先实现如果要记录每一个api请求,这个可以重写在OnActionExecuting中private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);public override void OnActionExecuting(HttpActionContext filterContext){var message = new StringBuilder();message.Append(string.Format(&Executing controller {0}, action {1}&,filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,filterContext.ActionDescriptor.ActionName));<(message);}[log4net]webapi中使用log4net 八对每个请求的error做处理,这个需要重写OnActionExecutedpublic override void OnActionExecuted(HttpActionExecutedContext filterContext){if (filterContext.Exception == null){}else {Exception ex = filterContext.Elog.Error(ex);}}全部代码如下图[log4net]webapi中使用log4net 九然后api中加入filter,再加一个throw error的测试用例浏览器中请求api/values/12,mylogfile.txt中就会有相应的记录和error信息[log4net]webapi中使用log4net——注意事项实际项目中还需要全面的考虑,这里只是针对log4net的demo
C#中log4net使用方法(一)
Log4net是一个第三方开源组件,它设计的主要目的是组合,生成日志信息,同时将配置保存到各种存储介质或者展现平台中,在实际项目中,Log4net可以保存系统运行情况,可以在系统出现异常时,根据保存的日志信息,查看当时系统的状态。1.Log4net的优点:几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。2 Log4net的安装:用户可以从http://logging.apache.org/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可。3Log4net的结构log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).(1)Logger接口Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。log4net框架使用继承体系,继承体系类似于.NET中的名字空间。也就是说,如果有两个logger,分别被定义为a.b.c和a.b,那么我们说a.b是a.b.c的祖先。每一个logger都继承了祖先的属性Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口。你可以参考在/extension目录下的几个例子。ILog接口的定义如下:publicinterfaceILog { voidDebug(objectmessage); voidInfo(objectmessage); voidWarn(objectmessage); voidError(objectmessage); voidFatal(objectmessage); //以上的每一个方法都有一个重载的方法,用来支持异常处理。//每一个重载方法都如下所示,有一个异常类型的附加参数。voidDebug(objectmessage,Exceptionex); //...//Boolean属性用来检查Logger的日志级别//(我们马上会在后面看到日志级别)boolisDebugE boolisInfoE //&其他方法对应的Boolean属性}Log4net框架定义了一个叫做LogManager的类,用来管理所有的logger对象。它有一个GetLogger()静态方法,用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象,它也会为我们创建一个Logger对象。代码如下所示:log4net.ILoglog=log4net.LogManager.GetLogger(&logger-name&);通常来说,我们会以类(class)的类型(type)为参数来调用GetLogger(),以便跟踪我们正在进行日志记录的类。传递的类(class)的类型(type)可以用typeof(Classname)方法来获得,或者可以用如下的反射方法来获得:System.Reflection.MethodBase.GetCurrentMethod().DeclaringType尽管符号长了一些,但是后者可以用于一些场合,比如获取调用方法的类(class)的类型(type)。(2)日志的级别正如你在ILog的接口中看到的一样,有五种不同的方法可以跟踪一个应用程序。事实上,这五种方法是运作在Logger对象设置的不同日志优先级别上。这几种不同的级别是作为常量定义在log4net.spi.Level类中。你可以在程序中使用任何一种方法。但是在最后的发布中你也许不想让所有的代码来浪费你的CPU周期,因此,框架提供了7种级别和相应的Boolean属性来控制日志记录的类型。Level有以下几种取值:表1 Logger的日志级别在log4net框架里,通过设置配置文件,每个日志对象都被分配了一个日志优先级别。如果没有给一个日志对象显式地分配一个级别,那么该对象会试图从他的祖先继承一个级别值。ILog接口的每个方法都有一个预先定义好了的级别值。正如你在表1看到的,ILog的Inof()方法具有INFO级别。同样的,以此类推,Error()方法具有ERROR级别。当我们使用以上的任何一种方法时,log4net框架会检查日志对象logger的级别和方法的级别。只有当方法的级别高于日志级别时,日志请求才会被接受并执行。举例说明,当你创建了一个日志对象,并且把他的级别设置为INFO。于是框架会设置日志的每个Boolean属性。当你调用相应的日志方法时,框架会检查相应的Boolean属性,以决定该方法能不能执行。如下的代码:<(&message&); Logger.Debug(&message&); Logger.Warn(&message&);对于第一种方法,Info()的级别等与日志的级别(INFO),因此日志请求会被传递,我们可以得到输出结果”message”。对于第二种方法,Debug()的级别低于日志对象logger的日志级别(INFO),因此,日志请求被拒绝了,我们得不到任何输出。同样的,针对第三行语句,我们可以很容易得出结论。在表1中有两个特殊的级别:ALL和OFF。ALL表示允许所有的日志请求。OFF是拒绝所有的请求。你也可以显式地检查Logger对象的Boolean属性,如下所示:if(logger.IsDebugEnabled) { Logger.Debug(&message&); }RepositoryRepository主要用于负责日志对象组织结构的维护。在log4net的以前版本中,框架仅支持分等级的组织结构(hierarchical organization)。这种等级结构本质上是库的一个实现,并且定义在log4net.Repository.Hierarchy 名字空间中。要实现一个Repository,需要实现log4net.Repository.ILoggerRepository 接口。但是通常并不是直接实现该接口,而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库(hierarchical repository )则由log4net.Repository.Hierarchy.Hierarchy类实现。如果你是个log4net框架的使用者,而非扩展者,那么你几乎不会在你的代码里用到Repository的类。相反的,你需要用到LogManager类来自动管理库和日志对象。Appender一个好的日志框架应该能够产生多目的地的输出。比如说输出到控制台或保存到一个日志文件。log4net 能够很好的满足这些要求。它使用一个叫做Appender的组件来定义输出介质。正如名字所示,这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你可以把多个Appender组件附加到一个日志对象上。Log4net框架提供了几个Appender组件。关于log4net提供的Appender组件的完整列表可以在log4net框架的帮助手册中找到。有了这些现成的Appender组件,一般来说你没有必要再自己编写了。但是如果你愿意,可以从log4net.Appender.AppenderSkeleton类继承Appender Filters一个Appender 对象缺省地将所有的日志事件传递到输出流。Appender的过滤器(Appender Filters) 可以按照不同的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预定义的过滤器。使用这些过滤器,你可以按照日志级别范围过滤日志事件,或者按照某个特殊的字符串进行过滤。你可以在API的帮助文件中发现更多关于过滤器的信息。
CopyRight&2012- AllRight Reserved

我要回帖

更多关于 跟王者荣耀很像的 的文章

 

随机推荐