日志
目前日志使用的是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方案,Controller
、Services
、Repository
这几层都是默认注入到容器内的,甚至是Request
的Validator
都可以使用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))]
- 全局添加
services.AddMvc(options => { options.Filters.Add(typeof(RequestLogFilter)); });