Logger Settings
The Logger class configures how MadelineProto logs messages, errors, and debug information.
Overview
use danog\MadelineProto\Settings;
use danog\MadelineProto\Logger;
$settings = new Settings;
$settings->getLogger()
->setType(Logger::FILE_LOGGER)
->setExtra('/var/log/madeline.log')
->setLevel(Logger::LEVEL_VERBOSE);
Logger Types
FILE_LOGGER
Log to a file.
use danog\MadelineProto\Logger;
$settings->getLogger()
->setType(Logger::FILE_LOGGER)
->setExtra('/var/log/madeline.log');
ECHO_LOGGER
Log to stdout (default for CLI).
$settings->getLogger()
->setType(Logger::ECHO_LOGGER);
CALLABLE_LOGGER
Log using a custom callable.
$settings->getLogger()
->setType(Logger::CALLABLE_LOGGER)
->setExtra(function (string $message, int $level) {
// Custom logging logic
error_log("[$level] $message");
});
DEFAULT_LOGGER
Use default logger (ECHO for CLI, FILE for web).
$settings->getLogger()
->setType(Logger::DEFAULT_LOGGER);
NO_LOGGER
Disable logging.
$settings->getLogger()
->setType(Logger::NO_LOGGER);
Log Levels
Control verbosity of logging.
LEVEL_ULTRA_VERBOSE
Log everything including detailed debug info.
$settings->getLogger()->setLevel(Logger::LEVEL_ULTRA_VERBOSE);
LEVEL_VERBOSE
Log detailed information (default).
$settings->getLogger()->setLevel(Logger::LEVEL_VERBOSE);
LEVEL_NOTICE
Log notices and above.
$settings->getLogger()->setLevel(Logger::LEVEL_NOTICE);
LEVEL_WARNING
Log warnings and errors only.
$settings->getLogger()->setLevel(Logger::LEVEL_WARNING);
LEVEL_ERROR
Log errors only.
$settings->getLogger()->setLevel(Logger::LEVEL_ERROR);
LEVEL_FATAL_ERROR
Log only fatal errors.
$settings->getLogger()->setLevel(Logger::LEVEL_FATAL_ERROR);
Methods
setType
Set the logger type.
Returns self for method chaining
use danog\MadelineProto\Logger;
$settings->getLogger()->setType(Logger::FILE_LOGGER);
getType
Get the logger type.
$type = $settings->getLogger()->getType();
Set extra parameter (file path for FILE_LOGGER, callable for CALLABLE_LOGGER).
File path or callable function
Returns self for method chaining
// For FILE_LOGGER
$settings->getLogger()
->setType(Logger::FILE_LOGGER)
->setExtra('/var/log/madeline.log');
// For CALLABLE_LOGGER
$settings->getLogger()
->setType(Logger::CALLABLE_LOGGER)
->setExtra(function (string $message, int $level) {
// Custom handler
});
Get the extra parameter.
$extra = $settings->getLogger()->getExtra();
setLevel
Set logging level.
Returns self for method chaining
use danog\MadelineProto\Logger;
$settings->getLogger()->setLevel(Logger::LEVEL_NOTICE);
getLevel
Get the logging level.
$level = $settings->getLogger()->getLevel();
setMaxSize
Set maximum file size for file logger.
Maximum size in bytes (-1 for unlimited, minimum 25MB)
Returns self for method chaining
// 100MB max file size
$settings->getLogger()->setMaxSize(100 * 1024 * 1024);
// Unlimited size
$settings->getLogger()->setMaxSize(-1);
getMaxSize
Get maximum file size.
$maxSize = $settings->getLogger()->getMaxSize();
Complete Examples
File Logging
use danog\MadelineProto\Settings;
use danog\MadelineProto\Logger;
use danog\MadelineProto\API;
$settings = new Settings;
$settings->getLogger()
->setType(Logger::FILE_LOGGER)
->setExtra('/var/log/telegram-bot.log')
->setLevel(Logger::LEVEL_VERBOSE)
->setMaxSize(100 * 1024 * 1024); // 100MB
$MadelineProto = new API('session.madeline', $settings);
Custom Logger
use danog\MadelineProto\Settings;
use danog\MadelineProto\Logger;
$settings = new Settings;
$settings->getLogger()
->setType(Logger::CALLABLE_LOGGER)
->setExtra(function (string $message, int $level) {
$levelName = match($level) {
Logger::LEVEL_FATAL_ERROR => 'FATAL',
Logger::LEVEL_ERROR => 'ERROR',
Logger::LEVEL_WARNING => 'WARN',
Logger::LEVEL_NOTICE => 'NOTICE',
Logger::LEVEL_VERBOSE => 'VERBOSE',
Logger::LEVEL_ULTRA_VERBOSE => 'DEBUG',
default => 'INFO',
};
$timestamp = date('Y-m-d H:i:s');
error_log("[$timestamp] [$levelName] $message");
// Also send errors to external service
if ($level <= Logger::LEVEL_ERROR) {
// Send to error tracking service
}
})
->setLevel(Logger::LEVEL_NOTICE);
Production Logging
use danog\MadelineProto\Settings;
use danog\MadelineProto\Logger;
$settings = new Settings;
// Only log warnings and errors
$settings->getLogger()
->setType(Logger::FILE_LOGGER)
->setExtra('/var/log/madeline-errors.log')
->setLevel(Logger::LEVEL_WARNING)
->setMaxSize(50 * 1024 * 1024); // 50MB
Development Logging
use danog\MadelineProto\Settings;
use danog\MadelineProto\Logger;
$settings = new Settings;
// Log everything to console
$settings->getLogger()
->setType(Logger::ECHO_LOGGER)
->setLevel(Logger::LEVEL_ULTRA_VERBOSE);
Rotating File Logger
use danog\MadelineProto\Settings;
use danog\MadelineProto\Logger;
$logFile = '/var/log/madeline-' . date('Y-m-d') . '.log';
$settings = new Settings;
$settings->getLogger()
->setType(Logger::FILE_LOGGER)
->setExtra($logFile)
->setLevel(Logger::LEVEL_VERBOSE)
->setMaxSize(10 * 1024 * 1024); // 10MB per file
Logging from EventHandler
Use the logger within your event handler:
use danog\MadelineProto\EventHandler;
use danog\MadelineProto\Logger;
class MyBot extends EventHandler
{
public function onStart(): void
{
// Log at different levels
$this->logger("Bot started", Logger::LEVEL_NOTICE);
$this->logger("Debug info", Logger::LEVEL_VERBOSE);
$this->logger("Warning message", Logger::LEVEL_WARNING);
$this->logger("Error occurred", Logger::LEVEL_ERROR);
}
}
Environment-Based Configuration
use danog\MadelineProto\Settings;
use danog\MadelineProto\Logger;
$settings = new Settings;
$isDevelopment = getenv('APP_ENV') === 'development';
if ($isDevelopment) {
$settings->getLogger()
->setType(Logger::ECHO_LOGGER)
->setLevel(Logger::LEVEL_ULTRA_VERBOSE);
} else {
$settings->getLogger()
->setType(Logger::FILE_LOGGER)
->setExtra('/var/log/madeline.log')
->setLevel(Logger::LEVEL_WARNING)
->setMaxSize(100 * 1024 * 1024);
}
Log Rotation
For production, use system log rotation:
# /etc/logrotate.d/madeline
/var/log/madeline*.log {
daily
rotate 14
compress
delaycompress
notifempty
create 0640 www-data www-data
sharedscripts
}
Best Practices
- Use appropriate log levels for different environments
- Limit file size to prevent disk space issues
- Implement log rotation for long-running bots
- Use CALLABLE_LOGGER for advanced logging (e.g., to external services)
- Never log sensitive data (passwords, tokens, etc.)
- Set WARNING level or higher in production
- Use ULTRA_VERBOSE only for debugging
See Also