# Logging

Using `print()` statements are okay for debugging, but it quickly leads to a mess of log messages which makes debugging increasing difficult as the `here!!!` that you're searching for gets buried by a mountain of other similarly-ambiguous messages (we've all been there). As you slowly move to make your bot production-ready, simply using `print()`s for logging isn't sustainable. Many logging packages were created precisely to solve this problem, providing semantic logging and logging to various transports (not just your console).

{% hint style="info" %}
**Logging Transports**

You might be used to viewing logs streamed into your console, but on a server, that might be difficult or even impossible. Besides, you can't be constantly viewing the logs as they stream in from your server to debug a problem reported by one of your customers xD.

Logging transports are the solution to that, allowing the logs to be persisted to disk or even streamed to various logging services for analysis. SwiftLog provides the ability to log to various "backends" or transports, of which a few notable implementations are listed in [this table](https://github.com/apple/swift-log#selecting-a-logging-backend-implementation-applications-only).
{% endhint %}

## SwiftLog

A logging solution for Swift built by Apple themselves, it's a perfect solution for logging in Swift. Being both lightweight and providing a wide variety of logging transports, it's the logging solution I'd recommend for your Swift Discord bot. An example of a "kitchen sink" Discord bot built with DiscordKit that also uses SwiftLog is available in [this repository](https://github.com/SwiftcordApp/DiscordKitBotDemo).&#x20;

## Semantic Logging

Using a dedicated logging solution is definitely an improvement over littering `print()`s everywhere, but logs that do not follow a specific style are also difficult to analyse and interpret with utilities. I'd strongly recommend following [semantic logging](https://www.swift.org/server/guides/libraries/log-levels.html#structured-logging-semantic-logging) guidelines for the cleanest logs.

## What About DiscordKit?

Well, I'd be quite the hypocrite to recommend these practices and not follow them myself. Thankfully, DiscordKit itself fully uses SwiftLog for all logging and follows Semantic Logging as far as possible! You might notice that logging messages from DiscordKit look a little different, now you know why!

{% hint style="info" %}
Are DiscordKit's logs too verbose? At the moment, DiscordKit is set to `trace` if the binary is built in **debug mode**, which displays log messages of all levels. However, the log level will be set to `info` if the binary is built in **release mode**, which filters out all log messages below the `info` level. That significantly decreases the verbosity of logs.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://swiftcord.gitbook.io/discordkit-guide/enhancements/logging.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
