65.9K
CodeProject 正在变化。 阅读更多。
Home

log4net的迷你替代品

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (29投票s)

2010 年 12 月 13 日

CPOL

3分钟阅读

viewsIcon

131913

downloadIcon

2016

log4net的迷你替代品

介绍 

这是一个简单的 8KB 的 log4net 替代品,而复杂的 log4net 则有 198KB,大小减少了 96%。 奇怪的是,在网上寻找一个符合我要求的日志记录解决方案时,我却找不到一个。

背景

在过去的 7 年里,我一直在使用 log4net,它无疑是 .NET Framework 环境中日志记录的实际标准。 我也是极简主义哲学的追随者,为此,我创建了一个 log4net 的替代品,它更小,也更不复杂。

这样做主要是因为项目中对大小的限制,例如,最大限度地减少应用程序的部署占用空间,同时也作为一次复习练习。

显然,它没有原始版本的功能集,但根据我的经验,99% 的时间你不需要它。

你得到什么

所以这个迷你 log4net 为你做了以下事情

  • 200 行代码
  • 替代 log4net
  • 线程记录器:不会阻塞主代码以记录消息
  • 仅写入文本文件(如果需要,您可以自己添加其他目的地)
  • 限制日志文件大小并使用计数数字滚动文件名
  • 按日期滚动日志文件:每天一个新文件
  • 简单的单方法配置:没有 XML 配置文件
  • 能够记录方法名称:*性能损失

Using the Code

你几乎可以忘记对你的代码的任何更改,因为它将按原样工作。

public class someclass
{
    log4net.ILog _log = LogManager.GetLogger(typeof(someclass));

    public void Method()
    {
       _log.Debug("hello world!");
    }
}

对你的代码的唯一更改将在应用程序的启动例程中,在那里你配置记录器,这将是你使用 log4net 的 DOMConfigurator 方法和 XML 配置文件的地方。

public static void Main()
{
   LogManager.Configure(
              //where to put the logs : folders will be automatically created
              "LOGS\\log.txt", 
               500,// limit the file sizes to 500kb, 0 = no limiting
               false); // log method call names -> performance hit if enabled

}

关注点

这段代码非常简单,因为它只有 200 行,但是这里有一些我将指出的“陷阱”

  • AppDomain.CurrentDomain.ProcessExit: 为了使此函数起作用,你必须将线程 IsBackground 设置为 True,否则它将忽略进程退出并继续该线程。 这一点花了我大约 4 个小时和大量的麻烦来尝试弄清楚。
  • 滚动文件名: 如果你查看用于实现文件名滚动功能的代码,它简单而粗糙,但它有效。
  • LOG 格式输出: 日志输出格式被硬编码为我自己的偏好,但你可以在代码中将其更改为你喜欢的格式。
  • 大小限制: 文件的尺寸限制不确切,但它以最少的代码行完成了工作,并保持消息连续,因此你不必打开前后的文件来查看消息。
  • 方法名称: 如果你在 Configuration 函数中设置 showmethodnames,记录器将输出日志文件中该函数的方法名称,这对于调试代码非常有帮助,因为它指定了消息/错误的准确位置,并且你无需执行任何操作。

唯一的问题是由于代码执行堆栈跟踪并提取方法名称而导致的性能损失。 我不建议在生产代码中使用此功能,但如果你没有记录那么多消息,那也没关系。

历史

  • 首次发布: 2010/12/07 
  • 更新 v1.1 : 2012/05/05
    • 使用计时器代替线程
    • 添加了 Shutdown() 用于隐式关闭文件
    • 优化字符串输出
© . All rights reserved.