标签:style blog http io color ar 使用 sp strong
你是否在遇到程序运行问题时经常百度?你是否在遇到运行错误时经常去询问别人?如果有那么是时候改变啦,对于一个Developer来说那是不专业的表现,专业的Developer都会首先查看程序的运行日志,先从日志下手,分析问题发生的原因,然后修复它。这里面最重要的就是日志,那么你也就会很好奇,这些日志是如何记录的呢,偷偷的告诉你通常使用的是日志管理框架。那么是不是也想在开发程序时开发出一个日志管理的模块呢,不用着急下面就来介绍下如何做日志管理。从Log4net的API文档中不难看出,其实Log4net的开发过程还是蛮简单的,并没有想象中的那么复杂,而且在使用时只需要添加相应的配置节信息然后调用存储方法即可实现日志的存储,具体的结构如下图
上图显示了Log4net的主要由五个部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders,其中最主要的Appender命名空间中封装了日志的存储方式,也就是说通过配置Appender能够将日志输出到执行的类型中;Layout其实是封装了数据显示的格式,通过配置Layout能够输出指定模板的数据信息,它还可以控制数据的输出类型(输出xml还是文本类型);Object Renders很重要,它能够控制数据的自定义输出,log4net将会按照用户定义的标准输出日志。
log4net有多重存储级别,按照日志信息的情况大致分为了5类,它们分别是Error错误日志、Fatal严重错误日志、Info一般信息日志、Debug调试信息日志和Warn警告信息日志,在日志管理时可以按照日志的级别来考虑存放的方式,对于严重日志往往是系统的重大问题,此时可以考虑存到服务器数据库中,其它的一些日志可以考虑存储到文件中,可以提高服务器性能。接下来将会介绍它的几种使用方法。
把日志输出到数据库中也是很多系统经常使用的日志存储方法,在小数据量的处理过程中将日志保存到数据库中是可行的,但是如果需要处理的日志数据量较大那么这种存储方法就会降低数据库的性能,所以在存储日志时慎重使用这种方式,建议涉及到系统重大问题时采用此种存储方式,这样会提升数据库的性能。具体配置如下:
<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>
<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>
<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>
<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();
}
}
}
Note:代码中有这么一句:[assembly: log4net.Config.XmlConfigurator(Watch = true)](在需要使用log4net的类的namespace处),如果没有这句就会在调试时得到如下留言中所说的“程序调试起来时isDebugEnable"的情况。
<?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>
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"));
}
}
}
标签:style blog http io color ar 使用 sp strong
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/40649791