.Net core之Log4net、Nlog简单性能测试

比较log4net、nlog的文件写入性能(.netcore环境),涉及代码和配置如有不正确的地方,还请批评指正。

原创,转载请著名出处:http://www.cnblogs.com/supernebula/p/7506993.html

测试环境

开发工具: Vsual Studio 2017 15.3

框架版本: .net core 2.0

操作系统:window10 Enterprise 1703

硬件配置:CPU I3-4170 3.7GHz,内存 8G,固态硬盘

日志组件

链接log4net 2.0.8

链接nlog 5.0.0-beta10

测试用例

  1. 不启用Buffer,连续插入20万行字符串到文件,单文件最大1MB。

  2. 启用Buffer为100,连续插入20万行字符串到文件,单文件最大1MB。

测试方法

xunit单元测试。

测试代码


using System;
using System.Diagnostics;
using System.IO;
using Xunit;
using Xunit.Abstractions; namespace Demo.Logging.Tests
{
/// <summary>
/// Log4net、Nlog日志文件写入对比
/// </summary>
public class BigDataTest
{
private readonly ITestOutputHelper output;
public BigDataTest(ITestOutputHelper outputHelper)
{
output = outputHelper;
} /// <summary>
/// 使用Log4net连续插入20W行字符串
/// </summary>
[Fact]
public void Log4netTest()
{
log4net.Repository.ILoggerRepository repository = log4net.LogManager.CreateRepository("NETCoreRepository");
var fileInfo = new FileInfo("config/log4net.config");
log4net.Config.XmlConfigurator.Configure(repository, fileInfo);
log4net.Config.BasicConfigurator.Configure(repository);
log4net.ILog log = log4net.LogManager.GetLogger(repository.Name, "NETCorelog4net"); var total = 200000;
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < total; i++)
{
log.Info("log4 bigdata test: " + i);
}
sw.Stop();
log.Info($"total: {total}, Elapsed:{sw.ElapsedMilliseconds}");
output.WriteLine($"Log4net测试 total: {total}, Elapsed:{sw.ElapsedMilliseconds}");
} /// <summary>
/// 使用Nlog连续插入20W行字符串
/// </summary>
[Fact]
public void NlogTest()
{ NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
var total = 200000;
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < total; i++)
{
log.Info("nlog bigdata test: " + i);
}
sw.Stop();
log.Info($"total: {total}, Elapsed:{sw.ElapsedMilliseconds}");
output.WriteLine($"NLog测试 total: {total}, Elapsed:{sw.ElapsedMilliseconds}");
} }
}

测试用例一:不启用缓存,连续插入20W行

1.Log4net

配置

log4net.config


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- This section contains the log4net configuration settings -->
<log4net> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logfile/" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.log'" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="1MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date | %message%newline" />
</layout>
</appender> <!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</root> </log4net>
</configuration>

测试结果

输出日志内容:

2017-09-11 19:38:02,276 | log4 bigdata test: 0

2017-09-11 19:38:02,279 | log4 bigdata test: 1

... ...

... ...

2017-09-11 19:38:02,279 | log4 bigdata test: 199998

2017-09-11 19:38:02,279 | log4 bigdata test: 199999

Log4net耗时:

写入行数:200000, 毫秒数:7749

2.Nlog

配置

nlog.config


<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Warn"
internalLogFile="internal-nlog.txt"> <!-- define various log targets -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="ownFile-web" fileName="logs/nlog-own-${shortdate}.log"
layout="${longdate} | ${message}"
archiveAboveSize="1048576"/>
</targets> <rules>
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>

测试结果

输出日志内容:

2017-09-11 19:38:02,276 | nlog bigdata test: 0

2017-09-11 19:38:02,279 | nlog bigdata test: 1

......

......

2017-09-11 19:38:02,279 | nlog bigdata test: 199998

2017-09-11 19:38:02,279 | nlog bigdata test: 199999

Nlog耗时:

写入行数:200000, 毫秒数:104468

测试用例二:启用Buffer,连续插入20W行

1.Log4net

配置 log4net.config


...... <log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<bufferSize value="100" /> ......

耗时:

Log4net写入行数:200000, 毫秒数:4672

2.Nlog

配置

nlog.config


...... <targets>
<!-- write logs to file -->
<default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>
<target xsi:type="File" name="ownFile-web" fileName="logs/nlog-own-${shortdate}.log"
layout="${longdate} | ${message}"
archiveAboveSize="1048576"/>
</targets> ......

Nlog耗时:

写入行数:200000, 毫秒数:1605

总结

日志组件 版本 环境 用例 (启用Buffer=100)毫秒数 (不启用Buffer)毫秒数
log4net 2.0.8 .netcore 2.0 20W行文件写入 4672 7749
nlog 5.0.0-beta10 .netcore 2.0 20W行文件写入 1605 104468

代码和配置文件都在上边了,不知道不同配置的机器结果如何。

大家又会倾向于nlog还是log4net? log4net无论是否启用buffer,耗时都比较稳定,10秒以内,前后差距1.66倍;nlog在启用buffer前后,耗时差距65倍 ,未启用buffer竟然需要100多秒,虽然在启用buffer后仅1.605秒。

.Net core2.0日志组件Log4net、Nlog简单性能测试的更多相关文章

  1. .Netcore之日志组件Log4net、Nlog性能比较

    转载请注明出处http://www.cnblogs.com/supernebula/p/7506993.html .Netcore之Log4net.Nlog性能比较 最近在写一个开源.netcore ...

  2. .NET技术-3.0. 日志插件 log4net

    .NET技术-3.0. 日志插件 log4net 背景:框架 NetFramework3.5 1. 新建控制台程序 2. 程序包管理器控制台中 增加 Nuget包 Install-Package lo ...

  3. 【框架学习与探究之日志组件--Log4Net与NLog】

    前言 本文欢迎转载,作者原创地址:http://www.cnblogs.com/DjlNet/p/7604340.html 序 近日,天气渐冷,懒惰的脑虫又开始作祟了,导致近日内功修炼迟迟未能进步,依 ...

  4. Asp.Net Core中简单使用日志组件log4net

    本文将简单介绍在.NET 6中使用log4net的方法,具体见下文范例. 1.首先新建一个ASP.NET Core空项目 2.通过Nuget包管理器安装下面两个包 log4net Microsoft. ...

  5. 日志组件Log4Net

    <?xml version="1.0" encoding="utf-8"?> <configuration> <configSec ...

  6. .net core2.0 中使用log4net

    一.nuget安装log4net 二.添加log4net.config配置文件 <?xml version="1.0" encoding="utf-8"? ...

  7. ABP .Net Core 日志组件集成使用NLog

    一.说明 NLog介绍和使用说明官网:http://nlog-project.org/ NLog和Log4net对比:https://www.cnblogs.com/qinjin/p/5134982. ...

  8. 性能秒杀log4net的NLogger日志组件(附测试代码与NLogger源码)

    NLogger特性: 一:不依赖于第三方插件和支持.net2.0 二:支持多线程高并发 三:读写双缓冲对列 四:自定义日志缓冲大小 五:支持即时触发刷盘机制 六:先按日期再按文件大小滚动Rolling ...

  9. net core体系-web应用程序-4net core2.0大白话带你入门-7asp.net core日志组件(Logger和Nlog)

    asp.net core日志组件   日志介绍 Logging的使用 1. appsettings.json中Logging的介绍 Logging的配置信息是保存在appsettings.json配置 ...

随机推荐

  1. 解决spring使用动态代理

    解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ... 转 ...

  2. matplotlib学习笔记(三)

    柱状图 柱状图用其每根柱子的长度表示值的大小,它们通常用来比较两组或多组值.下面的程序从文件中读入中国人口的年龄分布数据,并使用柱状图比较男性和女性的年龄分布. import numpy as np ...

  3. UVA - 213解题报告

    题目链接:https://cn.vjudge.net/problem/UVA-213 Sample input TNM AEIOU 0010101100011 1010001001110110011 ...

  4. thinkphp自动验证和自动完成

    tp验证码的自动验证小案例 模板文件 <form action="" method="post"> <p> User: <inpu ...

  5. vue.js依赖安装和引入

    在项目开发过程中我们要安需安装依赖,安装方法 1.可以在项目的package.json文件中的dependencies写入依赖名称和依赖版本,然后打开命令行工具进入项目运行vue install安装 ...

  6. 单例模式+volatile禁止指令重排序

    单例模式: 单例,顾名思义就是只能有一个.不能再出现第二个.就如同地球上没有两片一模一样的树叶一样. 在这里就是说:一个类只能有一个实例,并且整个项目系统都能访问该实例. 单例模式共分为两大类: 懒汉 ...

  7. wait、notify和notifyAll

    生产者消费者模型是我们学习多线程知识的一个经典案例,一个典型的生产者消费者模型如下: public void produce() { synchronized (this) { while (mBuf ...

  8. 关于python的sort和sorted

    1.sort无返回值,没有新建列表  例子: a=[2,1,3] print("a=",a) b=a.sort() print("a=",a) print(&q ...

  9. Murano Weekly Meeting 2015.09.22

    Meeting time: 2015.September.22th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting s ...

  10. DP:凑零钱问题/最长非降子序列(C++)

    你给出一定数额的钱 i 元给我,我利用手中的硬币(m元, j元, k元...)兑换等值的钱给你,要求硬币数最少. 举例:给出1-11的钱,手中硬币有1元,3元,5元. 重点是找到状态和状态转移方程. ...