日志记录工具 - log4net

使用 log4net

 

1. 安装

在主项目下的控制台中输入

Install-Package log4net

 

2. 配置可用性

在使用 Ilog 的项目上 配置 AssemblyInfo.cs 在尾部加入一行

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension="ext", Watch = true)]
// ConfigFile : 指的是log4Net的配置文件的路径,相对应用程序的根路径
// ConfigFileExtension : 如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。
// Watch (Boolean属性): log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变,重命名,删除等事件。
// 注:其中:ConfigFile和ConfigFileExtension属性不能同时使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt” ConfigFileExtension=”txt”,则配置文件就应该是”test.exe.txt”

同时需要在使用 ILog 的项目上引入 log4net.dll

 

3. 文件配置

在主项目上创建配置文件, 用来配置相关项

log4net.config 此名字根据上一步 的配置文件名而来

总框架

root 不是必须的, 这个只是个继承的作用, 可以省略然后把配置都卸载每个 logger 里

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net>
    <root>
      <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->  
      <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录-->  
      <!--如果没有定义LEVEL的值,则缺省为DEBUG--> 
      <level value="ALL"/>
    </root>
    <logger name="dblog" additivity="false">
       <!-- 预定义了一个具体日志对象的设置 -->
       <!-- name 用来调用查找的名字, 例如: LogManager.GetLogger(“testAPP.Logging”) -->
       <!-- additivity 是否继承root -->
      <level value="ALL"/>
      <!--定义输出介质-->
      <appender-ref ref="SysAppender" />
    </logger>
  </log4net>
  <!--必须指定框架,否则不执行,新版本默认支持4.0,可修改源文件,项目属性设定为.NET FRAMEWORK2.0后,打开重新编译,去掉其中的.NET 4.0编译导致错误环节,如此只能使用在.net 2.0框架-->
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>
View Code

在 <logger> 中配置想要的记录载体

记录到文件配置

<!--日志格式必须要有, 否则记录的文件会为空-->

<!--记录到文件-->
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
   <!--日志文件名开头-->
  <param name="File" value="Files/Logs" />
  <!--是否追加到文件,默认为true,通常无需设置-->  
  <param name="AppendToFile" value="true" />
  <!--变换的形式为日期,这种情况下每天只有一个日志-->  
  <!--此时MaxSizeRollBackups和maximumFileSize的节点设置没有意义-->  
  <!--<rollingStyle value="Date"/>-->  
  <!--变换的形式为日志大小-->  
  <!--这种情况下MaxSizeRollBackups和maximumFileSize的节点设置才有意义-->  
  <param name="RollingStyle" value="Date" />
  <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> 
  <param name="DatePattern" value="\\yyyy-MM\\yyyy-MM-dd&quot;.log&quot;" />
  <param name="StaticLogFileName" value="false" />
  <!--每天记录的日志文件个数,与maximumFileSize配合使用-->  
  <MaxSizeRollBackups value="10"/>  
  <!--每个日志文件的最大大小-->  
  <!--可用的单位:KB|MB|GB-->  
  <!--不要使用小数,否则会一直写入当前日志-->  
  <maximumFileSize value="2MB"/>  
  <!--日志格式-->
  <layout type="log4net.Layout.PatternLayout,log4net">
    <param name="Header" value="[Header]"/> <!---->
    <param name="Footer" value="[Footer]"/> <!--脚注-->
    <param name="ConversionPattern" value="%d - %m%n" />
    <!--
       调用实例
       log4net.ILog log = log4net.LogManager.GetLogger("Filelog");
       log.Info(Message);
        %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
        %n(new line):换行
        %d(datetime):输出当前语句运行的时刻
        %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
        %t(thread id):当前语句所在的线程ID
        %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
        %c(class):当前日志对象的名称
        %L:输出语句所在的行号
        %F:输出语句所在的文件名
        %-数字:表示该项的最小长度,如果不够,则用空格填充
        例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:
    [main] INFO  org.foo.Bar - Located nearest gas station.
    -->
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter"> <!--应用到Appender对象的过滤器-->
    <param name="LevelMin" value="DEBUG" /> 
    <param name="LevelMax" value="WARN" /> 
  </filter>
</appender>
View Code

记录到 Oracle 数据库

<!--Oracle数据库-->
    <appender name="OracleAppender" type="log4net.Appender.AdoNetAppender">
      <!-- Oracle数据源-->
      <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <!-- Oracle连接字符串-->
      <connectionString value="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.206)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));PASSWORD=watdb;PERSIST SECURITY INFO=True;USER ID=watdb;"/>
      <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,Message,Exception,ClientUser,ClientIP,RequestUrl,Action)VALUES(:Dates,:Levels,:Logger,:Message,:Exception,:ClientUser,:ClientIP,:RequestUrl,:Action)"/>
      <!--  
             设置缓存区大小  
             1表明有一条日志就要写入  
             如果10就表示日志到达10条时一起写入  
             -->
      <bufferSize value="0"/>
      <parameter>
        <parameterName value=":Dates" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterName value=":Levels" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":Logger" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":Message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":Exception" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%exception" />
        </layout>
      </parameter>
      <!--DIY-->
      <parameter>
        <parameterName value=":ClientUser" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{ClientUser}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":ClientIP" />
        <dbType value="String" />
        <size value="20" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{ClientIP}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":RequestUrl" />
        <dbType value="String" />
        <size value="500" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{RequestUrl}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=":Action" />
        <dbType value="String" />
        <size value="20" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{Action}" />
        </layout>
      </parameter>
    </appender>
View Code

记录到 Sqlite 数据库

<!--Sqlite数据库-->
    <appender name="SqliteAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="0" />
      <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.98.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <connectionString value="Data Source=|DataDirectory|test.db;Version=3;" />
      <commandText value="INSERT INTO Log (Date, Level, Logger, ClientUser,ClientIP, RequestUrl,Action, Message, Exception) VALUES (@Date, @Level, @Logger,@ClientUser,@ClientIP, @RequestUrl,@Action, @Message, @Exception)" />
      <parameter>
        <parameterName value="@Date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@Level" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Logger" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@ClientUser" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{ClientUser}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@ClientIP" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{ClientIP}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@RequestUrl" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{RequestUrl}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Action" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{Action}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Message" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Exception" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%exception" />
        </layout>
      </parameter>
    </appender>
View Code

记录到 SqlServer 数据库

<!--SqlServer数据库-->
    <appender name="SqlServerAppender" type="log4net.Appender.AdoNetAppender">
      <!-- SqlServer数据源-->
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <!-- SqlServer连接字符串-->
      <connectionString value="data source=.;initial catalog=wkmvc_db;integrated security=false;persist security info=True;User ID=sa_wkmvc;Password=123456" />
      <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,ClientUser,ClientIP,RequestUrl,Action,Message,Exception)VALUES(@Dates,@Levels,@Logger,@ClientUser,@ClientIP,@RequestUrl,@Action,@Message,@Exception)"/>
      <!--  
       设置缓存区大小  
       1表明有一条日志就要写入  
       如果10就表示日志到达10条时一起写入  
      -->
      <bufferSize value="0"/>
      <parameter>
        <parameterName value="@Dates" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@Levels" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
      <!--DIY-->
      <parameter>
        <parameterName value="@ClientUser" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout" >
          <param name="ConversionPattern" value="%property{ClientUser}"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@ClientIP" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout" >
          <param name="ConversionPattern" value="%property{ClientIP}"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@RequestUrl" />
        <dbType value="String" />
        <size value="500" />
        <layout type="log4net.Layout.PatternLayout" >
          <param name="ConversionPattern" value="%property{RequestUrl}"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Action" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout" >
          <param name="ConversionPattern" value="%property{Action}"/>
        </layout>
      </parameter>
    </appender>
View Code

 

4. 使用

 

Console.WriteLine("Begin Run");  
XmlConfigurator.Configure();  
Type type = MethodBase.GetCurrentMethod().DeclaringType;  
ILog m_log = LogManager.GetLogger(type);  
m_log.Debug("这是一个Debug日志");  
m_log.Info("这是一个Info日志");  
m_log.Warn("这是一个Warn日志");  
m_log.Error("这是一个Error日志");  
m_log.Fatal("这是一个Fatal日志");  
Console.WriteLine("End");  
Console.ReadLine();  

 

  public static void WriterLog(bool result, string module, string describe, string note)
  {
    ILog logger = LogManager.GetLogger("dblog");

    if (logger.IsInfoEnabled)
    {
      logger.InfoFormat(@"结果:{0},模块:{1},   描述:{2},     备注:{3}", result ? "成功" : "失败", module, describe, note);
    }
  }

 

 

如何使用自定义的字段进行数据库记录

public class MessageLog
{
    public string Date { get; set; }
    public string Message { get; set; }
    public string ClientUser { get; set; }
    public override string ToString()
    {
        return Message;
    }
}

internal sealed class ContentPatternConverter : PatternLayoutConverter
{
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
    {
        var messageLog = loggingEvent.MessageObject as MessageLog;
        if (messageLog != null)
        {
            writer.Write(messageLog.ClientUser);
        }
    }
}

public class MessageLayout : PatternLayout
{
    public MessageLayout()
    {
        this.AddConverter("ClientUser", typeof(ContentPatternConverter));
    }
}
<logger name="dblog" additivity="false">
      <level value="ALL"/>
      <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
        <param name="File" value="Files/Logs" />
        <param name="RollingStyle" value="Date" />
        <param name="DatePattern" value="\\yyyy-MM\\yyyy-MM-dd&quot;.log&quot;" />
        <param name="StaticLogFileName" value="false" />
        <layout type="log4net.Layout.PatternLayout,log4net" />
      </appender>
      <appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
        <bufferSize value="1"/>
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <connectionString value="Data Source=(localdb)\ProjectsV13; Initial Catalog=LogDemo; Integrated Security=SSPI;" />
        <commandText value="INSERT INTO dbo.SYS_LOG(Dates,Message,ClientUser)VALUES(@Dates,@Message,@ClientUser)"/>
        <parameter>
          <parameterName value="@Dates" />
          <dbType value="DateTime" />
          <layout type="log4net.Layout.RawTimeStampLayout" />
        </parameter>
        <parameter>
          <parameterName value="@Message" />
          <dbType value="String" />
          <size value="4000" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
          </layout>
        </parameter>
        <!--DIY-->
        <parameter>
          <parameterName value="@ClientUser" />
      <!--这里的类型可以是 String, DateTime, Int32 -->
      <!--如果程序里的字段是 int, 这里也可以设置为 String, 只要能相互转换--> <dbType value="String" /> <size value="100" />
      <!--type里填写Layout的类(包含命名空间)--> <layout type="Log4netTest.MessageLayout" > <conversionPattern value="%ClientUser"/> </layout> </parameter> </appender>
</logger>

 

注意: 如果是在控制台应用程序里使用 log4net 则需要吧 log4net.config 属性设置为!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

 

https://blog.csdn.net/binnygoal/article/details/79557746

 

posted @ 2016-07-20 13:59  `Laimic  阅读(235)  评论(0)    收藏  举报