你是否在遇到程序执行问题时常常百度?你是否在遇到执行错误时常常去询问别人?假设有那么是时候改变啦。对于一个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 configlog4net.XmlConfigurator.Configure(new FileInfo("D:\\Code\\Etam\\ETAM\\ETAM_Webservice_T16_V1.1\\Data\\log4net.cfg.xml"));        }}
}

结语

    log4net的日志存储功能非常强大,它对日志信息做了具体的分类,总共划分为5类。在存储日志的时候能够依据情况来选择性的存储,并依据级别选择存储方式。另外类似的这样的日志框架还有NLog、CLog等,能够依据具体的日志情况来选择使用日志存储的框架。

程序的记事本--log4net相关推荐

  1. 编写运行最简单的java程序——使用记事本编写java程序

    编写运行最简单的java程序--使用记事本编写java程序 第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还 ...

  2. Java小程序之记事本

    这个记事本只做了个界面,里面的功能就做了三四个吧!特别适合新手学做GUI这一章. 我主要分了两大类,代码注释上面都有. 第一大类我主要把用到的所有组件全部定义了出来,这样看起来更方便一点 第二大类就是 ...

  3. 在.Net程序中使用log4net记录日志(示例)

    log4j是java开发人员所熟悉,他提供了强大的日志记录功能,log4net是为.Net记录日志开发的.使用示例如下(C#): 1.app.config文件 <?xml version=&qu ...

  4. python文本菜单程序_从〇到一: Python GUI 程序:记事本

    本示例程序 mynote.pyw 实现了一个简易的记事本,可以像 Windows 系统自带的记事本一样编辑文本文件.程序使用的可视化部件有菜单(Menu).带滚动条的文本区(ScrolledText) ...

  5. 微信小程序仿记事本,带下划线,自动换行,高度自增

    最近在学习微信小程序,要做一个仿记事本,带下划线且能自动换行 一开始想用input添加border,加js来实现,但是很麻烦,后面将所有文字累加成字符串以及自动换行都不好做. 后来决定用textare ...

  6. 微信小程序之记事本管理系统(含源码+论文+答辩PPT等)

    项目功能简介: 该项目含有源码等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序做的记事本前台和Java做的后台管理系统: 微信小程序--记事本前台涉及技术:WXML 和 WXS ...

  7. java 记事本界面_JAVA/GUI程序之记事本

    自上半年JAVA课程结束后,再也没有看过JAVA了,最近不是很忙,又简单的看了看,本博客纯属记录学习过程,请大神们别笑,其中错误是难免的,毕竟是新手写的博客.下面就进入我们的正题吧,复习GUI时,就想 ...

  8. 仿QQ尾巴,让程序给记事本输入文字!:)

    效果截图如下: 程序主要代码如下: void CSendMessageNotepadDlg::OnBnClickedBtnsend() //发送按钮单击处理函数 {    HWND hParent=N ...

  9. linux 记事本程序,Linux记事本操作

    Linux记事本操作 vi编辑器模式 编辑模式下面显示:- -INSERT- - 命令模式下面显示:(默认什么都不显示) 尾行模式下面显示::wq(退出并保存) 进入编辑模式 a: 光标向后移动一位 ...

最新文章

  1. Matlab实现图像边缘检测
  2. 慕课网 深入浅出javascript 笔记
  3. python网络编程
  4. cms php vue 开源_骑士CMS文件包含+getshell
  5. UVa573 The Snail
  6. C语言-线性表基本操作之单链表
  7. QT的QHash类的使用
  8. Windows如何安装MSMQ消息队列
  9. linux下运行程序后出现段错误的原因和解决案例
  10. 【转】Java杂谈(八)--Servlet/Jsp
  11. Flutter之Visibility和Opacity使用说明
  12. matlab着重标出某个点,MATLAB与数学实验讲义资料.doc
  13. 【设计师配色宝典!教你从零开始学配色】转
  14. 在mac上开启httpServer服务
  15. 乐学python靠谱吗_【乐学100】-乐学100怎么样|地址|成立时间-比网校
  16. Windows用户远程访问内网共享文件(免费内网穿透)
  17. QWidget->isVisible属性的探究
  18. 怎么看台式计算机内存条,内存频率怎么看 教你怎么看内存条频率
  19. mysql如何减少主从复制延迟?
  20. 【Django毕业设计源码】Python考试题库练习系统

热门文章

  1. python isnumeric函数用法_Python中isnumeric()方法的使用简介
  2. windows xcopy
  3. Formik官方应用案例解析( 五)React Native
  4. android 后台Activity移到前台
  5. mysql之 mysql 5.6不停机主主搭建(活跃双主基于日志点复制)
  6. 一个重复try语句的实验
  7. mysql集群之MMM简单搭建
  8. SQL语句练习(三)
  9. 从此不再为Web页面中的Tooltip烦恼
  10. 右左法则----复杂指针解析