.NET CORE LOG
.NET CORE LOG
合格的应用程序不仅要求运行的高效和计算的准确,稳定及可靠性也要得到满足,同事,系统的可维护性也相当重要。谈及到可维护性,就必须涉及到系统运行状态的监控和异常的快速定位与跟踪。系统日志的实现主要就是为了这两个方面。良好的日志记录可以提供我们足够多的数据以及信息来支持系统的稳定性运行。
Serlog
.NET Core 提供了内置的日志模块,用来支撑日志系统的建立。当然也可以使用自己喜爱日志框架来进行记录日志,常见的第三方日志库有Serilog,elmah.io,NLog等,这里使用Serlog来记录日志。Serilog 是一种非常简便记录log 的处理方式,能够方便的生成本地文件,同事Serlog支持异步的输出日志,引入以下对应的三个类库
Serilog.Extensions.Logging
Serilog.Sinks.RollingFile
Serilog.Sinks.Async
格式定义
日志信息的记录要适当精简,既能够快速及简单的定位系统问题,而又不产生过多的无用信息,过多的无用信息不但对系统分析起不到什么作用,反而会增加系统的运行压力、消耗系统的运行资源。因此,支持日志信息的格式的定义就显得十分的重要。Serlog通过使用outputTemplate参数来定制化日志格式,例如
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(outputTemplate:
"{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}")
.CreateLogger();
主要的内置参数如下:
- Exception - The full exception message and stack trace
- Level - The log event level, formatted as the full level name
- Message - The log event's message, rendered as plain text.
- NewLine - A property with the value of System.Environment.NewLine.
- TimeStamp - The event's timestamp, as a DateTimeOffset.
等级输出
日志等级通常分为:DEBUG、INFO、WARN、ERROR
- DEBUG:系统调试信息,通常用于开发过程中对系统运行情况的监控,在实际运行环境中不进行输出。
- INFO: 系统运行的关键性信息,通常用于对系统运行情况的监控。
- WARN:告警信息,系统存在潜在的问题,有可能引起运行异常,但此时并未产生异常。
- ERROR:系统错误信息,需要进行及时处理和优化。
不同的等级对应不同的系统运行状态,通常而言,不同的状态信息输出到对应的文件中,对系统进行分析,能达到事半功倍的效果。Serilog中使用Filter.ByIncludingOnly方法来实现输出日志到不同的文件中,例如:
var baselogger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Logger(fileLogger => fileLogger
.Filter.ByIncludingOnly(p => p.Level.Equals(LogEventLevel.Debug))
.WriteTo.RollingFile(@"logs/log-{Date}-Debug.txt"));
示例
首先在创建的MVC站点的Stratup方法中配置对应Serilog
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.MinimumLevel.Override("System", LogEventLevel.Information)
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Debug).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Debug.txt")
))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Information).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Information.txt")
))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Warning).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Warning.txt")
))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Error).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Error.txt")
))
.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Fatal).WriteTo.Async(
a => a.RollingFile("logs/log-{Date}-Fatal.txt")
))
.CreateLogger();
其次,在Configure方法中注册Serilog
loggerFactory.AddSerilog();
接着在HomeController的Index方法中手工调用记录错误日志
public ActionResult Index()
{
Log.Logger.Error("This is index -- error.");
return View();
}
运行代码,在本地logs文件夹下出现log-20170710-Error.txt文件,内容如下:
2017-07-13 20:47:44.143 +08:00 [Error] .......
.NET CORE LOG的更多相关文章
- ThinkPHP报Class 'Core\Log' not found竟然是由这个原因导致的
项目在开发阶段运行的好好的(Debug=true),上线后(Debug=false)其中有一个页面报“对不起,您的页面暂进无法找到!”错误.摸不清头脑,看看了这个页面也没有什么两样,可就是提示这句话, ...
- log的简单说明
log的简单说明 @(NS3相关)[core][log] NS3中的日志功能是非常完善与灵活,大家有需要显示一些调试或者警告信息时最好使用log,不再使用标准输入来输出中间信息. 头文件:ns3/lo ...
- TP框架如何开启log日志
1. 日志的处理工作是由系统自动进行的,在开启日志记录的情况下,会记录下允许的日志级别的所有日志信息. 其中,为了性能考虑,SQL日志级别必须在调试模式开启下有效,否则就不会记录. 系统的日志记录由核 ...
- Linux显示以log结尾的日志文件
Linux显示以log结尾的日志文件 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ find -name "*.log" find: `. ...
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- android adb命令 抓取系统各种 log
getLog.bat: adb root adb remount adb wait-for-device adb logcat -v time > C:\log.txt 在Android中不同的 ...
- EF Core中Join可以进行子查询
我们来看看下面的代码,这个代码是一个INNER JOIN的EF Core查询,其中用SubCategory表INNER JOIN了SubCategoryLanguage表,但是我们需要在SubCate ...
- EF Core 中DbContext不会跟踪聚合方法和Join方法返回的结果,及FromSql方法使用讲解
EF Core中: 如果调用Queryable.Count等聚合方法,不会导致DbContext跟踪(track)任何实体. 此外调用Queryable.Join方法返回的匿名类型也不会被DbCont ...
- EF Core 中多次从数据库查询实体数据,DbContext跟踪实体的情况
使用EF Core时,如果多次从数据库中查询一个表的同一行数据,DbContext中跟踪(track)的实体到底有几个呢?我们下面就分情况讨论下. 数据库 首先我们的数据库中有一个Person表,其建 ...
随机推荐
- 基于alpine定制常用命令镜像
FROM alpine RUN apk update RUN apk add curl coreutils 像busybox.alpine镜像date命令都不是完整版的,不能执行加减的操作(date ...
- HttpClient拉取连载小说
上午刚入手的小说,下午心血来潮想从网站上拉取下来做成电子书,呵呵,瞎折腾-说做就做- [抓包] 这一步比什么都重要,如果找不到获取真正资源的那个请求,就什么都不用做了- 先是打算用迅雷把所有页面都下载 ...
- May 24th 2017 Week 21th Wednesday
Always remember that you are absolutely unique. 永远记住,你是独一无二的. I am unique, in the way that all I do ...
- win8中 用office 提示值不在预期的范围内
原文:http://bbs.kafan.cn/thread-1401951-1-1.htmlhttp://bbs.kafan.cn/thread-1401951-1-1.html 错误如下: 名称: ...
- C4C Cloud Application Studio做ABSL开发的一些性能方面的最佳实践
Stefan Hagen在博文SAP Cloud Application Studio Performance Best Practices里介绍了在C4C里使用Cloud Application S ...
- OC static 和函数
#include <stdio.h> // 定义一个one函数 // 完整地定义一个外部函数需要extern关键字 //extern void one() { // printf(&quo ...
- 【转】Android手机分辨率基础知识(DPI,DIP计算)
1.术语和概念 术语 说明 备注 Screen size(屏幕尺寸) 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 摩托罗拉milestone手机是3.7英寸 A ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 4 - Find Integer 【费马大定理+构造勾股数】
Find Integer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- 一篇博客:分类模型的 Loss 为什么使用 cross entropy 而不是 classification error 或 squared error
https://zhuanlan.zhihu.com/p/26268559 分类问题的目标变量是离散的,而回归是连续的数值. 分类问题,都用 onehot + cross entropy traini ...
- Java之生成条形码、PDF、HTML
关于Java生成HTML,可参考我的这篇文章:FreeMarker之根据模型生成HTML代码 当然了,该篇文章也会给你很多启发,比如,根据html生成html,大家不要小看这个,著名的WordPres ...