.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] .......