日志
日志这一块不用一开始就做很复杂。
第一版先把三件事接通就够:
- 开日志组件
- 放
NLog.config - 代码里能正常写日志
先记住这三个角色
Aegis.Core.Logs:把日志能力接进来ILogger<T>:你平时在代码里写日志的方式NLog.config:真正决定日志写到哪里、按什么规则写
最小接入方式
1. 在 Component.deps.json 里启用 Logging
{
"Components": {
"Services": [
"Logging"
]
}
}
2. 在宿主项目里放一个 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">
<targets async="true">
<target name="file"
xsi:type="File"
fileName=".\Logs\${level}\_${shortdate}.log" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
</nlog>
3. 在类里注入 ILogger<T>
public class TestService : ITestService
{
private readonly ILogger<TestService> _logger;
public TestService(ILogger<TestService> logger)
{
_logger = logger;
}
}
日志级别怎么选
| 方法 | 级别 | 常见用途 |
|---|---|---|
LogTrace | Trace | 很细的调试追踪 |
LogDebug | Debug | 调试过程、请求细节 |
LogInformation | Info | 正常业务过程 |
LogWarning | Warn | 预期内的异常或提醒 |
LogError | Error | 异常记录 |
LogCritical | Fatal | 严重故障 |
记录异常时别偷懒
如果你在 catch 里写日志,把 Exception 一起传进去。
try
{
// 业务代码
}
catch (Exception ex)
{
_logger.LogError(ex, "保存失败");
throw;
}
只写字符串,不传异常对象,堆栈通常就没了。
日志里为什么会带 RequestId
只要当前代码走的是 HTTP 请求链路,日志里通常就会带上请求标识。
排查接口问题时,这个字段很好用。
如果你在下面这些场景里看不到 RequestId,通常是正常的:
- 后台任务
- 启动初始化器
- 脱离 HTTP 的脚本流程
怎么判断日志已经接好了
第一版先看这几件事:
Component.deps.json里已经启用LoggingNLog.config已经进了运行目录- 启动后能看到日志文件或控制台日志
- 在 Service 或 Controller 里写的日志能正常输出
常见问题
明明开了 Logging,还是没有日志文件
先查这几项:
Component.deps.json里有没有LoggingNLog.config有没有被复制到运行目录NLog.config里是不是真的定义了 file target- 当前级别是不是把日志过滤掉了
为什么接口日志看不到
很多接口日志是 Debug 级别。
如果规则里最低级别设得太高,就会直接被过滤掉。
想接 Seq 怎么办
如果后面要做远程日志聚合,通常还是通过 NLog 去接 Seq。
具体再看: