π Logger
Effective logging is key to understanding and debugging your Robo.js projects. While you can use JavaScript's native console.log
, Robo.js offers a more advanced logger
object for enhanced logging capabilities.
Logs created using logger are not only prettified but also offer additional benefits like custom log levels, custom drains, and integration with your Robo's /dev
commands and error replies.
Using the Logger πͺβ
The logger is available as a global object in your Robo.js project:
import { logger } from 'robo.js'
logger.info('Hello World!')
Creating a Logger πͺ΅β
Create a new Logger instance:
import { Logger } from 'robo.js'
const customLogger = new Logger()
You can pass configuration options during instantiation:
const customLogger = new Logger({
level: 'debug', // Set log level
prefix: 'DiscordLogger', // Prefix For Logs
maxEntries: 200 // Default: 100
})
We do not recommend creating your own own Logger instance. Instead, use the default logger
instance provided by Robo.js.
Logging Messages βοΈβ
The Logger provides various log methods to log messages at different levels:
logger.debug('Debugging message')
logger.info('Info message')
logger.warn('Warning message')
logger.error('Error message')
logger.other('3rd Party message')
logger.event('Event Patched message')
The log level determines which messages get logged.
Log Levels ποΈβ
The available log levels are:
trace
- Very detailed debugging messagesdebug
- Debugging messagesinfo
- Informational messageswarn
- Warning messageserror
- Error messages
The default level is info
.β
Changing Log Levelβ
Change the log level dynamically:
logger.level = 'debug' // Enable debug logs
Creating Child Loggers π£β
You can create namespaced child loggers using logger.fork()
:
const dbLogger = logger.fork('database')
dbLogger.info('Connection Initiated!')
This prefixes all logs with "database"
This is especially useful in plugins or modules where you want to identify the source of the log easily.
Flushing Logs π½β
You can manually flush pending logs:
await logger.flush()
This ensures all buffered log writes finish before proceeding.
Get Recent Logs π‘β
Retrieve an array of recent log entries from the logger's buffer.
const recentLogs = logger.getRecentLogs()
You can also specify the number of recent logs to retrieve by passing the count
parameter:
const recent20Logs = logger.getRecentLogs(20) // Default: 50
This allows you to customize the length of the retrieved log entries, providing flexibility based on your debugging and analysis needs.
Custom Drainsβ
A unique feature of the Robo.js logger is the ability to define custom drains. A drain is essentially a target where your logs are sent. By default, logs are sent to the console, but you can configure custom drains to redirect them to external logging services or files.
Our official plugin @roboplay/plugin-better-stack
forwards logs to Better Stack Logs for a more user-friendly interface and efficient log searching.
Setting a Custom Drainβ
You can set a new log drain using the setDrain()
function or by specifying it in the logger configuration.
Method 1: Using setDrain()
Function
import { logger } from 'robo.js'
function customDrain(logger, level, ...data) {
// Your custom drain logic
}
logger.setDrain(customDrain)
Method 2: Specifying in the Logger Constructor
import { Logger } from 'robo.js'
const logger = new Logger({
drain: customDrain
})
Method 3: In the robo.mjs
Configuration
// robo.mjs
export default {
logger: {
drain: customDrain
}
}
The default drain function looks like this:
function consoleDrain(logger, level, ...data) {
// Default drain logic
}
Optimized Logging for Robo.jsβ
Robo.js's logger is optimized for asynchronous operation, ensuring better performance and reliability. It writes logs in parallel and maintains a flush queue to ensure all logs are written, even if the Robo crashes. This optimization is crucial for capturing every detail of your Robo's operation, especially in critical situations.
Additionally, logs from the logger are integrated into the /dev logs
command and error replies, enabling in-Discord debugging. This feature allows for efficient troubleshooting without the need to switch between different environments.