Log4net日志组件
一?Log4net简介 ??? Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是2001年7月由NeoWorks?Limited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4j。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,比不同的样式,将日志输出到不同的媒介。 ??? Log4net可以从http://logging.apache.org/log4net/download.html网站下载最新版本。
? 二?Log4net核心组成 ??? Log4net主要由五个部分组成,分别为Logger,Appenders,?Filters,?Layouts?和Object?Renders。 一)?Logger(日志) 1.?记录日志的分类: Log4net能够以多种方式输出日志。支持的日志输出常用的主要媒介有数据库(包括MS?SQL?Server,?Access,?Oracle9i,Oracle8i,DB2,SQLite,控制台,文件,事件日志(可以用事件查看器查看)和邮件等多种方式。 2.?日志的级别 Log4net支持多种级别的日志。优先级从高到低依次排列如下: FATAL?>?ERROR?>?WARN?>?INFO?>?DEBUG 此外还有ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求)这两种特殊的级别。 二)Appenders Appenders决定日志输出的方式。 Appenders必须实现log4net.Appenders.IAppender接口。 Log4net目前支持的输出方式包括: 2?AnsiColorTerminalAppender 3?AspNetTraceAppender 4?BufferingForwardingAppender 5?ConsoleAppender 6?EventLogAppender 7?FileAppender 8?LocalSyslogAppender 10?NetSendAppender 11?RemoteSyslogAppender 12?RemotingAppender 13?RollingFileAppender 14?SmtpAppender 15?TraceAppender 16?UdpAppender 三)Filters Appender对象将日志以缺省的方式传到输出流,然后Filter可以按照不同的标准控制日志的输出。Filter可以再配置文件中配置。最简单的形式是在appender中写明一个Threshold.这样只有级别大于或等于此Threshold的日志才被记录。 Filters必须实现log4net.Filters.IFilter接口。 四)Layouts Layouts控制日志显示的格式样式。日志的显示格式如下: "%timestamp?[%thread]?%-5level?%logger?-?%message%newline" Timestamp:?表示程序已经开始执行的时间。?单位[毫秒]。 Thread:执行当前代码的线程。 Level:日志的级别。 Logger:日志相关请求的名称。 Message: 日志消息。 Layouts还可以控制日志的输出样式,比如以普通形式或以xml等形式输出。 五)Object?Renderers 这是很重要的一项,log4net将按照用户定义的标准输出日志消息。 Object?Renders必须实现log4net.ObjectRenderer.IObjectRenerer接口。 ? 三?如何在项目中使用log4net
1.??????? 添加Log4net.dll应用 ① 用VS打开项目,在其资源管理器中,右击引用,左击"添加引用",如下图所示? ② 出现下图所示的对话框,点击浏览,找到Log4net.dll文件所在的位置,然后点击确定。? ③ 在资源管理器的引用文件夹下,就可以看到Log4net了,说明添加引用成功,如下图所示。 ? 2.?????? 新建配置文件,并命名为“log4net.config”。 l???????? 配置log4net.config文件: <?xml version="1.0" encoding="utf-8"?> <configuration> ? <!--日志配置部分--> ? <configSections> ??? <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> ? </configSections> ? <!--站点日志配置部分--> ? <log4net> ??? <!-- Setup the root category,add the appenders and set the default level --> ??? <root> ????? <level value="ALL"/> ????? <appender-ref ref="ADONetAppender_SqlServer"/> ????? <appender-ref ref="RollingLogFileAppender"/> ????? <appender-ref ref="EventLogAppender"></appender-ref> ????? <appender-ref ref="AdoNetAppender_Access"></appender-ref> ????? <appender-ref ref="ColoredConsoleAppender"></appender-ref> ????? <appender-ref ref="FileAppender"></appender-ref> ??? </root> ??? <logger name="startLog"> ????? <level value="ALL"/> ????? <appender-ref ref="RollingLogFileAppender"/> ????? <appender-ref ref="ADONetAppender_SqlServer"/> ??? </logger> ??? <!--写入到数据库--> ??? <appender name="ADONetAppender_SqlServer" 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=./SQLEXPRESS;UID=log;PWD=log;DataBase=db_log;Max Pool Size=1000"/> ????? <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date,@thread,@log_level,@logger,@message)"/> ????? <parameter> ??????? <parameterName value="@log_date"/> ??????? <dbType value="DateTime"/> ??????? <!-- ??????????????? <layout type="log4net.Layout.PatternLayout"> ??????????????????? <conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" /> ??????????????? </layout> ??????????????? --> ??????? <layout type="log4net.Layout.RawTimeStampLayout"/> ????? </parameter> ????? <parameter> ??????? <parameterName value="@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="@logger"/> ??????? <dbType value="String"/> ? ??????<size value="255"/> ??????? <layout type="log4net.Layout.PatternLayout"> ????????? <conversionPattern value="%logger"/> ??????? </layout> ????? </parameter> ????? <parameter> ??????? <parameterName value="@message"/> ??????? <dbType value="String"/> ??????? <size value="4000"/> ??????? <layout type="log4net.Layout.PatternLayout"> ????????? <conversionPattern value="%message"/> ??????? </layout> ????? </parameter> ??? </appender> ??? <!--写入到文件--> ??? <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> ????? <file value="log/log-file.txt"/> ????? <!--<file name="Client.Logging" value="log/log" />--> ????? <file value="log/log" /> ????? <!--是否覆盖--> ????? <appendToFile value="true"/> ????? <!--设置无限备份=-1 ,最大备份数为1000--> ???? ?<maxSizeRollBackups value="1000"/> ????? <!--每个文件的最大20k--> ????? <maximumFileSize value="20"/> ????? <!--名称是否可以更改 为false为可以更改--> ????? <param name="StaticLogFileName" value="false" /> ????? <!--文件名称--> ????? <param name="DatePattern" value="yyyyMMdd".txt"" /> ????? <param name="RollingStyle" value="Composite" /> ????? <!--<param name="RollingStyle" value="Composite" />--> ????? <layout type="log4net.Layout.PatternLayout"> ??????? <param name="ConversionPattern" value="%d [%r] [%t] %-5p %c? - %m%n%n" /> ????? </layout> ??? </appender> ??? <!--写入到操作系统--> ??? <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> ????? <layout type="log4net.Layout.PatternLayout"> ??????? <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/> ????? </layout> ??? </appender> ??? <!--写入到access--> ??? <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> ????? <bufferSize value="1" /> ????? <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D://工作目录//代码//Demo//LogDemo//db//access.mdb;User Id=;Password=;" /> ????? <commandText value="INSERT INTO Log ([Date],@message)" /> ????? <parameter> ??????? <parameterName value="@log_date" /> ??????? <dbType value="String" /> ??????? <size value="255" /> ??????? <layout type="log4net.Layout.PatternLayout"> ????????? <conversionPattern value="%date" /> ??????? </layout> ????? </parameter> ????? <parameter> ??????? <parameterName value="@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="@logger" /> ??????? <dbType value="String" /> ??????? <size value="255" /> ??????? <layout type="log4net.Layout.PatternLayout"> ????????? <conversionPattern value="%logger" /> ??????? </layout> ????? </parameter> ????? <parameter> ??????? <parameterName value="@message" /> ??????? <dbType value="String" /> ??????? <size value="1024" /> ??????? <layout type="log4net.Layout.PatternLayout"> ????????? <conversionPattern value="%message" /> ??????? </layout> ????? </parameter> ??? </appender> ??? <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> ????? <mapping> ??????? <level value="ALL" /> ??????? <foreColor value="White" /> ??????? <backColor value="Red,HighIntensity" /> ????? </mapping> ????? <layout type="log4net.Layout.PatternLayout"> ??????? <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> ????? </layout> ??? </appender> ??? <!--写入到文件,是累加,不生成新的文件--> ??? <appender name="FileAppender" type="log4net.Appender.FileAppender"> ????? <file value="log/log-file.txt" /> ????? <appendToFile value="false" /> ????? <layout type="log4net.Layout.PatternLayout"> ??????? <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> ????? </layout> ??? </appender> ? </log4net> ? <system.web> ??? <!-- ??????????? 设置 compilation debug="true" 将调试符号插入 ??????????? 已编译的页面中。但由于这会 ??????????? 影响性能,因此只在开发过程中将此值 ??????????? 设置为 true。 ??????? --> ??? <compilation debug="true"/> ??? <!-- ??????????? 通过 <authentication> 节可以配置 ASP.NET 使用的 ??????????? 安全身份验证模式, ??????????? 以标识传入的用户。 ??????? --> ??? <authentication mode="Windows"/> ??? <!-- ??????????? 如果在执行请求的过程中出现未处理的错误, ??????????? 则通过 <customErrors> 节可以配置相应的处理步骤。具体说来, ??????????? 开发人员通过该节可以配置 ??????????? 要显示的 html 错误页 ??????????? 以代替错误堆栈跟踪。 ? ??????? <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> ??????????? <error statusCode="403" redirect="NoAccess.htm" /> ??????????? <error statusCode="404" redirect="FileNotFound.htm" /> ??????? </customErrors> ??????? --> ? </system.web> </configuration> ? 说明: (1)标签configSections中是对下面标签log4net的声明 (2)logger是应用程序需要交互的主要组件,它用来产生日志消息。其中的level是日志的级别,我们可以用到的有五级——FATAL、EROR、WARN、INFO、DEBUG(优先级别由高到低),在日志中记录的是高于(含等于)此处记录的日志级别的信息(如程序中如果调用的是DEBUG将不被记录);appender-ref是对appender的声明。 (3)appender用来所有的日志事件传递到输出流 ? 3.?????? 添加服务器端方法。 l???????? 在文件AssemblyInfo.cs下面加入 [assembly:log4net.Config.XmlConfigurator(ConfigFile="log4net.config",Watch=true)]?。 这段代码的作用是将程序与上面的配置文件关联起来。 如果是winform程序,代码如下: [assembly:log4net.Config.XmlConfigurator(ConfigFileExtension="config",Watch=true)] 如果是网站: ?????? 在global.asax里面新增配置 ?????? void Application_Start(object sender,EventArgs e) ??? ?????? { ??????? ?????? // 在应用程序启动时运行的代码 ??????? ?????? log4net.Config.XmlConfigurator.Configure(); ??? ?????? } l???????? 你就可以通过实现ILog接口去创建日志对象,然后调用相应的方法对日志进行操作。 l???????? 实例: ?????? 引入命名空间:using log4net; ? ??????????protected void Page_Load(object sender,EventArgs e) ????? ??????{ ???????????????? ILog log = LogManager.GetLogger("startLog");//此处要与配置文件中的logger //的名字相同,这里常用来跟踪类,因此常以typeof(className)作为参数 ???????? ????????log.Info("hello world!"); ??????????? } l???????? logger的方法。 ????????? log.Debug("debug"); //logger的方法,与上面提到的五个级别相对应,这里的参数是object类型 ????????? log.Info("info"); ????????? log.Warn("warn"); ????????? log.Error("error"); 以上代码加入相应的位置就可以了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |