Table of Contents

Logging in Discord.Net

Discord.Net's clients provide a log event that all messages will be dispatched over.

For more information about events in Discord.Net, see the Events section.

Warning

Due to the nature of Discord.Net's event system, all log event handlers will be executed synchronously on the gateway thread. If your log output will be dumped to a Web API (e.g., Sentry), you are advised to wrap your output in a Task.Run so the gateway thread does not become blocked while waiting for logging data to be written.

Usage in Client(s)

To receive log events, simply hook the Discord client's Log to a Task with a single parameter of type LogMessage.

It is recommended that you use an established function instead of a lambda for handling logs, because most addons accept a reference to a logging function to write their own messages.

Usage in Commands

Discord.Net's CommandService also provides a Log event, identical in signature to other log events.

Data logged through this event is typically coupled with a CommandException, where information about the command's context and error can be found and handled.

Sample

using Discord;
using Discord.WebSocket;

public class LoggingService
{
    public LoggingService(DiscordSocketClient client, CommandService command)
    {
        client.Log += LogAsync;
        command.Log += LogAsync;
    }
    private Task LogAsync(LogMessage message)
    {
        if (message.Exception is CommandException cmdException)
        {
            Console.WriteLine($"[Command/{message.Severity}] {cmdException.Command.Aliases.First()}"
                + $" failed to execute in {cmdException.Context.Channel}.");
            Console.WriteLine(cmdException);
        }
        else 
            Console.WriteLine($"[General/{message.Severity}] {message}");

        return Task.CompletedTask;
    }
}