.NET 日志系统2

上一篇文章是将日志打印到控制台,这篇文章将日志写入到文本文件中。

文本日志一般按照日期区分

  1. 如何避免文本日志把磁盘撑爆?

    限制日志总个数或者总大小

  2. 如何避免一个日志文件太大?

    限制单个文件大小

使用NLOG

  1. NuGet安装:NLog.Extensions.Logging
  2. 在项目根目录下创建nlog.config
  3. 增加logBuilder.AddNLog()

nlog.config

nlog.config直接去GitHub复制官方的就行了,根据自己的项目版本去选择

https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-6

需要注意的是文件位置需要更改,可以放D盘或者项目根目录如"internal-nlog-AspNetCore.txt"

  • type="File" 指明为文件
  • fileName 生成的文件名
  • layout 指文件的输出格式

AddNLog

与上一篇文章用的同一个列子,添加logBuilder.AddNLog();

services.AddLogging(logBuilder =>
{
logBuilder.AddConsole(); //如果使用NLog建议只保留logBuilder.AddNLog();
logBuilder.AddNLog();
logBuilder.SetMinimumLevel(LogLevel.Trace);
});

效果展示

深入NLOG

日志过滤

按照不同级别输出,通过不同的命名空间实现不同的日志文件的输出。

首先新增一个Test2类,并将命名空间设置为SystemServices

namespace SystemServices;
public class Test2
{
private readonly ILogger<Test2> _logger; public Test2(ILogger<Test2> logger)
{
_logger = logger;
}
......
}

同样需要使用这个类的方法,我们循环1万次

services.AddScoped<Test2>();

var test2 = sp.GetRequiredService<Test2>();
for (int i = 0; i < 10000; i++)
{
test1.Test();
test2.Test();
}

修改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">=
<targets>
<target name="defaultFile" xsi:type="File" fileName="logs/log-${shortdate}.log"
layout="${date}|${level:uppercase=true}|${looger}|${message}|${exception:format=ToString}"/>
<target name="sysServicesFile" xsi:type="File" archiveAboveSize="1000000" maxArchiveFiles="3"
fileName="logs/sysServices-${shortdate}.log"
layout="${date}|${level:uppercase=true}|${looger}|${message}|${exception:format=ToString}"/>
<target name="targetConsole" xsi:type="ColoredConsole"
layout="${date}|${level:uppercase=true}|${looger}|${message}|${exception:format=ToString}"/>
</targets>
<rules>
<logger name="*" minlevel="Warn" maxlevel="Fatal" writeTo="targetConsole" />
<logger name="SystemServices.*" minlevel="Trace" writeTo="sysServicesFile" final="true"/>
<logger name="*" minlevel="Trace" writeTo="defaultFile" />
</rules>
</nlog>

通过设置rules的name通过不同的命名空间去输出不同的日志文件

<logger name="SystemServices.*" minlevel="Trace" writeTo="sysServicesFile" final="true"/>

匹配它的输出到sysServicesFile中,不匹配的则往下走匹配到defaultFile中。

生成了如下几个日志文件

参数解释

  1. archiveAboveSize为单个日志文件超过多少直接就把日志存档,单位为字节。
  2. maxArchiveFiles,指定文件存档的数量,如果不设定这个参数,则文件数量会一直增加。
  3. maxArchiveDays参数设定保存若干天的日志存档。

rules

  1. rules节点下可以添加多个logger,每个logger都有名字(name属性),name是通配符格式的。
  2. logger节点的minlevel属性和Maxlevel属性,表示这个logger接受日志的最低级别和最高级别。
  3. 日志输出时,会从上往下匹配rules节点下所有的logger,若发现当前日志的分类和level符合这个logger的name通配符,就会把日志输出给这个logger。如果匹配多个logger,就把这条日志输出给多个logger,但是如果一个logger设置了final="true",那么如果匹配到这个logger,就不会继续向下匹配其他logger了。

NLog其他

  1. NLog部分功能和.NET的Loggin重复,比如分类、分级、各种Provider。
  2. 为了避免冲突,如果用NLog,建议不要再配置.NET的分级等(具体用法见微软文档)

参考资料

每日一道面试题

C#中的委托是什么?事件是不是一种委托?

答 : 委托可以把一个方法作为参数代入另一个方法,委托可以理解为指向一个函数的引用。事件是一种特殊的委托。

.NET 认识日志系统-2的更多相关文章

  1. C++ 高性能无锁日志系统

    服务器编程中,日志系统需要满足几个条件 .高效,日志系统不应占用太多资源 .简洁,为了一个简单的日志功能引入大量第三方代码未必值得 .线程安全,服务器中各个线程都能同时写出日志 .轮替,服务器不出故障 ...

  2. Atitit.日志系统slf4j的使用

    Atitit.日志系统slf4j的使用 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar ...

  3. Android源码——Logger日志系统

    Android的Logger日志系统是基于内核中的Logger日志驱动程序实现的. 日志保存在内核空间中 缓冲区保存日志   分类方法:日志的类型  +   日志的输出量   日志类型:   main ...

  4. 使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

    一.背景 最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见 ...

  5. 日志系统实战(三)-分布式跟踪的Net实现

    介绍 在大型系统开发调试中,跨系统之间联调开始变得不好使了.莫名其妙一个错误爆出来了,日志虽然有记录,但到底是哪里出问题了呢? 是Ios端参数传的不对?还是A系统或B系统提供的接口导致?相信有不少人遇 ...

  6. 日志系统实战(一)—AOP静态注入

    背景 近期在写日志系统,需要在运行时在函数内注入日志记录,并附带函数信息,这时就想到用Aop注入的方式. AOP分动态注入和静态注入两种注入的方式. 动态注入方式 利用Remoting的Context ...

  7. Android性能优化之UncaughtExceptionHandler定制自己的错误日志系统

    前言: 每当我们app测试的时候,测试人员总是对我们说这里崩溃了,那里挂掉了!我们只能默默接受,然后尝试着重现bug,更可悲的是有时候bug很难复现,为了解决这种现状所以我们要尝试这建立一个自己的bu ...

  8. [Asp.net 5] Logging-其他日志系统的实现

    Microsoft.Framework.Logging.NLog 使用Nlog扩展日志系统:按照我们上节说的,对于扩展的日志系统都要实现俩个接口ILogger.ILoggerProvider.所以在当 ...

  9. 【转载】scribe、chukwa、kafka、flume日志系统对比

    原文地址:http://www.ttlsa.com/log-system/scribe-chukwa-kafka-flume-log-system-contrast/ 1. 背景介绍许多公司的平台每天 ...

  10. Java日志系统及框架分析

    最近在考虑将容器(Tomcat)内的应用日志统一成slf4j + logback,主要目的有: 快速定位应用日志输出路径,方便日志的采集: 能动态调整日志的级别,方便线上问题定位: 方便在容器层面做扩 ...

随机推荐

  1. EXCEL-统计sheet个数、统计指定单元格个数

    Excel的函数,可以直接在里面执行 1.统计sheet个数 =SHEETS() 参考:https://office.tqzw.net.cn/excel/excel/8168.html 2.统计单元格 ...

  2. 【Python爬虫案例】用python爬1000条哔哩哔哩搜索结果

    目录 一.爬取目标 二.讲解代码 三.同步讲解视频 四.完整源码 一.爬取目标 大家好,我是 @马哥python说 ,一名10年程序猿. 今天分享一期爬虫的案例,用python爬哔哩哔哩的搜索结果,也 ...

  3. linux开发vue项目,不能热更新?

    只需要运行下面的命令即可: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo ...

  4. 如何在docker环境下的纯净ubuntu系统中安装最新版nginx

    原文件地址: https://www.cnblogs.com/taoshihan/p/11588269.html 视频地址: https://www.bilibili.com/video/av6898 ...

  5. 一键自动化博客发布工具,用过的人都说好(infoq篇)

    infoq的博客发布界面也是非常简洁的.首页就只有基本的标题,内容和封面图片,所以infoq的实现也相对比较简单. 一起来看看吧. 前提条件 前提条件当然是先下载 blog-auto-publishi ...

  6. 一键自动化博客发布工具,用过的人都说好(51cto篇)

    51cto是一个优秀的博客平台,今天给大家讲解一下blog-auto-publishing-tools如何自动发布博客到51cto上. 当然在实现过程中有可能会遇到各种困难,不过不用担心,我们一个个来 ...

  7. linux中磁盘清理方法(简单好用)

    文章目录1.命令2.df参数说明3.find参数说明4.清理日志文件1.命令先来看解决办法 df -h --显示当前磁盘使用情况cd / --cd到要清理文件的路径下面find . -type f - ...

  8. TensorRT环境配置(VS+opencv4.5)

    1 TensorRT下载 下载与TensorRT相匹配的CUDA和cuDNN版本:https://docs.nvidia.com/deeplearning/tensorrt/archives/tens ...

  9. 算法金 | Python 中有没有所谓的 main 函数?为什么?

    ​大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 定义和背景 在讨论Python为何没有像C或Java那样的明确的main函数之前,让 ...

  10. react表单处理 受控组件

    将state与表单项中的value值绑定在一起,有state的值来控制表单元素的值,称为受控组件. 绑定步骤: 在state中添加一个状态,作为表单元素的value值 给表单元素绑定change事件, ...