日志

目前日志使用的是NLog方案,使用方式还是基于微软提供的ILogger方案。

引入日志

在安装Aegis.Core.Logs的包后,在对应的Webapi的Program下注入即可使用Log方案

Component.deps.json中的Services节点中确定包含了Logging

并且在Webapi项目下建立NLog.config文件,最基本的内容如下,该配置文件会将日志记录到程序运行目录下的Logs文件夹下的log文件中,并且显示到控制台上。

<?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">
    <targets async="true">
        <target name="coloredConsole" xsi:type="ColoredConsole" useDefaultRowHighlightingRules="false"
        layout="${longdate}|${pad:padding=5:inner=${level:uppercase=true}}|${message}" >
            <highlight-row condition="level == LogLevel.Debug" foregroundColor="DarkGray" />
            <highlight-row condition="level == LogLevel.Info" foregroundColor="Gray" />
            <highlight-row condition="level == LogLevel.Warn" foregroundColor="Yellow" />
            <highlight-row condition="level == LogLevel.Error" foregroundColor="Red" />
            <highlight-row condition="level == LogLevel.Fatal" foregroundColor="Red" backgroundColor="White" />
        </target>
        <target name="file" xsi:type="File"
                archiveAboveSize="102400"
            layout="${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}"
            fileName=".\Logs\${level}\_${shortdate}.log" />
    </targets>
    <rules>
    <logger name="Microsoft.*" maxlevel="Warning" final="true" />

    <logger name="*" minlevel="debug" writeTo="file" />
    <logger name="*" minlevel="info" writeTo="coloredConsole" />
    </rules>
</nlog>

只要当前使用类是注册在容器中可以使用Log方案,ControllerServicesRepository这几层都是默认注入到容器内的,甚至是RequestValidator都可以使用Log方案。当需要其他类使用日志的情况则需要注入到容器中,注入部分请参考后续的如何注入新服务的文档

配置节点说明

同步/异步记录

<targets async="true">

在上述配置里的Targets节点,可以配置日志是同步还是异步记录,默认不加async属性的情况下是同步async="true"则为异步

同步记录情况下在生产环境下极可能造成接口卡顿,建议在生产环境使用异步记录。

异步记录会延迟记录,请求完之后可能并不能立马在日志系统/文件里看到,需要注意这一点,如果需要测试日志是否可用,可以在开发/测试环境下去掉async,这样就能立马看到记录的日志。

日志目标和目标级别

<logger name="*" minlevel="debug" writeTo="file" />

logger节点里可以调整对应日志目标的最低级别,该属性为minlevel,属性值可以参考下面的日志等级表格。

需要注意的是,目前Aegis框架提供的请求/响应日志的级别是Debug,如果设置级别为Info及以上是无法记录请求/响应日志的。

如何获取Logger

在构造方法的参数里标注ILogger<XXX> logger就可以获取到当前类对应的logger类。XXX为当前类的类名。

public class TestService : ITestService
{
    private readonly ILogger _logger;
    ...

    public TestService(ILogger<TestService> logger,...)
    {
        _logger = logger;
    }
}


日志等级

实际使用日志的情况多种多样,我们往往要给日志定义具体的等级,当前日志提供了LogXxx()的方法来方便我们快速记录对应等级的日志。

方法名 日志等级 说明
LogTrace Trace 追踪日志,往往包含像是连接字符串之类的敏感日志,一般由框架捕获使用,业务中不使用该等级
LogDebug Debug 调试方法用的日志,常见的在测试环境记录的每个步骤的耗时日志就可以使用该等级
LogInformation Info 最常见的业务日志记录级别,各层级记录追踪日志就使用该等级
LogWarning Warn 出现业务验证失败,或者业务走向了不合理的情况才记录
LogError Error 出现异常时使用该方法,可以由框架捕获,也可在主动Catch中记录
LogCritical Fatal 不允许在业务中使用该方法,该等级意味着整个程序已经崩溃,由框架捕获

如何控制当前程序内记录的最低级别

在appsettings.json的文件里,可以看到下列的Logging配置,通过修改Default的日志级别来控制记录的最低级别。如果未设置默认日志级别,则默认的日志级别值为 Information

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
  ...
}

异常日志记录

当记录异常时,请务必确保日志记录时不丢失Exception

try
{
    ...
}
catch(Exception ex)
{
    _logger.LogError(ex,"...");
    ...
}

远程日志

这部分暂时会使用Seq来做追踪,具体请参见Seq使用手册

接口日志

目前接口日志由Aegis.Core.Infrastructure包下的RequestLogFilter提供(注意最低版本为1.1.0

注意: 接口日志级别均为Debug

接口日志记录了请求和响应的内容。格式如下

2023-12-12 15:42:35.3242|DEBUG|
[161f541e-934b-4b59-8cd3-f102581c1ecb] - Requesting User/TestResponse,请求IP192.168.1.103,
请求入参:{  "name": "string",  "age": 0}

2023-12-12 15:42:37.3107|DEBUG|
[161f541e-934b-4b59-8cd3-f102581c1ecb] - Response User/TestResponse,请求IP:192.168.1.103,接口时长:1913.2677,
返回结果:{"Result":{"Name":"张三","Age":14},"Code":200,"MessageType":40,"Message":"OK"}

使用方式

  • TypeFilter 可添加到Controller或者具体的Action
    [TypeFilter(typeof(RequestLogFilter))]
    

image.png

  • 全局添加
    services.AddMvc(options =>  
    {  
      options.Filters.Add(typeof(RequestLogFilter));  
    });
    

results matching ""

    No results matching ""