log4net的简单使用之二_log4net应用
1.Logger
所有的记录器都必须实现 ILog 接口,该接口提供日志记录所需的大量方法。
public interface ILog : ILoggerWrapper
{
void Debug(...);
void Error(...);
void Fatal(...);
void Info(...);
void Warn(...);
bool IsDebugEnabled { get; }
bool IsErrorEnabled { get; }
bool IsFatalEnabled { get; }
bool IsInfoEnabled { get; }
bool IsWarnEnabled { get; }
}
通常情况下,我们通过 LogManager.GetLogger() 来获取一个记录器。LogManager 内部维护一个 hashtable,保存新创建 Logger 引用,下次需要时直接从 hashtable 获取其实例。
ILog log = LogManager.GetLogger(this.GetType());
log.Debug("aaaaaaaaaaaaaaa");
所有 Logger 的参数设置都直接或间接继承自 root,其继承关系类似 namespace。比如,名为 "MyLogger.X.Y" 参数设置继承自 "MyLogger.X"。当我们创建 "MyLooger.X.Y" 记录器时,会在配置文件找该名称的记录器设置,如果没找到,则按继承关系向上查找,直到 root。因此,在创建 Logger 时,我们通常使用类型名称做为记录器的名字,缺省情况下,它会使用 root 或某一个父配置,但在需要的时候,我们随时可以为具体的类型添加一个更加 "详细" 的配置。 <?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?> 2
 <log4net>
<log4net>3
 <appender name="Console" type="log4net.Appender.ConsoleAppender">
  <appender name="Console" type="log4net.Appender.ConsoleAppender">4
 <layout type="log4net.Layout.PatternLayout">
    <layout type="log4net.Layout.PatternLayout">5
 <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
      <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />6
 </layout>
    </layout>7
 </appender>
  </appender>8

9
 <logger name="Learn.Library.Log4netTest">
  <logger name="Learn.Library.Log4netTest">10
 <level value="ALL" />
    <level value="ALL" />11
 </logger>
  </logger>12

13
 <root>
  <root>14
 <level value="OFF" />
    <level value="OFF" />15
 <appender-ref ref="Console" />
    <appender-ref ref="Console" />16
 </root>
  </root>17
 </log4net>
</log4net>18

"appender-ref" 参数用于绑定一个或多个具体的 Appender。
 <?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>2
 <log4net>
<log4net>3
 <appender name="Console" type="log4net.Appender.ConsoleAppender">
  <appender name="Console" type="log4net.Appender.ConsoleAppender">4
 </appender>
  </appender>5

6
 <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">7
 </appender>
  </appender>8

9
 <root>
  <root>10
 <level value="DEBUG" />
    <level value="DEBUG" />11
 <appender-ref ref="Console" />
    <appender-ref ref="Console" />12
 <appender-ref ref="RollingFile" />
    <appender-ref ref="RollingFile" />13
 </root>
  </root>14
 </log4net>
</log4net>15

2 Appender / Layout
Log4net 提供了大量的 Appender,最常用的包括 AdoNetAppender、AspNetTraceAppender、ConsoleAppender、FileAppender、OutputDebugStringAppender。每种 Appender 都有特定一些参数,使用时直接从《Log4net 手册》的示例中拷贝过去,就OK了。(代码摘自 Log4net 手册)
(1) AspNetTraceAppender
 <appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >
<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >2
 <layout type="log4net.Layout.PatternLayout">
  <layout type="log4net.Layout.PatternLayout">3
 <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />4
 </layout>
  </layout>5
 </appender>
</appender>6

 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">2
 <layout type="log4net.Layout.PatternLayout">
  <layout type="log4net.Layout.PatternLayout">3
 <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />4
 </layout>
  </layout>5
 </appender>
</appender>6

 <appender name="FileAppender" type="log4net.Appender.FileAppender">
<appender name="FileAppender" type="log4net.Appender.FileAppender">2
 <file value="log-file.txt" />
  <file value="log-file.txt" />3
 <appendToFile value="true" />
  <appendToFile value="true" />4
 <layout type="log4net.Layout.PatternLayout">
  <layout type="log4net.Layout.PatternLayout">5
 <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />6
 </layout>
  </layout>7
 </appender>
</appender>8

有关 Layout 详细信息,请参考 Log4net 相关文档,本文不做详述。
3. Configuration
Log4net 的配置方式十分灵活,即可以写到应用程序配置文件中,也可以使用独立配置文件。同时它还提供了监测配置文件变化的功能,这样我们随时可以调整配置,而无须重启应用程序。
(1) 使用 app.config / web.config
配置app.config / web.config文件
 <?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>2
 <!--
<!-- 3
 注意: 除了手动编辑此文件以外,您还可以使用
    注意: 除了手动编辑此文件以外,您还可以使用 4
 Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
    Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的5
 “网站”->“Asp.Net 配置”选项。
     “网站”->“Asp.Net 配置”选项。6
 设置和注释的完整列表在
    设置和注释的完整列表在 7
 machine.config.comments 中,该文件通常位于
    machine.config.comments 中,该文件通常位于 8
 \Windows\Microsoft.Net\Framework\v2.x\Config 中
    \Windows\Microsoft.Net\Framework\v2.x\Config 中9
 -->
-->10
 <configuration>
<configuration>11
 <configSections>
  <configSections>12
 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />13
 </configSections>
  </configSections>14
 <appSettings/>
  <appSettings/>15
 <connectionStrings/>
  <connectionStrings/>16
 <log4net>
  <log4net>17
 <root>
    <root>18
 <level value="ALL" />
      <level value="ALL" />19
 <appender-ref ref="LogFileAppender" />
      <appender-ref ref="LogFileAppender" />20
 <appender-ref ref="RollingFileAppender" />
      <appender-ref ref="RollingFileAppender" />21
 <appender-ref ref="AdoNetAppender_SqlServer" />
      <appender-ref ref="AdoNetAppender_SqlServer" />22
 </root>
    </root>23
 <!--
    <!--24
 写入文件中-->
写入文件中-->25
 <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">26
 <file value="D:\log-file1.txt" />
      <file value="D:\log-file1.txt" />27
 <!-- Example using environment variables in params -->
      <!-- Example using environment variables in params -->28
 <!-- <file value="${TMP}\log-file.txt" /> -->
      <!-- <file value="${TMP}\log-file.txt" /> -->29
 <!--<sppendToFile value="true" />-->
      <!--<sppendToFile value="true" />-->30
 <!-- An alternate output encoding can be specified -->
      <!-- An alternate output encoding can be specified -->31
 <!-- <encoding value="unicodeFFFE" /> -->
      <!-- <encoding value="unicodeFFFE" /> -->32
 <layout type="log4net.Layout.PatternLayout">
      <layout type="log4net.Layout.PatternLayout">33
 <!--<footer value="[Footer] Test By Ring1981  " />-->
        <!--<footer value="[Footer] Test By Ring1981  " />-->34
 <conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />35
 </layout>
      </layout>36
 <!-- Alternate layout using XML
      <!-- Alternate layout using XML            37
 <layout type="log4net.Layout.XMLLayout" /> -->
            <layout type="log4net.Layout.XMLLayout" /> -->38
 </appender>
    </appender>39

40
 <!-- 将日志以回滚文件的形式写到文件中
    <!-- 将日志以回滚文件的形式写到文件中41
 为做测试,我把文件大小设置为1K,大于它,就重新生成文档
为做测试,我把文件大小设置为1K,大于它,就重新生成文档42
 -->
-->43
 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" Threshold="Error" >
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" Threshold="Error" >44
 <file value="log.txt" />
      <file value="log.txt" />45
 <appendToFile value="true" />
      <appendToFile value="true" />46
 <rollingStyle value="Size" />
      <rollingStyle value="Size" />47
 <maxSizeRollBackups value="10" />
      <maxSizeRollBackups value="10" />48
 <maximumFileSize value="1KB" />
      <maximumFileSize value="1KB" />49
 <staticLogFileName value="true" />
      <staticLogFileName value="true" />50
 <layout type="log4net.Layout.PatternLayout">
      <layout type="log4net.Layout.PatternLayout">51
 <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />52
 </layout>
      </layout>53
 </appender>
    </appender>54

55

56
 <!-- 将日志记录到数据库中。采用存储过程两种方式
    <!-- 将日志记录到数据库中。采用存储过程两种方式57
 备注:也可采用SQL语句的方式,主要就是commandType, commandText属性设置不同,请
     备注:也可采用SQL语句的方式,主要就是commandType, commandText属性设置不同,请58
 参见log4net官方文档
        参见log4net官方文档59
 -->
 -->60
 <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender" Threshold="Fatal" >
    <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender" Threshold="Fatal" >61
 <bufferSize value="0" />
      <bufferSize value="0" />62
 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />63
 <connectionString value="data source=.;initial catalog=aigoshop;integrated security=false;persist security info=True;User ID=sa;Password=" />
      <connectionString value="data source=.;initial catalog=aigoshop;integrated security=false;persist security info=True;User ID=sa;Password=" />64
 <commandType value="StoredProcedure" />
      <commandType value="StoredProcedure" />65
 <commandText value="WriteLog" />
      <commandText value="WriteLog" />66
 <parameter>
      <parameter>67
 <parameterName value="@log_date" />
        <parameterName value="@log_date" />68
 <dbType value="DateTime" />
        <dbType value="DateTime" />69
 <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
        <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />70
 </parameter>
      </parameter>71
 <parameter>
      <parameter>72
 <parameterName value="@thread" />
        <parameterName value="@thread" />73
 <dbType value="String" />
        <dbType value="String" />74
 <size value="255" />
        <size value="255" />75
 <layout type="log4net.Layout.PatternLayout" value="%thread" />
        <layout type="log4net.Layout.PatternLayout" value="%thread" />76
 </parameter>
      </parameter>77
 <parameter>
      <parameter>78
 <parameterName value="@log_level" />
        <parameterName value="@log_level" />79
 <dbType value="String" />
        <dbType value="String" />80
 <size value="20" />
        <size value="20" />81
 <layout type="log4net.Layout.PatternLayout" value="%level" />
        <layout type="log4net.Layout.PatternLayout" value="%level" />82
 </parameter>
      </parameter>83
 <parameter>
      <parameter>84
 <parameterName value="@logger" />
        <parameterName value="@logger" />85
 <dbType value="String" />
        <dbType value="String" />86
 <size value="255" />
        <size value="255" />87
 <layout type="log4net.Layout.PatternLayout" value="%logger" />
        <layout type="log4net.Layout.PatternLayout" value="%logger" />88
 </parameter>
      </parameter>89
 <parameter>
      <parameter>90
 <parameterName value="@message" />
        <parameterName value="@message" />91
 <dbType value="String" />
        <dbType value="String" />92
 <size value="4000" />
        <size value="4000" />93
 <layout type="log4net.Layout.PatternLayout" value="%message" />
        <layout type="log4net.Layout.PatternLayout" value="%message" />94
 </parameter>
      </parameter>95
 </appender>
    </appender>96

97

98
 </log4net>
  </log4net>99
 <system.web>
  <system.web>100

101
 <compilation debug="false" />
    <compilation debug="false" />102
 
   103
 <authentication mode="Windows" />
    <authentication mode="Windows" />104
 
   105
 </system.web>
  </system.web>106
 </configuration>
</configuration>107

使用代码初始化配置。
log4net.Config.XmlConfigurator.Configure();
(2) 使用自定义配置文件
test.log4net
 <?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?> 2
 <log4net>
<log4net>3
 <appender name="Console" type="log4net.Appender.ConsoleAppender">
  <appender name="Console" type="log4net.Appender.ConsoleAppender">4
 <layout type="log4net.Layout.PatternLayout">
    <layout type="log4net.Layout.PatternLayout">5
 <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
      <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />6
 </layout>
    </layout>7
 </appender>
  </appender>8
 
  9
 <root>
  <root>10
 <level value="DEBUG" />
    <level value="DEBUG" />11
 <appender-ref ref="Console" />
    <appender-ref ref="Console" />12
 </root>
  </root>13
 </log4net>
</log4net>14

使用代码初始化配置。
log4net.Config.XmlConfigurator.Configure(new FileInfo("test.log4net"));
使用 XmlConfigurator.ConfigureAndWatch() 方法除了初始化配置外,还会监测配置文件的变化,一旦发生修改,将自动刷新配置。
(3) XmlConfiguratorAttribute
我们还可以使用 XmlConfiguratorAttribute 代替 XmlConfigurator.Config()/ConfigureAndWatch(),ConfiguratorAttribute 用于定义与 Assembly 相关联的配置文件名。
方式1: 关联到 test.log4net,并监测变化。
[assembly:log4net.Config.XmlConfigurator(ConfigFile="test.log4net", Watch=true)]
方式2: 关联到 test.exe.log4net (或 test.dll.log4net,文件名前缀为当前程序集名称),并监测变化。
[assembly:log4net.Config.XmlConfigurator(ConfigFileExtension="log4net", Watch=true)]
4.应用log4netDemo下载

 CREATE TABLE [dbo].[Log] (
CREATE TABLE [dbo].[Log] ( [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [ID] [int] IDENTITY (1, 1) NOT NULL , [Date] [datetime] NOT NULL ,
    [Date] [datetime] NOT NULL , [Thread] [varchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Thread] [varchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL , [Level] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Level] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL , [Logger] [varchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Logger] [varchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL , [Message] [varchar] (4000) COLLATE Chinese_PRC_CI_AS NOT NULL
    [Message] [varchar] (4000) COLLATE Chinese_PRC_CI_AS NOT NULL  ) ON [PRIMARY]
) ON [PRIMARY] GO
GO

 CREATE PROCEDURE WriteLog
CREATE PROCEDURE WriteLog @log_date datetime,
@log_date datetime, @thread varchar(255),
@thread varchar(255), @log_level varchar(20),
@log_level varchar(20), @logger   varchar(255),
@logger   varchar(255), @message varchar(4000)
@message varchar(4000) AS
AS
 INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)
INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message) GO
GO
运行完程序后,看到文件和数据库日志表都写入了两条。想到能否在数据库正常打开时只写日志表,在数据库连接不上而写到日志文件中呢。哈。。请看第三篇:log4net的简单使用之三_ log4net高级应用
备注:
参考:Log4net 简明手册 - Q_yuhen.htm 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号