log4net是一个开源日志记录组件。
利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。
我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。
log4net
有四种主要的组件,分别是
Logger
(记录器)
, Repository
(库)
, Appender
(附着器)以及
Layout
(布局)。
Logger
是应用程序需要交互的主要组件,它用来产生日志消息。
Repository主要用于负责用户对象组织结构的维护。
Appendder定义目的地的输出介质。一个日志对象可以包含很多个Appendder,对每个Appendder通过设置参数进行不同的配置。
Layout用于向用户显式最后经过格式化的输出消息。一个Appendder实现一个layout。
定义配置文件
(1)在log4net配置文件中进行定义
(2)在应用程序中进行动态配置
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<appSettings>
</appSettings>
<log4net>
<root>
<!-- 这里可省略日志输出级别,分别在不通的输出介质中定义-->
<!--文件形式记录日志 -->
<appender-ref ref="RollingFileAppender" />
<!--控制台控制显示日志-->
<appender-ref ref="ConsoleAppender" />
<!--Windows事件日志-->
<appender-ref ref="EventLogAppender" />
<!--数据库事件日志-->
<appender-ref
ref="AdoNetAppender" />
</root>
<!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
<!--定义输出到文件中-->
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--定义文件存放位置-->
<file value="..\\..\\Output\\log\\" />
<!--是否在文件中追加日志信息-->
<appendToFile value="true" />
<!--如果一直输出到同一文件中,则不需要下面代码-->
<!--文件输出以日期方式滚动-->
<rollingStyle value="Date" />
<!--日志文件名称以输出日期命名,可更改其他日期输出方式-->
<datePattern value="yyyyMMdd'.log'" />
<!--表明输出的日志信息是否一直在同一文件中-->
<staticLogFileName value="false"/>
<!--备份文件的最大文件数目-->
<maxSizeRollBackups value="10" />
<!--输出格式-->
<layout type="log4net.Layout.PatternLayout">
<footer value="this log write by UIH use Log4Net"/>
<conversionPattern value="�te >> %-5level %message%newline" />
</layout>
<!--日志输出级别-->
<threshold value="ALL"/>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ALL" />
<levelMax value="FATAL" />
</filter>
</appender>
<!--定义输出到控制台命令行中-->
<appender name="ConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n�te >> %-5level %message%newline" />
</layout>
<!--针对不同的输出级别显示不同的颜色-->
<mapping>
<level value="FATAL" />
<foreColor value="Red" />
<backColor value="White" />
</mapping>
<mapping>
<level value="ERROR" />
<foreColor value="Red, HighIntensity" />
</mapping>
<!--日志输出级别-->
<threshold value="ALL"/>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ALL" />
<levelMax value="FATAL" />
</filter>
</appender>
<!--定义输出到windows事件中-->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n�te >> %-5level thread: %thread, %message%newline" />
</layout>
<threshold value="ERROR"/>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<!--设置数据库输出的最小数量,建议设为1 ,若设为n,表示小于n条记录不输出到数据库-->
<bufferSize value="1" />
<ConnectionType value = "System.Data.SqlClient.SqlConnection, System.Data, version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<ConnectionString value = "data source=服务器名;initial catalog=数据库名;User ID=用户名;Password=密码;integrated security=false;persist security info=True;">
<!--插入数据库的字段,item为字段名-->
<commandText value="INSERT INTO pacs_log ([dtDate],[ThreadID],[Level],[Logger],[Message],[Exception]) VALUES (@item1, @item2, @item3)" />
<!--分级输出-->
<!--定义各个参数-->
<parameter>
<parameterName value="@item1" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<parameter>
<parameterName value="@item2" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@item3" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<threshold value="ERROR"/>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
</log4net>
举例说明:
AdoNetAppender中的ConnectionType,ConnectionString在程序中动态设置,如下
log4net.Repository.Hierarchy.Hierarchy hier = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy;
if (hier != null)
{
//get ADONetAppender
log4net.Appender.IAppender[] appendders = hier.GetAppenders();
foreach (var appender in appendders)
{
if (appender is log4net.Appender.AdoNetAppender)
{
log4net.Appender.AdoNetAppender adoAppender = (log4net.Appender.AdoNetAppender)appender;
adoAppender.ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data, version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
adoAppender.ConnectionString = "data source=uih-pacs\\uihpacs;initial catalog=uihpacsdb;User ID=sa;Password=uihpacs2012;integrated security=false;persist security info=True;";
adoAppender.ActivateOptions();
}
}
(1)在配置文件中的定义基本设置如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--定义输出到数据库中,本例以sqlServer为例-->
</configuration>
(2)在应用程序中进行动态配置