.NET 认识日志系统-2
.NET 日志系统2
上一篇文章是将日志打印到控制台,这篇文章将日志写入到文本文件中。
文本日志一般按照日期区分
如何避免文本日志把磁盘撑爆?
限制日志总个数或者总大小
如何避免一个日志文件太大?
限制单个文件大小
使用NLOG
- NuGet安装:
NLog.Extensions.Logging - 在项目根目录下创建
nlog.config - 增加
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中。
生成了如下几个日志文件


参数解释
- archiveAboveSize为单个日志文件超过多少直接就把日志存档,单位为字节。
- maxArchiveFiles,指定文件存档的数量,如果不设定这个参数,则文件数量会一直增加。
- maxArchiveDays参数设定保存若干天的日志存档。
rules
- rules节点下可以添加多个logger,每个logger都有名字(name属性),name是通配符格式的。
- logger节点的minlevel属性和Maxlevel属性,表示这个logger接受日志的最低级别和最高级别。
- 日志输出时,会从上往下匹配rules节点下所有的logger,若发现当前日志的分类和level符合这个logger的name通配符,就会把日志输出给这个logger。如果匹配多个logger,就把这条日志输出给多个logger,但是如果一个logger设置了final="true",那么如果匹配到这个logger,就不会继续向下匹配其他logger了。
NLog其他
- NLog部分功能和.NET的Loggin重复,比如分类、分级、各种Provider。
- 为了避免冲突,如果用NLog,建议不要再配置.NET的分级等(具体用法见微软文档)
参考资料
- 【.NET 6教程,.Net Core 2022视频教程,杨中科主讲】 https://www.bilibili.com/video/BV1pK41137He/?p=47&share_source=copy_web&vd_source=fce337a51d11a67781404c67ec0b5084
- 【Getting started with ASP.NET Core 6 · NLog/NLog Wiki (github.com)】 https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-6
- 【NLog官方文档】https://nlog-project.org/config/
每日一道面试题
C#中的委托是什么?事件是不是一种委托?
答 : 委托可以把一个方法作为参数代入另一个方法,委托可以理解为指向一个函数的引用。事件是一种特殊的委托。
.NET 认识日志系统-2的更多相关文章
- C++ 高性能无锁日志系统
服务器编程中,日志系统需要满足几个条件 .高效,日志系统不应占用太多资源 .简洁,为了一个简单的日志功能引入大量第三方代码未必值得 .线程安全,服务器中各个线程都能同时写出日志 .轮替,服务器不出故障 ...
- Atitit.日志系统slf4j的使用
Atitit.日志系统slf4j的使用 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar ...
- Android源码——Logger日志系统
Android的Logger日志系统是基于内核中的Logger日志驱动程序实现的. 日志保存在内核空间中 缓冲区保存日志 分类方法:日志的类型 + 日志的输出量 日志类型: main ...
- 使用Slf4j集成Log4j2构建项目日志系统的完美解决方案
一.背景 最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见 ...
- 日志系统实战(三)-分布式跟踪的Net实现
介绍 在大型系统开发调试中,跨系统之间联调开始变得不好使了.莫名其妙一个错误爆出来了,日志虽然有记录,但到底是哪里出问题了呢? 是Ios端参数传的不对?还是A系统或B系统提供的接口导致?相信有不少人遇 ...
- 日志系统实战(一)—AOP静态注入
背景 近期在写日志系统,需要在运行时在函数内注入日志记录,并附带函数信息,这时就想到用Aop注入的方式. AOP分动态注入和静态注入两种注入的方式. 动态注入方式 利用Remoting的Context ...
- Android性能优化之UncaughtExceptionHandler定制自己的错误日志系统
前言: 每当我们app测试的时候,测试人员总是对我们说这里崩溃了,那里挂掉了!我们只能默默接受,然后尝试着重现bug,更可悲的是有时候bug很难复现,为了解决这种现状所以我们要尝试这建立一个自己的bu ...
- [Asp.net 5] Logging-其他日志系统的实现
Microsoft.Framework.Logging.NLog 使用Nlog扩展日志系统:按照我们上节说的,对于扩展的日志系统都要实现俩个接口ILogger.ILoggerProvider.所以在当 ...
- 【转载】scribe、chukwa、kafka、flume日志系统对比
原文地址:http://www.ttlsa.com/log-system/scribe-chukwa-kafka-flume-log-system-contrast/ 1. 背景介绍许多公司的平台每天 ...
- Java日志系统及框架分析
最近在考虑将容器(Tomcat)内的应用日志统一成slf4j + logback,主要目的有: 快速定位应用日志输出路径,方便日志的采集: 能动态调整日志的级别,方便线上问题定位: 方便在容器层面做扩 ...
随机推荐
- Solution - AGC060C
Link 简要题意:称一个长为 \(2^n-1\) 的排列 \(P\) 像堆,如果 \(P_i \lt P_{2i}\),且 \(P_i \lt P_{2i+1}\).给定 \(a,b\),设 \(u ...
- 羽夏看Linux内核——简述
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
- ITSM2023年十大功能趋势[采和]
总体描述:更加人性化,引入自动化相关的设计和技术,更加实用好用.1. 100%服务目录服务目录必须完全贴合用户方的运维实际开展的 服务清单,而不是想当然的抄书或者臆想!都2023年了,还有完全不着调的 ...
- Steam中将XBox手柄默认布局改为任天堂手柄布局的方法
1. 在Steam菜单栏找到"查看",选择大屏幕模式. 2. 进入大屏幕模式后,在菜单界面找到"设置". 3. 在设置界面找到"控制器",选 ...
- linux基础命令及bash shell特性
linux基础命令及bash shell特性 目录 linux基础命令及bash shell特性 1.linux基础命令 1.1 查看内核版本和linux发行版本 1.2 查看服务器硬件信息 1.3 ...
- lca总结+树上差分
lca lca简称最近公共祖先--简介在此,不过多赘述 这里主要写的是倍增算法,oi-wiki上用的是vector,由于本人不会,只会用链表,所以这里就放链表的代码了 例题 加一个数组按倍增数组的方式 ...
- nginx学习记录【二】nginx跟.net core结合,实现一个域名访问多个.net core应用
1.实现转发 打开conf下的nginx.conf文件,如下图: 2.添加.net core网站的转发 按下面的进行修改,修改完后,就把localhost的80转发到了https://localhos ...
- .NET6之MiniAPI(九):基于角色的身份验证和授权
身份验证是这样一个过程:由用户提供凭据,然后将其与存储在操作系统.数据库.应用或资源中的凭据进行比较. 在授权过程中,如果凭据匹配,则用户身份验证成功,可执行已向其授权的操作. 授权指判断允许用户执行 ...
- LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战
LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战 0.前言 **Modelscope **是一个交互式智能体应用基于ModelScope-Agent ...
- MySQL入门到精通(十):SQL优化第一篇(2021最新发布)
SQL优化 1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,创建表时N ...