Log4Net 日志配置[附带源码下载]

前述

  园子里有许多人对log4net这款开源的日志记录控件有很多介绍。在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少查阅资料的时间。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库,并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).

准备工作:

1.下载log4net.dll 下载地址[http://logging.apache.org/log4net/download_log4net.cgi]

下载文件:log4net-1.2.13-bin-newkey.zip。 解压选择对应的net版本找到log4net.dll。

2.在项目中引用log4net.dll。

实例代码

准备工作完成后我们来看下实例代码 ,首先在项目中创建一个文件夹LogConfig。把有关log4net的一些配置文件和类都放在这个文件夹里面。

WEB网站为例,在项目LogConfig文件夹中创建Log4Net.config配置文件。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <configSections>
  <!--添加自定义节点:log4net type:解析类名,程序集名(log4net.dll)-->
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
 </configSections>

 <log4net>
  <!--定义输出到文件中-->
  <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
   <!--定义文件存放位置-->
   <file value="C:/log4net/"/>
   <!--是否追加到文件,默认为true,通常无需设置-->
   <appendToFile value="true"/>
   <RollingStyle value="Date"/>
   <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
   <DatePattern value="INFO_yyyyMMdd".log"" />
   <!--日志文件名是否为静态-->
   <StaticLogFileName value="false"/>
   <!--多线程时采用最小锁定-->
   <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
   <!--布局(向用户显示最后经过格式化的输出信息)-->
   <layout type="log4net.Layout.PatternLayout">
    <!--
      %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:输出语句所在的文件名
      %-数字:表示该项的最小长度,如果不够,则用空格填充
     -->
    <Header value="[Header]
"/>
    <Footer value="[Footer]
"/>
    <!--正文-->
    <ConversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
   </layout>
  </appender>

  <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender">
   <file value="C:/log4net/"/>
   <appendToFile value="true"/>
   <RollingStyle value="Date"/>
   <DatePattern value="ERROR_yyyyMMdd".log"" />
   <StaticLogFileName value="false"/>
   <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
   <layout type="log4net.Layout.PatternLayout">
    <Header value="[Header]
"/>
    <Footer value="[Footer]
"/>
    <!--正文-->
    <ConversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
   </layout>
  </appender>

  <root>
   <level value="DEBUG"/>
   <appender-ref ref="Log4Net_ERROR" />

   <level value="INFO"/>
   <appender-ref ref="Log4Net_INFO" />
  </root>

 </log4net>

</configuration>

配置文件写完后我们在来写一个Helper类。同样在项目中创建一个名为LogHelper.cs的类文件。

using log4net;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

//指定log4net使用的config文件来读取配置信息
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"LogConfig\Log4Net.config", Watch = true)]
namespace Project.Log4.Net.LogConfig
{
  /// <summary>
  /// 日志帮助类
  /// </summary>
  public class LogHelper
  {
    private static readonly ConcurrentDictionary<Type, ILog> _loggers = new ConcurrentDictionary<Type, ILog>();

    /// <summary>
    /// 获取记录器
    /// </summary>
    /// <param name="source"></param>
    /// <returns></returns>
    private static ILog GetLogger(Type source)
    {
      if (_loggers.ContainsKey(source))
      {
        return _loggers[source];
      }
      else
      {
        ILog logger = LogManager.GetLogger(source);
        _loggers.TryAdd(source, logger);
        return logger;
      }
    }

    /* Log a message object */

    /// <summary>
    /// 调试信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Debug(object source, string message)
    {
      Debug(source.GetType(), message);
    }

    /// <summary>
    /// 调试信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="ps"></param>
    public static void Debug(object source, string message, params object[] ps)
    {
      Debug(source.GetType(), string.Format(message, ps));
    }

    /// <summary>
    /// 调试信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Debug(Type source, string message)
    {
      ILog logger = GetLogger(source);
      if (logger.IsDebugEnabled)
        logger.Debug(message);
    }

    /// <summary>
    /// 关键信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Info(object source, object message)
    {
      Info(source.GetType(), message);
    }

    /// <summary>
    /// 关键信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Info(Type source, object message)
    {
      ILog logger = GetLogger(source);
      if (logger.IsInfoEnabled)
        logger.Info(message);
    }

    /// <summary>
    /// 警告信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Warn(object source, object message)
    {
      Warn(source.GetType(), message);
    }

    /// <summary>
    /// 警告信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Warn(Type source, object message)
    {
      ILog logger = GetLogger(source);
      if (logger.IsWarnEnabled)
        logger.Warn(message);
    }

    /// <summary>
    /// 错误信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Error(object source, object message)
    {
      Error(source.GetType(), message);
    }

    /// <summary>
    /// 错误信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Error(Type source, object message)
    {
      ILog logger = GetLogger(source);
      if (logger.IsErrorEnabled)
        logger.Error(message);
    }

    /// <summary>
    /// 失败信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Fatal(object source, object message)
    {
      Fatal(source.GetType(), message);
    }

    /// <summary>
    /// 失败信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    public static void Fatal(Type source, object message)
    {
      ILog logger = GetLogger(source);
      if (logger.IsFatalEnabled)
        logger.Fatal(message);
    }

    /* Log a message object and exception */

    /// <summary>
    /// 调试信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Debug(object source, object message, Exception exception)
    {
      Debug(source.GetType(), message, exception);
    }

    /// <summary>
    /// 调试信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Debug(Type source, object message, Exception exception)
    {
      GetLogger(source).Debug(message, exception);
    }

    /// <summary>
    /// 关键信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Info(object source, object message, Exception exception)
    {
      Info(source.GetType(), message, exception);
    }

    /// <summary>
    /// 关键信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Info(Type source, object message, Exception exception)
    {
      GetLogger(source).Info(message, exception);
    }

    /// <summary>
    /// 警告信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Warn(object source, object message, Exception exception)
    {
      Warn(source.GetType(), message, exception);
    }

    /// <summary>
    /// 警告信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Warn(Type source, object message, Exception exception)
    {
      GetLogger(source).Warn(message, exception);
    }

    /// <summary>
    /// 错误信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Error(object source, object message, Exception exception)
    {
      Error(source.GetType(), message, exception);
    }

    /// <summary>
    /// 错误信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Error(Type source, object message, Exception exception)
    {
      GetLogger(source).Error(message, exception);
    }

    /// <summary>
    /// 失败信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Fatal(object source, object message, Exception exception)
    {
      Fatal(source.GetType(), message, exception);
    }

    /// <summary>
    /// 失败信息
    /// </summary>
    /// <param name="source"></param>
    /// <param name="message"></param>
    /// <param name="exception"></param>
    public static void Fatal(Type source, object message, Exception exception)
    {
      GetLogger(source).Fatal(message, exception);
    }
  }

}

配置和Helper类都有了..现在来看看调用方法。在项目中创建一个index.aspx页面

LogHelper.Debug(this, "Debug");
LogHelper.Error(this, "Error");
LogHelper.Fatal(this, "Fatal");
LogHelper.Info(this, "Info");
LogHelper.Warn(this, "Warn");

日志生成格式[每天一个文件]:

参数说明

Log4Net.config是配置日志输出参数文件。在这个文件中可以到看很多配置节点,大体可以分为二个大类<configSections>...</configSections> 和 <log4net>...</log4net>。我们来看看这些节点都是啥意思。

1:<configSections>..</configSections>:申明自定义节点log4net解析的类名和程序集名(log4net.dll)。
2:<log4net>..</log4net>:使用log4net的配置信息都在这里设置。来重点看看都有那些设置信息,这个大节点整体也可以分为二类。

2.1:定义输出信息设置节点<appender></appender>。
2.2:定义日志的输出媒介<root></root>。

配置的总体结构就是这样,下面来看一些详细内容。

appender:决定日志输出的方式(可设置多个节点,如对INFO,ERROR等设置不同的输出方式)。

主要包括已下几种:

1 AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。
2 AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
3 BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
4 ConsoleAppender:将日志输出到控制台。
5 EventLogAppender:将日志写到Windows Event Log.
6 FileAppender:将日志写到文件中。
7 LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下).
8 MemoryAppender:将日志存到内存缓冲区。
9 NetSendAppender:将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
10 RemoteSyslogAppender:通过UDP网络协议将日志写到Remote syslog service。
11 RemotingAppender:通过.NET Remoting将日志写到远程接收端。
12 RollingFileAppender:将日志以回滚文件的形式写到文件中。(实例代码中使用的是此类型)
13 SmtpAppender:将日志写到邮件中。
14 TraceAppender:将日志写到.NET trace 系统。
15 UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

从上面提供的方式中可以看出能输出文件、控制台、Windows事件日志和数据库。这个可根据实际情况选择。

代码如下:

<appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
...
</appender>

这里配置的name(“Log4Net_INFO”)会在定义日志的输出媒介中使用到。name可任意设置。

在appender 节点中还会配置一些文件存放的地址,日志个数等信息。这些在实例代码中都在体现,这里不做说明。我们在来看看日志最后输出呈现的布局设置信息。

<layout type="log4net.Layout.PatternLayout">
    <!--头-->
    <Header value="[Header]"/>
    <!--脚注-->
    <Footer value="[Footer]"/>
    <!--正文-->
    <ConversionPattern value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>

这里配置的信息最终是日志打印出来的样式。我们可以看到这里可以设置内容头Header和尾Footer。正文ConversionPattern。在正文中有出现有 %d [%t]这些都是啥意思了表示什么。这里有一个对照表可提供参考:

%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:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充

配置的基本也就这些。下就是root的配置说明 。

root:

对设置输出的方式进行指定。

<root>
   <!--批定DEBUG输出的文件形式记录日志-->
   <level value="DEBUG"/>
   <appender-ref ref="Log4Net_ERROR" />

  <!--批定INFO输出的文件形式记录日志-->
   <level value="INFO"/>
   <appender-ref ref="Log4Net_INFO" />
</root>

控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
如果没有定义LEVEL的值,则缺省为DEBUG

附带源码:代码

(0)

相关推荐

  • log4net创建系统日志的详细步骤

    前言用户可以从http://logging.apache.org/log4net/下载log4net的源代码.解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll.用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可. 在项目中配置 第一步:首先在项目中引用log4net.dll文件.第二步:在Web.config文件中进行添加configSections的节点 复制代码 代码如下: <co

  • C#控制台程序使用Log4net日志组件详解

    C#控制台程序使用Log4net日志组件,供大家参考,具体内容如下 1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例 项目源码在文章底部 2.首先创建一个控制台程序,引入Log4net.dll --使用NuGet 3.进行一些简单的配置,在App.config文件中配置,如果大家没有App.config文件,可以通过在解决方案中,添加新建项→应用程序配置文件,进行添加. <?xml version="1.0

  • log4net配置和使用方法分享

    1.Global.asax文件 复制代码 代码如下: void Application_Start(object sender, EventArgs e) {//在应用程序启动时运行的代码log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Sxmobi.FileHelper.GetMapPath("~\\log4net.config")));} 2.log4net.config 文件 复制代码

  • C#实现Log4Net日志分类和自动维护实例

    本文实例讲述了C#实现Log4Net日志分类和自动维护的实现方法.分享给大家供大家参考.具体实现方法如下: 一.背景 在程序中,我们调试运行时信息,Log4Net是一个不错的解决方案.不知道是我用的不好,用到最后反而都不想看日志了.原因是因为我n个功能使用的默认的Logger来记录日志,这样以来,所有功能记录的信息都依赖同一个配置,于是所有的信息都在一个文件中,有时候查找起来,极其不方便. 我想,能不能按照功能分类呢?如果通过配置不同的logger,然后功能根据不同的LoggerName加载Il

  • log4net教程日志分类和自动维护示例

    如果我们需要通过配置不同的ILog,流程是这样的,首先要创建一个ILoggerRepository,通过它来进行日志等级的配置,和各种Appender,接着通过LogManager在ILoggerRepository获取一个Ilog对象,就可以写日志了.代码如下: 复制代码 代码如下: public static ILog GetLogger(string repositoryName = "")        {            if (string.IsNullOrEmpty

  • .net下log4net使用方法详解

    本文实例为大家分享了.net下log4net的使用方法,供大家参考,具体内容如下 这里以控制台应用程序为例 首先是要添加引用: 安装后可以看到项目中多了log4net的引用: 添加应用程序配置文件app.config,配置log4net <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="lo

  • Log4net 日志记录详细介绍及应用

    Log4net 日志 概要: Log4net是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.日志是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运行过程的步骤.成功失败记录下来,将关键性的数据记录下来,进而分析系统问题所在.因为对于网站来说,不能把异常信息显示给用户,异常信息只能记录到日志.网站出问题后,开发人员查看日志就知道问题所在. 一.如何配置Log4net环境 1.添加"应用程序配置文件"(App.config); 2

  • MVC使用Log4Net进行错误日志记录学习笔记4

    在Web应用运行过程中,我们难免会遇到程序运行异常,这个时候我们就应该将异常信息记录下来,以便开发人员和维护人员对异常原因进行还原,对异常原因进行修复.在ASP.NET平台中进行日志记录的组件也有很多,如Log4Net.CommonLogging等,我们这里选用Log4Net进行异常日志的记录. 1. 捕获异常 在ASP.NET MVC中提供了一个全局的异常处理过滤器:HandleErrorAttribute,可以通过该过滤器捕获异常信息. 我们在Models文件夹下新建类型Log4Except

  • Log4net日志记录组件的使用步骤详解和下载

    第一步: 添加并应用Log4net.dll.然后在Web.config文件中添加下面的配置局 复制代码 代码如下: <configSections>     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> 第二步: 新建Log4Net.config的配置文件,

  • asp.net log4net的使用方法

    刚开始接触asp.net,关于日志记录怎么能少,因此简单记录一下log4net的配置和使用,以防以后忘记.   首先引入log4net.dll,关于这个文件自己百度下载下. 然后配置一下有关配置,在web.config中加入在configuration节点下 <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log

随机推荐