Table of Contents

日志框架 Serilog

先决条件

安装 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 output

在其它位置使用此日志记录器

至此,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 中配置 LogLevelDebug,转而在 Serilog 中配置 MinimumLevel

同时配置两侧的最低日志级别可能会导致预期之外的最低日志级别控制结果。