跳到主要内容
版本:3.0.0

日志

日志这一块不用一开始就做很复杂。
第一版先把三件事接通就够:

  • 开日志组件
  • 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;
}
}

日志级别怎么选

方法级别常见用途
LogTraceTrace很细的调试追踪
LogDebugDebug调试过程、请求细节
LogInformationInfo正常业务过程
LogWarningWarn预期内的异常或提醒
LogErrorError异常记录
LogCriticalFatal严重故障

记录异常时别偷懒

如果你在 catch 里写日志,把 Exception 一起传进去。

try
{
// 业务代码
}
catch (Exception ex)
{
_logger.LogError(ex, "保存失败");
throw;
}

只写字符串,不传异常对象,堆栈通常就没了。

日志里为什么会带 RequestId

只要当前代码走的是 HTTP 请求链路,日志里通常就会带上请求标识。
排查接口问题时,这个字段很好用。

如果你在下面这些场景里看不到 RequestId,通常是正常的:

  • 后台任务
  • 启动初始化器
  • 脱离 HTTP 的脚本流程

怎么判断日志已经接好了

第一版先看这几件事:

  • Component.deps.json 里已经启用 Logging
  • NLog.config 已经进了运行目录
  • 启动后能看到日志文件或控制台日志
  • 在 Service 或 Controller 里写的日志能正常输出

常见问题

明明开了 Logging,还是没有日志文件

先查这几项:

  1. Component.deps.json 里有没有 Logging
  2. NLog.config 有没有被复制到运行目录
  3. NLog.config 里是不是真的定义了 file target
  4. 当前级别是不是把日志过滤掉了

为什么接口日志看不到

很多接口日志是 Debug 级别。
如果规则里最低级别设得太高,就会直接被过滤掉。

想接 Seq 怎么办

如果后面要做远程日志聚合,通常还是通过 NLog 去接 Seq。
具体再看: