.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();

主要的内置参数如下:

  1. Exception - The full exception message and stack trace
  2. Level - The log event level, formatted as the full level name
  3. Message - The log event's message, rendered as plain text.
  4. NewLine - A property with the value of System.Environment.NewLine.
  5. 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的更多相关文章

  1. ThinkPHP报Class 'Core\Log' not found竟然是由这个原因导致的

    项目在开发阶段运行的好好的(Debug=true),上线后(Debug=false)其中有一个页面报“对不起,您的页面暂进无法找到!”错误.摸不清头脑,看看了这个页面也没有什么两样,可就是提示这句话, ...

  2. log的简单说明

    log的简单说明 @(NS3相关)[core][log] NS3中的日志功能是非常完善与灵活,大家有需要显示一些调试或者警告信息时最好使用log,不再使用标准输入来输出中间信息. 头文件:ns3/lo ...

  3. TP框架如何开启log日志

    1. 日志的处理工作是由系统自动进行的,在开启日志记录的情况下,会记录下允许的日志级别的所有日志信息. 其中,为了性能考虑,SQL日志级别必须在调试模式开启下有效,否则就不会记录. 系统的日志记录由核 ...

  4. Linux显示以log结尾的日志文件

    Linux显示以log结尾的日志文件 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ find -name "*.log" find: `. ...

  5. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  6. android adb命令 抓取系统各种 log

    getLog.bat: adb root adb remount adb wait-for-device adb logcat -v time > C:\log.txt 在Android中不同的 ...

  7. EF Core中Join可以进行子查询

    我们来看看下面的代码,这个代码是一个INNER JOIN的EF Core查询,其中用SubCategory表INNER JOIN了SubCategoryLanguage表,但是我们需要在SubCate ...

  8. EF Core 中DbContext不会跟踪聚合方法和Join方法返回的结果,及FromSql方法使用讲解

    EF Core中: 如果调用Queryable.Count等聚合方法,不会导致DbContext跟踪(track)任何实体. 此外调用Queryable.Join方法返回的匿名类型也不会被DbCont ...

  9. EF Core 中多次从数据库查询实体数据,DbContext跟踪实体的情况

    使用EF Core时,如果多次从数据库中查询一个表的同一行数据,DbContext中跟踪(track)的实体到底有几个呢?我们下面就分情况讨论下. 数据库 首先我们的数据库中有一个Person表,其建 ...

随机推荐

  1. C#并行库(TaskParallelLibrary)用法 z

    1. Task.Factory.StartNew(() => DoSomeWork());是异步的 下面的代码会先输出ddd,因为Task.Factory.Startnew不阻塞: var ta ...

  2. OpenGL总结

    最近2D转向3D,也从固定管线转到了可编程管线,有些细节的东西记录一下. Geometry Shader Geometry Shader从Vertex Shader中获取数据,向Fragment Sh ...

  3. nginx安装和基础代理配置

    mac上执行 npm install nginx 安装好后运行nginx sudo nginx 一般mac下nginx会安装在 /usr/local/etc/nginx 下 里面的nginx.conf ...

  4. Github 上一些关于PHP的开源项目

    Github  上一些关于PHP的开源项目,总有你喜欢的那一款 Awesome PHP Package Management Package Management Related Frameworks ...

  5. miniMobile(手机)

    官网:http://www.web2014.cn/

  6. WP | 后台PHP脚本无法修改及服务器无法直接写入问题的解决

    问题描述 试图修改页脚的时候,发现WordPress后台Appearance(外观)选项之下没有Editor(编辑)的子选项,之后进行设置修改后又发现无法保存. 试图安装插件,但是无法直接安装,推测是 ...

  7. asp.net 在repeater控件中加按钮

    在repeater中加入方法有两种方法: 第一种:是对repeater控件的行添加OnItemCommand事件,添加方法也是有两种 1.在设计页面中,选中repeater控件右击==>属性== ...

  8. 【洛谷P1363】幻象迷宫

    P1363 幻想迷宫 显然,若从原图中起点走到相邻的图中对应的"起点"位置 ,就可以无限走下去, 若一个点从原图中可以到达,到了非原图中也可以到达,就可以无限走下去 我们不妨记录下 ...

  9. svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted

    svn提交遇到恶心的问题,可能是因为上次cleanup中断后,进入死循环了. 错误如下: 解决方法:清空svn的队列 1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.d ...

  10. c#中关于结构体和字节数组转化

    最近在使用结构体与字节数组转化来实现socket间数据传输.现在开始整理一下.对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System ...