您的位置:首页 > 编程语言 > ASP

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger

2016-07-12 00:07 931 查看

本篇是在上一篇的基础上添加日志功能,并记录NLog在Asp.Net Core里的使用方法。


第一部分:默认Logger支持

一、project.json添加日志包引用,并在cmd窗口使用 dotnet restore 命令还原包文件。

{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
},
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.AspNetCore.Mvc": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Logging.Filter": "1.0.0"
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
}
}


二、修改Startup.cs文件,添加命令行窗口和调试窗口的日志记录功能。

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace WebApiFrame
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 注入MVC框架
services.AddMvc();
}

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
// 添加日志支持
loggerFactory.AddConsole();
loggerFactory.AddDebug();

// 添加MVC中间件
app.UseMvc();
}
}
}


三、分别使用VS Code的调试功能和命令行的 dotnet run 命令启动程序,浏览器访问 http://localhost:5000/api/users/1 地址后,可以查看到窗口日志打印信息。



第二部分:Logger日志级别

日志级别从低到高一共六级,默认情况下,控制台上输出的日志会采取下面的格式:



我们在DemoController.cs控制器里演示如何设置和输出对应级别的日志。

一、修改Startup.cs内容,设置日志级别。

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace WebApiFrame
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 注入MVC框架
services.AddMvc();
}

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
// 添加日志支持

// 设置日志最小级别Warning
loggerFactory.AddConsole(LogLevel.Warning);

//loggerFactory.AddDebug();

// 添加MVC中间件
app.UseMvc();
}
}
}


二、修改UsersController.cs文件内容,添加日志输出。

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using WebApiFrame.Models;

namespace WebApiFrame.Controllers
{

[Route("api/[controller]")]
public class UsersController : Controller
{
private ILogger<UsersController> _logger;

public UsersController(ILogger<UsersController> logger){
_logger = logger;
}

[HttpGet("{id}")]
public IActionResult Get(int id)
{
// 演示日志输出
_logger.LogInformation("This is Information Log!");
_logger.LogWarning("This is Warning Log!");
_logger.LogError("This is Error Log!");

var user = new User() { Id = id, Name = "Name:" + id, Sex = "Male" };
return new ObjectResult(user);
}

[HttpPost]
public IActionResult Post([FromBody] User user){
if(user == null){
return BadRequest();
}

// TODO:新增操作
user.Id = new Random().Next(1, 10);
return CreatedAtAction("Get", new { id = user.Id }, user);
}

[HttpPut("{id}")]
public IActionResult Put(int id, [FromBody] User user){
if(user == null){
return BadRequest();
}

// TODO: 更新操作
return new NoContentResult();
}

[HttpDelete("{id}")]
public void Delete(int id){
// TODO: 删除操作

}
}
}


三、cmd窗口执行 dotnet run 命令,浏览器访问 http://localhost:5000/api/users/1 地址,查看cmd窗口日志输出。



或者,使用Filter设置日志级别,重新执行访问并查看日志输出。

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
// 添加日志支持

// 设置日志最小输出级别为Error
loggerFactory.WithFilter(new FilterLoggerSettings()
{
// 设置以命名空间开头的日志的最小输出级别
{ "Microsoft", LogLevel.Warning },
{ "WebApiFrame", LogLevel.Error }
}).AddConsole();

//loggerFactory.AddDebug();

// 添加MVC中间件
app.UseMvc();
}




第三部分:NLog

NLog是一个简单灵活的.Net日志记录类库。相比Log4Net来说,配置要简单许多。

一、project.json添加NLog包引用,并使用 dotnet restore 命令还原包文件。

{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
},
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.AspNetCore.Mvc": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Logging.Filter": "1.0.0",
"NLog.Extensions.Logging": "1.0.0-rtm-alpha2"
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
}
}


二、添加NLog配置文件nlog.config。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Warn"
internalLogFile="internal-nlog.txt">

<!-- define various log targets -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="allfile" fileName="nlog-all-${shortdate}.log"
layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

<target xsi:type="File" name="ownFile-web" fileName="nlog-own-${shortdate}.log"
layout="${longdate}|${logger}|${uppercase:${level}}|  ${message} ${exception}" />

<target xsi:type="Null" name="blackhole" />
</targets>

<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile" />

<!--Skip Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>


三、修改Startup.cs文件内容,添加NLog支持。

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;

namespace WebApiFrame
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 注入MVC框架
services.AddMvc();
}

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
// 添加日志支持
//loggerFactory.AddConsole();
//loggerFactory.AddDebug();

// 添加NLog日志支持
loggerFactory.AddNLog();

// 添加MVC中间件
app.UseMvc();
}
}
}


四、重新执行访问并查看日志输出。

生成的日志文件和内容





第四部分、其他相关内容

最后,同时放开三种日志输出方式,不修改控制器里的任何代码,可以发现将同时以三种方式记录相同的日志内容。

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
// 添加日志支持
loggerFactory.AddConsole();
loggerFactory.AddDebug();

// 添加NLog日志支持
loggerFactory.AddNLog();

// 添加MVC中间件
app.UseMvc();
}



在.Net Core框架里,日志功能主要由 ILoggerFactory, ILoggerProvider, ILogger 这三个接口体现:

ILoggerFactory:工厂接口。只提供注册LoggerProvider的方法和创建单实例Logger对象的方法。

ILoggerProvider:提供真正具有日志输出功能的Logger对象的接口。每一种日志输出方式对应一个不同的LoggerProvider类。

ILogger:Logger接口。Logger实例内部会维护一个ILogger接口的集合,集合的每一项都是由对应的LoggerProvider类注册生成的Logger对象而来。当调用Logger的日志输出方法时,实际是循环调用内部集合的每一个Logger对象的输出方法,所以就能看到上面出现的效果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: