程序的记事本--log4net
你是否在遇到程序执行问题时常常百度?你是否在遇到执行错误时常常去询问别人?假设有那么是时候改变啦,对于一个Developer来说那是不专业的表现,专业的Developer都会首先查看程序的执行日志。先从日志下手。分析问题发生的原因,然后修复它。这里面最重要的就是日志,那么你也就会非常好奇,这些日志是怎样记录的呢,偷偷的告诉你通常使用的是日志管理框架。那么是不是也想在开发程序时开发出一个日志管理的模块呢,不用着急以下就来介绍下怎样做日志管理。
就我所知如今日志管理框架有多种如 Enterprise、NLog、CLog、Log4net。当中Log4net功能强大适用于中大型的项目日志管理,NLog尽管功能较少可是它使用简单,并且支持智能感应,另外Enterprise更是强大的没的说,针对于大型系统开发。当然使用也比較困难。可是考虑到它们的使用资源及功能的强大,最后我们的项目确定了使用Log4net,所以接下来将会主要讨论Log4net的主要用法。
一、Log4net组成及配置
从Log4net的API文档中不难看出,事实上Log4net的开发过程还是蛮简单的,并没有想象中的那么复杂,并且在使用时仅仅须要加入对应的配置节信息然后调用存储方法就可以实现日志的存储,详细的结构例如以下图
1.1 组成具体解释
上图显示了Log4net的主要由五个部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders,当中最基本的Appender命名空间中封装了日志的存储方式。也就是说通过配置Appender可以将日志输出到运行的类型中。Layout事实上是封装了数据显示的格式,通过配置Layout可以输出指定模板的数据信息,它还可以控制数据的输出类型(输出xml还是文本类型)。Object Renders非常重要,它可以控制数据的自己定义输出,log4net将会依照用户定义的标准输出日志。
1.2 配置方法
在使用log4net时首先须要配置日志存储方式,然后在代码中调用LogManager类的静态方法GetLog保存对象的对象的信息。
当中配置信息能够写到config文件内,也能够自己定义一个xml文档,把详细的配置节信息写到xml文件就可以。
二、用法
log4net有多重存储级别,依照日志信息的情况大致分为了5类,它们各自是Error错误日志、Fatal严重错误日志、Info一般信息日志、Debug调试信息日志和Warn警告信息日志,在日志管理时能够依照日志的级别来考虑存放的方式,对于严重日志往往是系统的重大问题,此时能够考虑存到server数据库中,其他的一些日志能够考虑存储到文件里,能够提高server性能。接下来将会介绍它的几种用法。
2.1 日志输出到DataBase
把日志输出到数据库中也是非常多系统常常使用的日志存储方法,在小数据量的处理过程中将日志保存到数据库中是可行的,可是假设须要处理的日志数据量较大那么这样的存储方法就会减少数据库的性能。所以在存储日志时谨慎使用这样的方式,建议涉及到系统重大问题时採用此种存储方式,这样会提升数据库的性能。
详细配置例如以下:
- <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
- <bufferSize value="1"></bufferSize>
- <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
- <connectionString value="Data Source=.;Initial Catalog=Test;Integrated Security=True;Pooling=False" />
- <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" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
- </parameter>
- <parameter>
- <parameterName value="@thread" />
- <dbType value="String" />
- <size value="255" />
- <layout type="log4net.Layout.PatternLayout" value="%thread" />
- </parameter>
- <parameter>
- <parameterName value="@log_level" />
- <dbType value="String" />
- <size value="50" />
- <layout type="log4net.Layout.PatternLayout" value="%level" />
- </parameter>
- <parameter>
- <parameterName value="@logger" />
- <dbType value="String" />
- <size value="255" />
- <layout type="log4net.Layout.PatternLayout" value="%logger" />
- </parameter>
- <parameter>
- <parameterName value="@message" />
- <dbType value="String" />
- <size value="4000" />
- <layout type="log4net.Layout.PatternLayout" value="%message" />
- </parameter>
- </appender>
另外刚開始学习的人在写入数据库时可能会有非常多问题,最基本的是不能写入数据,这主要是因为connectionType和connectionString的原因,要又一次检查改动才干够。尤其是connectionType中sqlconnection的版本号问题,假设不能成功写入数据往往就是它造成的。
2.2 日志输出到File
另外我们也能够将数据输出到文件里,用户能够自己定义文件输出的类型,通过datePattern标签来设置存储文件的类型及文件名称,详细例如以下配置所看到的:
- <log4net>
- <!--定义输出到文件里-->
- <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
- <file value="D:\" />
- <appendToFile value="true" />
- <rollingStyle value="Date" />
- <maxSizeRollBackups value="30" />
- <datePattern value="yyyy-MM-dd'.log'" />
- <staticLogFileName value="false" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="{%level}%date{MM/dd HH:mm:ss} - %message%newline" />
- </layout>
- </appender>
- <root>
- <!--文件形式记录日志-->
- <appender-ref ref="RollingLogFileAppender" />
- </root>
- </log4net>
此种方式在指定的文件夹下创建指定的文件,并将日志信息写入创建的文件里。
2.3 日志输出到Console
输出到控制台中已经不陌生,在windows操作系统中常常可以看到错误信息,这样的方式可以非常直观的告诉用户错误的情况及原因,可是这样的方式仅仅是缓存级别的。系统又一次启动时错误信息就会被删除,所以在使用此种方法时应配合着上面说到的方法来综合存储日志,增强系统的健壮性。
- <log4net>
- <!--定义输出到控制台命令行中-->
- <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
- <root>
- <!--控制台控制显示日志-->
- <appender-ref ref="ConsoleAppender" />
- </root>
- </log4net>
2.4 日志输出到Event
上面介绍了几种经常使用的输出方式,当然log4net还有很多其它的输出方式,这里再介绍一种输出到WindowsEvent的方法。这样的方法将会把错误信息输出到Windows事件中,尽管不经常使用,但也能够作为一种日志的存储方式。
- <log4net>
- <!--定义输出到windows事件中-->
- <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
- <!--定义日志的输出媒介。以下定义日志以四种方式输出。也能够以下的依照一种类型或其它类型输出。-->
- <root>
- <!--Windows事件日志-->
- <appender-ref ref="EventLogAppender" />
- </root>
- </log4net>
通过使用上面的配置文件可以将日志输出到指定的类型中,可是想要输出日志并不仅仅是使用上面的配置,另外须要在代码中调用方法来记录日志,详细例如以下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- using log4net;
- using log4net.Appender;
- [assembly: log4net.Config.XmlConfigurator(Watch = true)]
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- ILog log = log4net.LogManager.GetLogger(typeof(Program));
- //记录错误日志
- log.Error("error", new Exception("发生了一个异常"));
- //记录严重错误
- log.Fatal("fatal", new Exception("发生了一个致命错误"));
- //记录一般信息
- log.Info("info");
- //记录调试信息
- log.Debug("debug");
- //记录警告信息
- log.Warn("warn");
- Console.WriteLine("日志记录完成。");
- Console.Read();
- }
- }
- }
在測试时上面的全部形式的配置输出都能够使用GetLogger方法来存储存储日志信息。
Note:代码中有这么一句:[assembly: log4net.Config.XmlConfigurator(Watch = true)](在须要使用log4net的类的namespace处)。假设没有这句就会在调试时得到例如以下留言中所说的“程序调试起来时isDebugEnable"的情况。
三、log4net保存NHibernate日志信息
在使用NHibernate时经常须要分析SQL语句,可是NHibernate默认的是不输出SQL Script的。那么如何才干查看它生成的SQL呢?最好还是使用下log4net吧。log4net能够输出NHibernate的执行情况,能够通过配置来实现输出全部Level的NHibernate的日志信息,详细的配置方法例如以下,这里将配置文件放到了外置的xml中。
- <?xml version="1.0" encoding="utf-8" ?>
- <log4net debug="true">
- <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
- <param name="File" value="D:\log\log.txt"/>
- <param name="AppendToFile" value="false"/>
- <param name="RollingStyle" value="Date"/>
- <param name="StaticLogFileName" value="true"/>
- <layout type="log4net.Layout.PatternLayout">
- <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
- </layout>
- </appender>
- <logger name="NHibernate" additivity="true">
- <level value="ERROR"/>
- <appender-ref ref="DebugAppender" />
- </logger>
- <logger name="NHibernate.SQL" additivity="true">
- <level value="DEBUG"/>
- <appender-ref ref="DebugAppender" />
- </logger>
- <logger name="NHibernate.AdoNet.AbstractBatcher" additivity="true">
- <level value="DEBUG"/>
- <appender-ref ref="DebugAppender" />
- </logger>
- <root>
- <!-- levels: DEBUG, INFO, WARN, ERROR, FATAL -->
- <level value="DEBUG"/>
- <level value="INFO"/>
- <level value="WARN"/>
- <level value="ERROR"/>
- <level value="FATAL "/>
- <appender-ref ref="rollingFile"/>
- </root>
- </log4net>
这里将log4net的配置信息放到了一个单独的xml文件里。所以须要在执行时将配置信息加入到log4net的配置类中,它的配置往往在Global文件的Application_Start事件中加入配置,例如以下代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Security;
- using System.Web.SessionState;
- using Medici.Etam.Data.NHibernateSessionManagement;
- using NHibernate;
- using NHibernate.Context;
- namespace Medici.Etam.WebService
- {
- public class Global : System.Web.HttpApplication
- {
- private static log4net.ILog logger = log4net.LogManager.GetLogger("Logger");
- protected void Application_Start(object sender, EventArgs e)
- {
- //if the log4net is a lone file then it should be config
- log4net.XmlConfigurator.Configure(new FileInfo("D:\\Code\\Etam\\ETAM\\ETAM_Webservice_T16_V1.1\\Data\\log4net.cfg.xml"));
- }
- }
- }
结语
程序的记事本--log4net的更多相关文章
- 编写运行最简单的java程序——使用记事本编写java程序
第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还没有搭建环境变量的小伙伴请转移到上一篇的随笔中去完成搭建. ...
- JAVA/GUI程序之记事本
自上半年JAVA课程结束后,再也没有看过JAVA了,最近不是很忙,又简单的看了看,本博客纯属记录学习过程,请大神们别笑,其中错误是难免的,毕竟是新手写的博客.下面就进入我们的正题吧,复习GUI时,就想 ...
- Nuget程序包 使用log4net
Nuget程序包不用细介绍,网上资源很多,有个项目使用了log4net,为项目打log,功能很多,足够一般使用. 使用时候需要在配置文件中对其进行相关配置,我自己的配置文件放在App.config文件 ...
- [c/c++] programming之路(1)、编写程序打开记事本、计算器等
一.命令行启动程序 通过命令行关闭程序:taskkill /f /im 程序名.exe 二.打开记事本.计算器 #include <stdlib.h> void main(){ syste ...
- 在c#客户端程序中使用log4net
为什么使用log4net 有些日志语句只是在开发中用于调试的,不应该在Release版本中输出,log4net通过配置文件可以为Debug和Release不同的模式设置不同的输出级别来控制,而且如果已 ...
- 12-18Windows窗体应用小程序之记事本(1)
一.记事本制作(1) C#结合窗体制作小程序,相比较之前的控制台应用程序可能要改善了好多,最起码界面看起来可以高仿一下了,但是最重要的还是要看其里面的功能是否实现.所以,要以实现其实用功能为主.今天利 ...
- 12-19Windows窗体应用程序之记事本(2)
之前记事本的功能实现了“文件”和“编辑”中的功能操作,现在再继续下面的功能介绍: 3) <1>字体设置 [查看代码] [效果图] <2>字体颜色的设置 [查看代码] [效果图] ...
- 微信小程序入门---记事本增---删
第一.如何获取input框的值(form表单提交除外) bindinput事件 <input type='text' placeholder="请输入内容" placehol ...
- 使用Common.Logging+log4net规范日志管理
Common.Logging+(log4net/NLog/) common logging是一个通用日志接口,log4net是一个强大的具体实现,也可以用其它不同的实现,如EntLib的日志.NLog ...
随机推荐
- iOS使用CoreData实现收藏功能
一般做收藏都是使用数据库或者归档,使用CoreData实现收藏功能就是没事时练一下,实现大概和数据库差不多. 首先创建一个工具类继承NSObject,在里面实现所需要的方法. 工具类的.h文件: ty ...
- html5页面中 触发 拨打电话、发短信 的方式
<a href="tel:18688888888">拨号</a> <a href="sms:18688888888">发短信 ...
- PHP超全局变量$_ENV详解,及$_ENV为空的可能原因
PHP中的$_ENV存储了一些系统的环境变量,因为牵扯到实际的操作系统,所以不可能给出$_ENV的完整列表. $_ENV为空的可能原因: 你的php.ini的variables_order值为&qu ...
- SQL Server 事务隔离级别的解析
近来在项目中遇到的一些有关事务的问题,跟同事间讨论了一下,后面翻看了一些书籍和做了一些测试,趁有点时间把它写下来,一来加深印象,二来希望对大家有所帮助,当然,由于自身水平问题,如理解有误,还请大牛指出 ...
- 可用性的维度(5E)
可用性的维度 当我检查可用性文献时,我发现可用软件包含如用户友好.易学.可发现性.质量.有用的和阻止错误.在可用性工程中, Jakob Nielsen给出一个产品的五个属性:易学性.效率.可记忆性.容 ...
- VBA数组
基础用法,这篇写的不错:https://www.cnblogs.com/wuzhiblog/p/7137578.html
- http://blog.sina.com.cn/s/blog_628cc2b70102v115.html
http://blog.sina.com.cn/s/blog_628cc2b70102v115.html
- HDU 4008 Parent and son LCA+树形dp
题意: 给定case数 给定n个点的树,m个询问 以下n-1行给出树边 m个询问 x y 问:以x为根.y子树下 y的最小点标的儿子节点 和子孙节点 思路: 用son[u][0] 表示u的最小儿子 s ...
- Node.js 使用爬虫批量下载网络图片到本地
图片网站往往广告众多,用Node.js写个爬虫下载图片,代码不长,省事不少,比手动一张张保存简直是天与地的区别.以前用Java也做过远程图片下载,但Node.js的下载速度更让人咂舌,这也是非阻塞式变 ...
- android环境部署(1)
1.首先是eclipse(现在拿eclipse-standard-kepler-SR1-win32做实验): 下载地址:http://www.eclipse.org/downloads/downloa ...