你是不是在遇到程序运行问题时常常百度?你是不是在遇到运行毛病时常常去询问他人?如果有那末是时候改变啦,对1个Developer来讲那是不专业的表现,专业的Developer都会首先查看程序的运行日志,先从日志下手,分析问题产生的缘由,然后修复它。这里面最重要的就是日志,那末你也就会很好奇,这些日志是如何记录的呢,偷偷的告知你通常使用的是日志管理框架。那末是否是也想在开发程序时开发出1个日志管理的模块呢,不用着急下面就来介绍下如何做日志管理。
就我所知现在日志管理框架有多种如 Enterprise、NLog、CLog、Log4net,其中Log4net功能强大适用于中大型的项目日志管理,NLog虽然功能较少但是它使用简单,而且支持智能感应,另外Enterprise更是强大的没的说,针对大型系统开发,固然使用也比较困难。但是斟酌到它们的使用资源及功能的强大,最后我们的项目肯定了使用Log4net,所以接下来将会主要讨论Log4net的主要使用方法。
1、Log4net组成及配置
从Log4net的API文档中不难看出,其实Log4net的开发进程还是蛮简单的,并没有想象中的那末复杂,而且在使用时只需要添加相应的配置节信息然后调用存储方法便可实现日志的存储,具体的结构以下图
1.1 组成详解
上图显示了Log4net的主要由5个部份组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders,其中最主要的Appender命名空间中封装了日志的存储方式,也就是说通过配置Appender能够将日志输出到履行的类型中;Layout实际上是封装了数据显示的格式,通过配置Layout能够输出指定模板的数据信息,它还可以控制数据的输出类型(输出xml还是文本类型);Object Renders很重要,它能够控制数据的自定义输出,log4net将会依照用户定义的标准输出日志。
1.2 配置方法
在使用log4net时首先需要配置日志存储方式,然后在代码中调用LogManager类的静态方法GetLog保存对象的对象的信息。其中配置信息可以写到config文件内,也能够自定义1个xml文档,把具体的配置节信息写到xml文件便可。
2、使用方法
log4net有多重存储级别,依照日志信息的情况大致分为了5类,它们分别是Error毛病日志、Fatal严重毛病日志、Info1般信息日志、Debug调试信息日志和Warn正告信息日志,在日志管理时可以依照日志的级别来斟酌寄存的方式,对严重日志常常是系统的重大问题,此时可以斟酌存到http://www.wfuyu.com/server/http://www.wfuyu.com/db/中,其它的1些日志可以斟酌存储到文件中,可以提高http://www.wfuyu.com/server/性能。接下来将会介绍它的几种使用方法。
2.1 日志输出到DataBase
把日志输出到http://www.wfuyu.com/db/中也是很多系统常常使用的日志存储方法,在小数据量的处理进程中将日志保存到http://www.wfuyu.com/db/中是可行的,但是如果需要处理的日志数据量较大那末这类存储方法就会下降http://www.wfuyu.com/db/的性能,所以在存储日志时慎重使用这类方式,建议触及到系统重大问题时采取此种存储方式,这样会提升http://www.wfuyu.com/db/的性能。具体配置以下:
<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>
另外初学者在写入http://www.wfuyu.com/db/时可能会有很多问题,最主要的是不能写入数据,这主要是由于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] %⑸level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<!--控制台控制显示日志-->
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
2.4 日志输出到Event
上面介绍了几种经常使用的输出方式,固然log4net还有更多的输出方式,这里再介绍1种输出到WindowsEvent的方法,这类方法将会把毛病信息输出到Windows事件中,虽然不常常使用,但也能够作为1种日志的存储方式。
<log4net>
<!--定义输出到windows事件中-->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %⑸level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--定义日志的输出媒介,下面定义日志以4种方式输出。也能够下面的依照1种类型或其他类型输出。-->
<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("产生了1个异常"));
//记录严重毛病
log.Fatal("fatal", new Exception("产生了1个致命毛病"));
//记录1般信息
log.Info("info");
//记录调试信息
log.Debug("debug");
//记录正告信息
log.Warn("warn");
Console.WriteLine("日志记录终了。");
Console.Read();
}
}
}
在测试时上面的所有情势的配置输出都可使用GetLogger方法来存贮存储日志信息。
Note:代码中有这么1句:[assembly: log4net.Config.XmlConfigurator(Watch = true)](在需要使用log4net的类的namespace处),如果没有这句就会在调试时得到以下留言中所说的“程序调试起来时isDebugEnable"的情况。
3、log4net保存NHibernate日志信息
在使用NHibernate经常常需要分析SQL语句,但是NHibernate默许的是不输出SQL Script的,那末怎样才能查看它生成的SQL呢?无妨使用下log4net吧,log4net可以输出NHibernate的运行情况,可以通过配置来实现输出所有Level的NHibernate的日志信息,具体的配置方法以下,这里将配置文件放到了外置的xml中。
<?xml version="1.0" encoding="utf⑻" ?>
<log4net debug="true">
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="D:loglog.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] %⑸p %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的配置信息放到了1个单独的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:CodeEtamETAMETAM_Webservice_T16_V1.1Datalog4net.cfg.xml"));
}
}
}
结语
log4net的日志存储功能很强大,它对日志信息做了详细的分类,总共划分为5类,在存储日志的时候可以根据情况来选择性的存储,并根据级别选择存储方式。另外类似的这类日志框架还有NLog、CLog等,可以根据具体的日志情况来选择使用日志存储的框架。