原文地址

  • 概述
  • 框架
  • 日志(Loggers)和追加器(Appenders)
  • 日志层次(Logger hierarchy)
  • 追加器(Appenders)
  • 筛选(Filters)
  • 布局(Layouts)
  • 对象渲染(Object Renderers)

最近公司有个项目,需要解析三种二进制流,我写其中的两种,最后用一个 Windos 服务来实时处理。之前的项目都只是简单记下,主要是数据库层日志,但针对这个项目,貌似需要点复杂的日志系统,在软件各个层次上都需要日志,否则,出毛病的话,还真看不出来问题在哪,而且调试 Windows 服务也很麻烦~于是,用了 log4net。

本文只是概述,接下来较具体说明 log4net。

Apache log4net™ 手册——介绍【翻译】

概述


log4net 框架是基于 Apache log4j™,关于 log4j 的更多信息查看 http://logging.apache.org/log4j/

本文介绍 log4net API,其独特的功能和设计原理。log4net 是一个基于很多作者的工作的开源项目。log4net 允许开发人员用任意粒度控制日志语句的输出。log4net 使用外部配置文件在运行时完全可配置。

几乎每个大型应用程序都包含它自己的日志,或追踪 API。向代码中插入日志语句对于调试程序是一个很低级的方法。这也是唯一一个方法,因为调试器不会总是可靠或可用的。通常是在大规模多线程应用程序和分布式应用程序的情况。

应用程序一旦被部署,使用开发或调试工具将不是不可能的。一个管理员可以使用有效的日志系统来诊断和修复很多配置问题。

经验说明,日志是一个开发周期中很重要的组件。它提供了很多优势。如提供关于应用程序执行的准确的上下文环境(context )。日志一旦插入到代码,日志输出的产生不需要人工干预。此外,日志输出可以保存在永久介质,以在稍后进行研究。除了用在开发周期中,丰富的日志记录包也可以被看作一个审计工具。

日志确实也有它的缺点。它可以减慢应用程序。如果太详细,它可能会导致滚动失败。为缓解这些问题,log4net 被设计成可靠的,快速的和可扩展的。由于日志很少是一个应用程序的主要焦点,因此,log4net API 致力于易于理解和使用。

框架(Frameworks)


Log4net 对很多框架可用。如下所示:

  • Microsoft® .NET Framework 1.0
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 3.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.5 Client Profile
  • Microsoft .NET Framework 4.0 Client Profile
  • Microsoft .NET Compact Framework 1.0
  • Microsoft .NET Compact Framework 2.0
  • Mono 1.0
  • Mono 2.0
  • Microsoft Shared Source CLI 1.0
  • CLI 1.0 Compatible

不是所有的框架都是一样的,而且有些功能已经被排除。更多信息可查看 Framework Support

日志(Loggers)和追加器(Appenders)


Log4net 有三个主要组件:loggers,appenders 和 layouts这三个组件一起工作使得开发者能够根据信息类型和等级(Level)记录信息,以及在运行时控制信息的格式化和信息的写入位置(如控制台,文件,内存,数据库等)。过滤器(filter)帮助这些组件,控制追加器(appender)的行为和把对象转换成字符串的对象渲染。

日志层次(Logger hierarchy)


普通的 System.Console.WriteLine 任何日志记录 API 的第一个也是最重要的优点在于,它可以禁用某些日志语句,而让其他人轻松打印。这个功能假定,日志空间,也就是,所有可能的日志语句的空间,可以根据开发者选择的标准被分类。

日志器(logger)被命名为实体。日志器名称是大小写敏感的,它们遵循以下层次的命名规则:

命名层次

如果后面跟一个点的名字是它后代(descendant )日志器名称的一个前缀,那么,一个日志器被当做是另一个日志器的祖先(ancestor)。如果自身和后代日志器之间没有祖先,那么,一个日志器被当做是一个子记录器的父母。

该层次的工作机制非常类似 .NET 中的命名空间(namespace)和类层次结构(class hierarchy)。我们将会看到,这很方便。

例如,名为“Foo.Bar”的日志器是一个名为“Foo.Bar.Baz”日志器的父。类似的,“System”是“System.Text”的父,以及“System.Text.StringBuilder”的祖先。这种命名方式对很多开发者来说很熟悉。

也就是说,应用程序中每个类,都可能存在一个日志/记录器~那么,接下来,在类的继承层次结构中,如果一个类继承另一个类,那么它们自己的日志器,也会存在一个继承关系。

root 日志器位于日志器层次的最顶部。有三个有点:

  1. 它总是存在
  2. 它不能通过名称检索
  3. 它总是分配一个等级

使用 log4net.LogManager 类的静态方法来检索日志器。GetLogger 方法采取需要记录日志的类作为参数。如下所示:

namespace log4net
{
    public class LogManager
    {
        public static ILog GetLogger(string name);
        public static ILog GetLogger(Type type);
    }
}

相关文章: