mirror of
https://github.com/langhuihui/monibuca.git
synced 2026-05-09 06:11:02 +08:00
124 lines
3.3 KiB
Markdown
124 lines
3.3 KiB
Markdown
# Logging Mechanism
|
|
|
|
Monibuca uses Go's standard library `slog` as its logging system, providing structured logging functionality.
|
|
|
|
## Log Configuration
|
|
|
|
In the global configuration, you can set the log level through the `LogLevel` field. Supported log levels are:
|
|
|
|
- trace
|
|
- debug
|
|
- info
|
|
- warn
|
|
- error
|
|
|
|
Configuration example:
|
|
|
|
```yaml
|
|
global:
|
|
LogLevel: "debug" # Set log level to debug
|
|
```
|
|
|
|
## Log Format
|
|
|
|
The default log format includes the following information:
|
|
|
|
- Timestamp (format: HH:MM:SS.MICROSECONDS)
|
|
- Log level
|
|
- Log message
|
|
- Structured fields
|
|
|
|
Example output:
|
|
```
|
|
15:04:05.123456 INFO server started
|
|
15:04:05.123456 ERROR failed to connect database dsn="xxx" type="mysql"
|
|
```
|
|
|
|
## Log Handlers
|
|
|
|
Monibuca uses `console-slog` as the default log handler, which provides:
|
|
|
|
1. Color output support
|
|
2. Microsecond-level timestamps
|
|
3. Structured field formatting
|
|
|
|
### Multiple Handler Support
|
|
|
|
Monibuca implements a `MultiLogHandler` mechanism, supporting multiple log handlers simultaneously. This provides the following advantages:
|
|
|
|
1. Can output logs to multiple targets simultaneously (e.g., console, file, log service)
|
|
2. Supports dynamic addition and removal of log handlers
|
|
3. Each handler can have its own log level settings
|
|
4. Supports log grouping and property inheritance
|
|
|
|
Through the plugin system, various logging methods can be extended, for example:
|
|
|
|
- LogRotate plugin: Supports log file rotation
|
|
- VMLog plugin: Supports storing logs in VictoriaMetrics time-series database
|
|
|
|
## Using Logs in Plugins
|
|
|
|
Each plugin inherits the server's log configuration. Plugins can log using the following methods:
|
|
|
|
```go
|
|
plugin.Info("message", "key1", value1, "key2", value2) // Log INFO level
|
|
plugin.Debug("message", "key1", value1) // Log DEBUG level
|
|
plugin.Warn("message", "key1", value1) // Log WARN level
|
|
plugin.Error("message", "key1", value1) // Log ERROR level
|
|
```
|
|
|
|
## Log Initialization Process
|
|
|
|
1. Create default console log handler at server startup
|
|
2. Read log level settings from configuration file
|
|
3. Apply log level configuration
|
|
4. Set inherited log configuration for each plugin
|
|
|
|
## Best Practices
|
|
|
|
1. Use Log Levels Appropriately
|
|
- trace: For most detailed tracing information
|
|
- debug: For debugging information
|
|
- info: For important information during normal operation
|
|
- warn: For warning information
|
|
- error: For error information
|
|
|
|
2. Use Structured Fields
|
|
- Avoid concatenating variables in messages
|
|
- Use key-value pairs to record additional information
|
|
|
|
3. Error Handling
|
|
- Include complete error information when logging errors
|
|
- Add relevant context information
|
|
|
|
Example:
|
|
```go
|
|
// Recommended
|
|
s.Error("failed to connect database", "error", err, "dsn", dsn)
|
|
|
|
// Not recommended
|
|
s.Error("failed to connect database: " + err.Error())
|
|
```
|
|
|
|
## Extending the Logging System
|
|
|
|
To extend the logging system, you can:
|
|
|
|
1. Implement custom `slog.Handler` interface
|
|
2. Use `LogHandler.Add()` method to add new handlers
|
|
3. Provide more complex logging functionality through the plugin system
|
|
|
|
Example of adding a custom log handler:
|
|
|
|
```go
|
|
type MyLogHandler struct {
|
|
slog.Handler
|
|
}
|
|
|
|
// Add handler during plugin initialization
|
|
func (p *MyPlugin) OnInit() error {
|
|
handler := &MyLogHandler{}
|
|
p.Server.LogHandler.Add(handler)
|
|
return nil
|
|
}
|
|
``` |