程序的记事本--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 ...
随机推荐
- mysql用unix时间戳统计一个日期段的数据
select DATE_FORMAT(FROM_UNIXTIME(date),'%Y-%m-%d') as d, count(*) as c from tb where (FROM_UNIXTIME( ...
- VMware三种网络模式组网(转)
VMware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式). 打开VMware虚拟机,我们可以在选项栏的“编辑”下的 ...
- [ubuntu Setup] ubuntu 14.10 安装 JDK
from : http://www.cnblogs.com/plinx/archive/2013/06/01/3113106.html 1.到 Sun 的官网下载 http://www.oracle ...
- C++游戏界面不流畅的问题
或许是我游戏玩多了,我突然发现,我的C++程序画面画面一顿一顿的,不流畅.肯定哪里不正确,要改. 奇怪啊,为什么我曾经,在我电脑上就不这么卡,就看不出画面一顿一顿的呢? 百度了,狗狗了,必应了,然而, ...
- 深入理解JS函数作用域链与闭包问题
function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.f ...
- 【HTTPS双向加密认证】
HTTPS单向认证和双向认证 nearzk-osc 发布时间: 2015/07/30 15:27 阅读: 4177 收藏: 178 点赞: 6 评论: 3 一.背景&概念 HTTPS:在htt ...
- vue2 生命周期
转:https://segmentfault.com/a/1190000008570622 生命周期先上图 什么是生命周期 Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载 ...
- HTML5游戏探讨,怎样让微信游戏仅仅能执行在微信中
大致文件布局例如以下.一个html文件.一个loading.js,在loading.js中载入其它须要的js和css. 至于详细的速度的话.建议cdn或者一个域中最多载入6个js文件.在loading ...
- Selenium webdriver Java firefox 路径设置问题
问题: Cannot find firefox binary in PATH. Make sure firefox is installed. 原因:selenium找不到Firefox浏览器. 方法 ...
- 一张图片教会你写mysql 语句
MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...