日志使用

  在程序中合适的地方打印日志是一个必不可少的功能。特别是在做做类似微信接口或者其他徐需要走代理的接口调试时,往往需要通过日志来查看调试信息。当项目上线到生产环境之后,输入错误或者异常到日志更是必不可少的,日志就像飞机的黑匣子,帮助开发人员复盘问题,定位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&quot;.read.log&quot;"/>
    <!--日志根据日期滚动-->
    <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。

版权声明: 本文为智客工坊「楠木大叔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

results matching ""

    No results matching ""