日志使用
在程序中合适的地方打印日志是一个必不可少的功能。特别是在做做类似微信接口或者其他徐需要走代理的接口调试时,往往需要通过日志来查看调试信息。当项目上线到生产环境之后,输入错误或者异常到日志更是必不可少的,日志就像飞机的黑匣子,帮助开发人员复盘问题,定位bug。
日志模型中的LoggerFactory泛指所有实现了ILoggerFactory接口的所有类型及其对应的对象。如下面的代码片段所示,ILoggerFactory具有两个简单的方法,针对Logger的创建实现在CreateLogger方法中。我们通过调用AddProvider方法将某个LoggerProvider对象注册到LoggerFactory之上,CreateLogger方法创建的Logger需要利用这些注册的LoggerProvider来提供真正具有日志写入功能的Logger对象,并借助后者来完成对日志的写入操作。
日志模型中的三个接口(ILogger、ILoggerProvider和ILoggerFactory)和其中两个的实现者(Logger和LoggerFactory),下图所示的UML体现了它们之间的关系。
在实际项目开发中,通常会采用第三方日志框架,典型的如:NLog、Log4Net,简单介绍Log4Net日志组件的使用。
集成Log4Net组件
在Nuget添加下引用
Microsoft.Extensions.Logging.Log4Net.AspNetCore
安装完成后,在项目的包中可以查看:
注册
在Startup中注册
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//集成Log4net日志
loggerFactory.AddLog4Net();
.....
}
在项目根目录下新建log4net.config文件
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--日志路径-->
<param name="File" value="Logs\\" />
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--log保留天数-->
<param name= "MaxSizeRollBackups" value= "30"/>
<!--日志文件名是否是固定不变的-->
<param name= "StaticLogFileName" value= "false"/>
<!--日志文件名格式为:2008-08-31.log-->
<param name= "DatePattern" value= "yyyy-MM-dd".read.log""/>
<!--日志根据日期滚动-->
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%n==========%n【日志级别】:%-5level%n【记录时间】:%date %n【执行时间】:[%r]毫秒%n【信息详情】%message%n" />
</layout>
</appender>
<!-- 控制台前台显示日志 -->
<appender name="ManagedColoredConsoleAppender" type="log4net.Appender.ManagedColoredConsoleAppender">
<mapping>
<level value="ERROR" />
<foreColor value="Red" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="Yellow" />
</mapping>
<mapping>
<level value="INFO" />
<foreColor value="White" />
</mapping>
<mapping>
<level value="DEBUG" />
<foreColor value="Green" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{ABSOLUTE} [%thread] %-5p %c{1}:%L - %m%n" />
</layout>
</appender>
<root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)-->
<level value="all" />
<appender-ref ref="ManagedColoredConsoleAppender"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
该配置文件默认放在根目,输出的日志文件将会在跟目录XX\jwtdemo\jwt.demo.passport\bin\Debug\netcoreapp3.1\Logs文件夹下。
在控制器中的使用
这里以AccountController为例,首先声明一个ILogger类型对象:
private readonly ILogger<AccountController> _logger;
使用构造函数,将log4net注入到ILogger:
public AccountController(
ILogger<AccountController> logger)
{
_logger = logger;
}
在控制器中的初始化和使用完整代码如下:
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using jwt.demo.common.Http;
using jwt.demo.model.Dto;
using jwt.demo.passport.ViewModel.Response;
using jwt.demo.service;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Logging;
using Microsoft.IdentityModel.Tokens;
namespace jwt.demo.passport.Controllers
{
[Produces("application/json")]
[Route("v1/account")]
public class AccountController : BaseApiController
{
private readonly ILogger<AccountController> _logger;
private readonly IAuthenticateService _authService;
public AccountController(
ILogger<AccountController> logger,
IAuthenticateService authService)
{
_logger = logger;
_authService = authService;
}
/// <summary>
/// 登录
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[HttpPost("login")]
[ProducesResponseType(typeof(ResponseInfo<LoginVM>), 200)]
[AllowAnonymous]
public async Task<IActionResult> Login([FromBody]LoginRequestDTO req)
{
if (!ModelState.IsValid)
{
return BadRequest("Invalid Request");
}
string sToken;
if (_authService.IsAuthenticated(req, out sToken))
{
//记录日志
this._logger.LogInformation($"sToken:{sToken}");
return Ok(sToken);
}
return BadRequest("Invalid Request");
}
}
}
测试一下
我们在account/login方法增加了日志记录,启动webapi,输入:http://localhost:5000/swagger/index.html 通过swagger文档调试。
打开XX\jwtdemo\jwt.demo.passport\bin\Debug\netcoreapp3.1\Logs路径,下面已经生成了日志文件
源码
talk is cheap,show me the code。
- 传送门:源码