介绍

根据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
InternalLogFile FileLog内部异常时输出的日志位置,支持相对路径和绝对路径 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.log 10485760,即:10M

注意:

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

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

7. 示例工程

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

日志组件DotNetCommon.Filelog相关推荐

  1. C#组件系列——又一款日志组件:Elmah的学习和分享

    前言:好久没动笔了,都有点生疏,12月都要接近尾声,可是这月连一篇的产出都没有,不能坏了"规矩",今天还是来写一篇.最近个把月确实很忙,不过每天早上还是会抽空来园子里逛逛.一如既往 ...

  2. 两个组件连线_如何正确的使用日志组件 Log4j、SLF4J、Logback

    来源:http://t.cn/EVpprGI 相信目前大多数情况下,不管是开源框架或是平时工作编码中都离不开一种框架,它就是日志框架,本文了解一下我们常用日志框架的区别及如何正确的使用. 1.Comm ...

  3. 日志组件logback的介绍及配置使用方法

    2019独角兽企业重金招聘Python工程师标准>>> 一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logb ...

  4. ASP.NET Core 2.0 配置NLog日志组件

    2019独角兽企业重金招聘Python工程师标准>>> 1).添加nlog.config配置文件 <?xml version="1.0" encoding= ...

  5. SpringBoot笔记:SpringBoot2.3集成Logback日志组件配置

    文章目录 Logback简介 简介 日志级别 日志分类 Logback使用 添加依赖 配置Logback Logback参数解释 1.根节点configuration包含属性 2.根节点configu ...

  6. 日志组件logback介绍及配置使用方法

    转载于:http://sunney2010.iteye.com/blog/1404729 一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三 ...

  7. ASP.NET使用log4Net日志组件教程(按日期与按日志大小切割)

    对于一个大型网站与系统来说,日志是必备的工具,通过日志你可以非常清楚程序的运行情况,及时得到反馈来解决问题,下面介绍ASP.NET版本的log4Net日志组件是个非常强大的工具,最新版本for .ne ...

  8. Yii源码阅读笔记 - 日志组件

    2015-03-09 一 By youngsterxyf 使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category); Yii: ...

  9. 如何扩展分布式日志组件(Exceptionless)的日志通知?

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...

最新文章

  1. 水稻微生物组时间序列分析2a-相关分析
  2. LR11之web_reg_find文本检查点的使用
  3. java synchronized 参数_个人对synchronized锁的参数理解,如果有误望指出
  4. android cts 编译,使用 Android studio 分析运行 CTS 用例
  5. java 乐观锁 实例_JAVA乐观锁实现-CAS(示例代码)
  6. Kafka冷门知识——主题删除背后的秘密
  7. 【数位DP】B-number(HDU 3652)
  8. C语言弧长,在C ++中从给定角度的弧长?
  9. Java 中接口 interface 实例介绍
  10. python适用的操作系统是什么_学习Python一般使用什么操作系统?
  11. jquery获取前一个月日期
  12. 【java】java 使用 Unsafe CAS 实现数据递增 打印重复问题
  13. Java定时器的cron设置详解Quartz
  14. 入门篇:函数计算中角色和访问策略的讲解
  15. 必须要掌握的七种谈话技巧
  16. 17 行代码实现的简易 Javascript 字符串模板
  17. 新观察:企业将全面上云 披露“云计算支出”会是新常态
  18. 小区疫情防控应对策略
  19. TQ2440 mifi驱动及开机自动连接wifi全过程
  20. 计算机考试去底纹,2018年职称计算机考试word2003考点边框和底纹

热门文章

  1. (太棒了)程序员的十个层次 你属于哪一层?
  2. 彻底删除 XP 自带的 Windows Messenger方法
  3. android 自定义menu背景,Android编程实现自定义系统菜单背景的方法
  4. xxl-job源码分析
  5. Java 打飞机(小游戏)[版权非本人 本人制作收藏整理]
  6. 安卓虚拟机与Hyper-V冲突
  7. python-list:列表-元组-字符串
  8. selenium+python笔记3
  9. Android开发最佳实践《IT蓝豹》
  10. 40个最好的Tumblr主题