日志框架 Serilog
先决条件
- 如 使用 Kook.Net 构建你的第一个 Bot 中所描述的带有日志处理方法的 Bot 客户端程序。
安装 Serilog 类库
可通过集成开发环境的用户界面或 dotnet CLI 安装以下类库:
名称 | 链接 |
---|---|
Serilog.Extensions.Logging |
链接 |
Serilog.Sinks.Console |
链接 |
配置 Serilog
Serilog 需在异步函数入口点的顶部进行配置:
using Kook;
using Serilog;
using Serilog.Events;
public class Program
{
private KookSocketClient _client;
public static Task Main(string[] args) => new Program().MainAsync();
public async Task MainAsync()
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
_client = new KookSocketClient();
_client.Log += LogAsync;
// 将 Token 写入字符串变量,用于 Bot 登录过程的身份认证
// 这很不安全,尤其是在有公开源代码的情况下,不应该这么做
var token = "token";
// 一些其它存储 Token 的方案,如环境变量、文件等
// var token = Environment.GetEnvironmentVariable("NameOfYourEnvironmentVariable");
// var token = File.ReadAllText("token.txt");
// var token = JsonConvert.DeserializeObject<AConfigurationClass>(File.ReadAllText("config.json")).Token;
await _client.LoginAsync(TokenType.Bot, token);
await _client.StartAsync();
// Block this task until the program is closed.
await Task.Delay(Timeout.Infinite);
}
}
修改日志方法
要想让 Serilog 能够正确地记录 KOOK 的日志,需要将 Kook.Net 的 LogSeverity
映射到 Serilog 的 LogEventLevel
,映射的示例如下:
private static async Task LogAsync(LogMessage message)
{
var severity = message.Severity switch
{
LogSeverity.Critical => LogEventLevel.Fatal,
LogSeverity.Error => LogEventLevel.Error,
LogSeverity.Warning => LogEventLevel.Warning,
LogSeverity.Info => LogEventLevel.Information,
// Serilog 中,LogEventLevel.Verbose 相比 LogEventLevel.Debug 会输出更多的信息
LogSeverity.Verbose => LogEventLevel.Debug,
LogSeverity.Debug => LogEventLevel.Verbose,
_ => LogEventLevel.Information
};
Log.Write(severity, message.Exception, "[{Source}] {Message}", message.Source, message.Message);
await Task.CompletedTask;
}
测试
如果现在运行程序,应该会看到以下输出:
在其它位置使用此日志记录器
至此,Serilog 已配置完毕,要想使用此日志记录器,只需按如下方式调用:
Log.Debug("Your log message, with {Variables}!", 10);
// 这将输出信息:"[20:36:00 DBG] Your log message, with 10!"
Note
根据所配置的日志级别,部分日志消息可能不会输出。有关日志级别的更多信息,请参见 Serilog 文档。
Note
Kook.Net 与 Serilog 对日志级别的定义不完全一致,要简化最低输出日志级别控制,有两种可选策略:
- 将 Serilog 的
MinimumLevel
配置为Verbose
,转而在 Kook.Net 的KookConfig
中配置LogLevel
- 在 Kook.Net 的
KookConfig
中配置LogLevel
为Debug
,转而在 Serilog 中配置MinimumLevel
同时配置两侧的最低日志级别可能会导致预期之外的最低日志级别控制结果。