日志组件DotNetCommon.Filelog

介绍

根据Microsoft.Extensions.Logging.Console改造的本地文件日志输出组件,轻量便捷,运行平台:asp.net core。

1. 为什么要写这个项目,开源的日志组件不够用吗?

  • 第一:微软提供了一个很好的日志输出框架,也提供了基本的控制台输出组件,但没有提供输出到文件的日志组件,很是遗憾;

  • 第二:第三方日志组件(如:NLog、Serialog、Log4net)功能虽然比较全,但也引入了其他大量的概念和规则。而对于中小型项目来说,它们仅需要输出日志到本地文件即可,所以在使用的便捷上总是差强人意;

  • 第三:第三方日志组件在某些功能上也不尽如人意,比如:是否能将日志消息按照日志类别输出到不同文件中?在程序工作时,是否占用日志文件?是否能排除某个类别的日志文件不输出?

  • 第四:练手。

2. 这个项目的特点

  • 不引入新的规则概念,不引入额外的配置文件,力求轻量级,所有配置均在appsetting.json中实现;

  • 实现非占用文件式输出, 方便日志文件浏览,其内部文件的输出是基于内存的单线程队列,高并发下不影响主线程运行;

  • 提供按照日志类别、级别过滤输出到不同的文件;

  • 提供按文件大小滚动输出的功能;

  • 提供定时净化日志目录的功能;

3. 这个项目的实现思路

大量参考控制台输出组件的源码(Microsoft.Extensions.Logging.Console)

4. 快速使用

  • 第一步:安装包

    <ItemGroup><PackageReference Include="DotNetCommon.Filelog" Version="1.1.0" />
    </ItemGroup>
  • 第二步:修改Program.cs文件,引入组件

    public class Program
    {public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureLogging(loggingBuilder =>{loggingBuilder.ClearProviders();loggingBuilder.AddConsole();//一行代码即可引入loggingBuilder.AddFile();}).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});
    }
    
  • 第三步:没有了。

5. 输出效果

引入日志组件后,为了测试输出效果,我们可以新建一个控制器代码如下:

[HttpGet]
public string Get()
{_logger.LogTrace("trace");_logger.LogDebug("debug");_logger.LogInformation("info");_logger.LogWarning("warn");_logger.LogError("error");_logger.LogCritical("critical");using (_logger.BeginScope("测试日志的Scope")){_logger.LogTrace("scope-trace");_logger.LogDebug("scope-debug");_logger.LogInformation("scope-info");_logger.LogWarning("scope-warn");_logger.LogError("scope-error");_logger.LogCritical("scope-critical");}_logger.LogTrace("Scope已经结束了。。。");//多行日志_logger.LogInformation($@"第几次
小明小红
小花小龙圣诞节哦我按实际大地阿斯顿");_logger.LogInformation($@"hah 
小明小红
小花小龙圣诞节哦我按实际大地阿斯顿end");//throw new Exception("测试异常日志");return "ok";
}

当程序启动并且访问到这个api后,我们将会看到程序目录下多了个文件夹logs,它里面的日志文件如下:

app-all-2021-06-09.log 	4KB  //应用类别的日志都会记录到这里
app-crit-2021-06-09.log 1KB	 //应用类别中Critical级别的日志都会记录到这里
app-fail-2021-06-09.log	1KB  //应用类别中Error级别的日志都会记录到这里
app-info-2021-06-09.log	2KB	 //应用类别中Information级别的日志都会记录到这里
app-warn-2021-06-09.log	1KB  //应用类别中Warning级别的日志都会记录到这里
system-2021-06-09.log	1KB	 //系统类别的日志都会记录到这里//system-2021-06-09.log 内容
[2021-06-09 20:44:52.676]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Now listening on: https://localhost:5501
[2021-06-09 20:44:52.679]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Now listening on: http://localhost:5500
[2021-06-09 20:44:52.680]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Application started. Press Ctrl+C to shut down.
[2021-06-09 20:44:52.680]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Hosting environment: Development
[2021-06-09 20:44:52.680]-[info]: Microsoft.Hosting.Lifetime[0]-[threed:1]Content root path: E:\gitee\DotNetCommon.Filelog\samples\SimpleFileLog//app-warn-2021-06-09.log 内容
[2021-06-09 20:44:53.604]-[warn]: SimpleFileLog.Controllers.HomeController[0]-[threed:11]=> RequestPath:/home RequestId:0HM9B8HGAQOQF:00000001, SpanId:|85fcc31f-49a39d824a1949ba., TraceId:85fcc31f-49a39d824a1949ba, ParentId:      => SimpleFileLog.Controllers.HomeController.Get (SimpleFileLog)warn
[2021-06-09 20:44:53.604]-[warn]: SimpleFileLog.Controllers.HomeController[0]-[threed:11]=> RequestPath:/home RequestId:0HM9B8HGAQOQF:00000001, SpanId:|85fcc31f-49a39d824a1949ba., TraceId:85fcc31f-49a39d824a1949ba, ParentId:      => SimpleFileLog.Controllers.HomeController.Get (SimpleFileLog)      => 测试日志的Scopescope-warn

注意:虽然代码中有输出Information级别以下的日志,但由于工程的appsettings.json中的配置导致Debug和Trace级别的日志并没有记录到文件。

{
"Logging": {"LogLevel": {"Default": "Information", //设置默认类别日志的输出级别"Microsoft": "Warning", //设置Microsoft开头的类别日志的输出级别"Microsoft.Hosting.Lifetime": "Information" //设置Microsoft.Hosting.Lifetime开头的类别日志的输出级别}
},
"AllowedHosts": "*"
}

为了能输出Information级别以下的日志,我们可以调整appsettings.json的配置如下:

{
"Logging": {"LogLevel": {"Default": "Trace", "Microsoft": "Trace", "Microsoft.Hosting.Lifetime": "Trace" }
},
"AllowedHosts": "*"
}

如果仅想设置FileLog组件的日志输出级别,也可以如下设置:

{"Logging": {"LogLevel": {"Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" },"File":{"LogLevel": {"Default": "Trace", "Microsoft": "Trace", "Microsoft.Hosting.Lifetime": "Trace" }}},"AllowedHosts": "*"
}

关于日志的类别和级别参考MSDN文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?view=aspnetcore-5.0#log-level

6. 轻量配置

上面引入FileLog的时候虽然仅使用了loggingBuilder.AddFile();一行代码,但FileLog组件内部加载了默认的配置,如下:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"},"File": {"IncludeScopes": true, //表示是否输出日志范围,默认输出"InternalLogFile": "logs/internal-#datetime{yyyy-MM-dd}#.log","AutoClear": {"Enable": false,"ExpireSpan": 0,"TriggerCount": 200,"Dirs": [ "logs" ],"Exts": [ "*.log" ]},"Writers": [{"FirstInclude": [ "Microsoft", "System" ],"Path": "logs/system-#datetime{yyyy-MM-dd}#.log","RollingSize": 10485760,"MinLogLevel": "Trace","MaxLogLevel": "None"},{"FirstInclude": [ "*" ],"Path": "logs/app-#level#-#datetime{yyyy-MM-dd}#.log","SecondExclude": [ "Microsoft", "System" ],"RollingSize": 10485760,"MinLogLevel": "Trace","MaxLogLevel": "None"},{"FirstInclude": [ "*" ],"Path": "logs/app-all-#datetime{yyyy-MM-dd}#.log","SecondExclude": [ "Microsoft", "System" ],"RollingSize": 10485760,"MinLogLevel": "Trace","MaxLogLevel": "None"}]}},"AllowedHosts": "*"
}

配置详解:

配置项含义默认值
IncludeScopes是否输出日志作用域,参考:上面示例的输出true
InternalLogFileFileLog内部异常时输出的日志位置,支持相对路径和绝对路径logs/internal-#datetime{yyyy-MM-dd}#.log
AutoClear自动净化日志目录配置块,提供定时删除目录下日志文件的功能看下级
AutoClear.Enable是否启用自动净化功能false
AutoClear.ExpireSpan过期时间(单位:秒),当文件的创建日期距现在超过了指定秒后才会被删除0,表示永不过期
AutoClear.TriggerCount触发目录净化的条件,当FileLog连续输出多少次后才会扫描日志文件200
AutoClear.Dirs需要净化的目录列表,净化时采用的是递归算法[ "logs" ]
AutoClear.Exts为防止误删除文件,必须设置日志文件的匹配模式[ "*.log" ]
Writers日志输出器数组,每个writer对应一个日志文件具有三个日志输出器的数组
Writers[].MinLogLevel当前Writer最低输出级别(执行时首先检查MinLogLevel和MaxLogLevel)Trace,即不限制
Writers[].MaxLogLevel当前Writer最高输出级别(执行时首先检查MinLogLevel和MaxLogLevel)None,即不限制
Writers[].FirstInclude默认当前Writer不允许输出任何日志类别,通过FirstInclude设置允许的类别null
Writers[].SecondExclude在FirstInclude基础上,设置排除的日志输出类别null
Writers[].Path当前Writer文件的路径,支持相对路径和绝对路径null
Writers[].RollingSize当前Writer文件滚动输出的单文件最大值(字节),滚动示例:xxxx-r2.log10485760,即:10M

注意:

  • 上面AutoClear.Exts的配置是调用 var _files = Directory.GetFiles(_dir, pattern); 生效的。

  • Writers配置默认是有三个Writer的数组,如果自己做了配置的话会将这三个Writer一起覆盖掉。

7. 示例工程

https://gitee.com/jackletter/DotNetCommon.Filelog/tree/master/samples/SimpleFileLog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

辍学程序员改变世界,这位长得像马云的90后要击败Facebook的扎克伯格了…

全世界只有3.14 % 的人关注了数据与算法之美众所周知&#xff0c;Facebook的创始人扎克伯格&#xff08;Mark Zuckerberg&#xff09;&#xff0c;是史上最年轻的世界亿万富豪。小扎作为社交网络时代的的缔造者&#xff0c;成为了当之无愧的程序员界80后杰出代表。但数据汪今天…

java十六进制大小端转换_字节顺序

1、定义 字节顺序,又称端序或尾序(英语:Endianness),在计算机科学领域中,指电脑内存中或在数字通信链路中,组成多字节的字的字节的排列顺序。 在几乎所有的机器上,多字节对象都被存储为连续的字节序列。 2、表现形式 字节的排列方式有两个通用规则。例如,将一个多位数的…

Android开发入门之学习笔记(三):程序窗口的布局

2019独角兽企业重金招聘Python工程师标准>>> Android应用程序的用户界面可以看作是由View和View Group组成的&#xff0c;从字面意思上就可以看出&#xff0c;View Group是可以包含多个View的。借用官方教程的图可以更容易理解&#xff1a; 说到这里&#xff0c;我…

c#爬虫-解决ChromeDriver 版本问题

问题Selenium c# 进行爬虫时报错 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 84产生问题的原因因为下载的ChromeDriver版本与本地chrome浏览器的版本不一致导致的。因…

用gradle启动java项目_构建Java项目

#构建Java项目#上一节我们简要介绍了如何编写一个单机的To Do应用&#xff0c;接下来要打包部署成可执行的应用&#xff0c;我们需要编译源代码&#xff0c;生成的class文件需要打包到JAR文件中。JDK提供了javac 和jar工具帮助你实现这些任务&#xff0c;但是你也不想每次源代码…

今天,滴滴被爆亏损109亿,需裁员2000多人,哪些员工会被裁掉?

全世界只有3.14 % 的人关注了数据与算法之美近日&#xff0c;一份滴滴出行内部流传出来的财务数据显示&#xff0c;该公司2018年持续巨额亏损&#xff0c;全年亏损高达109亿元人民币。若消息属实&#xff0c;那将说明&#xff0c;自2012年滴滴成立以来就一直处于亏损状态&#…

ftp服务器搭建遇到的问题

FAQ&#xff1a;vsftpd.rpm包安装之后&#xff0c;启动服务&#xff0c;不能在网页里看到pub目录 A&#xff1a; 关闭selinux、iptables服务再试试 FAQ&#xff1a;能看到其他人的家目录&#xff0c;没有成功的把用户锁定到自己的家目录下 A&#xff1a; 配置文件手动更改默认…

C#中Lock的秘密

一、概要本文主要讲解在c#中lock关键字的用法以及需要注意的坑。帮助大家避免使用不当造成的bug。作用&#xff1a;lock 关键字可以用来确保代码块完成运行&#xff0c;而不会被其他线程中断。它可以把一段代码定义为互斥段&#xff08;critical p&#xff09;&#xff0c;互斥…

限时秒杀┃“探月计划”来袭,美国米德天文望远镜助孩子观月赏月

▲数据汪特别推荐点击上图进入玩酷屋孩子对于未知的世界充满了好奇&#xff0c;尤其是对于月亮&#xff0c;总是有问不完的问题。例如月亮上是怎么样的&#xff1f;怎么很多人说十五的月亮十六圆&#xff1f;月亮有动物吗&#xff1f;不是说有月兔吗&#xff1f;月亮怎么有时是…

foreach和IEnumerable+yield和IEnumerator

C#里&#xff0c;foreach可以算是个高一等级的循环&#xff0c;因为想要使用foreach必须实现IEnumberable&#xff0c;然后还需要在这个接口的唯一方法中&#xff0c;用yield return返回元素&#xff0c;才能达到foreach的循环效果。class MyList : IEnumerable{string[] arr …

话里话外:企业管理软件的方案设计要规避哪些风险

博主推荐延展咨询资深顾问 梁云文章 企业管理软件作为帮助企业管理者优化工作流程&#xff0c;改善管理水平的信息化工具&#xff0c;现如今被大多数的企业接受并在不同层面进行了应用。作为企业管理软件的方案设计者&#xff0c;我们必须从企业管理者、软件操作者的不同视…

java使用zmodem_SecureCRT 中使用zmodem和Linux服务器交换文件

注意&#xff1a;Linux在默认安装的情况下是没有sz和rz这两条指令的&#xff0c;rmp包为&#xff1a;lrzsz-xx.xx-xxx.rpm&#xff0c;用rmp –q lrzsz查看是否安装&#xff0c;没有的话安装&#xff1a;命令&#xff1a;rpm –ivh lrzsz-xx.xx-xxx.rpm安装后查看&#xff1a;1…

每次有人来家里,总有人问我这个积木在哪买的

▲数据汪特别推荐点击上图进入玩酷屋作为一名资深积木达人&#xff0c;小木我可是大大小小的积木阅览无数&#xff0c;当然乐高也不会放过&#xff0c;虽然“钱包君”已经是路人了。&#xff08;每月的工资用来买乐高~&#xff09;之前给大家推荐了一款STEAM积木&#xff0c;小…

NET问答: 为什么时间格式 dd/MM/yyyy 转成 DateTime 会报错?

咨询区 Shantanu Gupta&#xff1a;我在项目中碰到了一个需求&#xff0c;需要将字符串格式的 dd/MM/yyyy 转成 DateTime&#xff0c;比如下面这样&#xff1a;class Program{static void Main(string[] args){var str "22/11/2009";DateTime date DateTime.Parse(s…

Gallery with Video

2019独角兽企业重金招聘Python工程师标准>>> 实现较为完整的图片展示和视频播放功能&#xff08;Image and video gallery&#xff09;&#xff0c;在FGallery-iPhone&#xff08; http://code4app.com/codesample/4f67f4546803fa6d45000001&#xff09;代码的基础上…

实用Python库,这几个你认识不?

近几年Python已成为数据科学行业中大火的编程语言。而作为人工智能核心的机器学习&#xff0c;是一门多领域的交叉学科&#xff0c;专门研究计算机模拟或实现人类学习行为的方法&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能。简…

php输出PDF的文件流_怎么用PHP在HTML中生成PDF文件

译文&#xff1a;使用PHP在html中生成PDF译者&#xff1a;dwqs利用PHP编码生成PDF文件是一个非常耗时的工作。在早期&#xff0c;开发者使用PHP并借助FPDF来生成PDF文件。但是如今&#xff0c;已经有很多函数库可以使用了&#xff0c;并且能够从你提供的HTML文件生成PDF文档。这…

手把手教你构建WPF官方开源框架源代码

从去年微软就将 WPF 开源了&#xff0c;差不多现在所有 WPF 的源代码都开源了。在学习框架的时候&#xff0c;我会做一些改动&#xff0c;期望能构建一个自己的版本进行测试。但是作为一个特别大的框架&#xff0c;想要构建跑起来可不是直接在 VisualStudio 里面点击一下运行就…

程序员中的明星,超模or女团都是程序媛

全世界只有3.14 % 的人关注了数据与算法之美程序员改变世界已经有几十年的历史了&#xff0c;程序员出名又神秘——出名的是大家都知道程序员有多厉害&#xff0c;神秘的是外界对程序员的认知不够具体&#xff0c;“格子衫、双肩包、木讷、代码、……”程序员的标签有很多&…

php 实现类,php如何实现类

php如何实现类php实现类的方法是&#xff1a;【class 类名{ }】&#xff0c;如【<?php class Student { }】。类是由属性、方法、常量组成的&#xff0c;类名以字母、下划线开头&#xff0c;后面跟字母、数字、下划线。在PHP中实现类和对象(学习视频推荐&#xff1a;java课…