debian-forge-composer/internal/common/echo_logrus.go
2025-07-08 11:38:27 +02:00

210 lines
4.7 KiB
Go

package common
import (
"context"
"encoding/json"
"io"
"runtime"
lslog "github.com/labstack/gommon/log"
"github.com/sirupsen/logrus"
)
// EchoLogrusLogger extend logrus.Logger to implement Echo's Logger interface.
type EchoLogrusLogger struct {
logger *logrus.Logger
ctx context.Context
writer *io.PipeWriter
}
// NewEchoLogrusLogger creates a new EchoLogrusLogger instance. Logger must be closed
// with Close() method to avoid memory leaks.
func NewEchoLogrusLogger(logger *logrus.Logger, ctx context.Context) *EchoLogrusLogger {
return &EchoLogrusLogger{
logger: logger,
ctx: ctx,
writer: logger.Writer(),
}
}
var commonLogger *EchoLogrusLogger
func init() {
commonLogger = NewEchoLogrusLogger(logrus.StandardLogger(), context.Background())
runtime.SetFinalizer(commonLogger, close)
}
func close(l *EchoLogrusLogger) {
l.Close()
}
// Logger returns the common logger configured with logrus StandardLogger and context.Background().
func Logger() *EchoLogrusLogger {
return commonLogger
}
func toEchoLevel(level logrus.Level) lslog.Lvl {
switch level {
case logrus.DebugLevel:
return lslog.DEBUG
case logrus.InfoLevel:
return lslog.INFO
case logrus.WarnLevel:
return lslog.WARN
case logrus.ErrorLevel:
return lslog.ERROR
}
return lslog.OFF
}
func (l *EchoLogrusLogger) Close() {
if l.writer != nil {
l.writer.Close()
l.writer = nil
}
}
func (l *EchoLogrusLogger) Output() io.Writer {
return l.writer
}
func (l *EchoLogrusLogger) SetOutput(w io.Writer) {
// disable operations that would change behavior of global logrus logger.
}
func (l *EchoLogrusLogger) Level() lslog.Lvl {
return toEchoLevel(l.logger.Level)
}
func (l *EchoLogrusLogger) SetLevel(v lslog.Lvl) {
// disable operations that would change behavior of global logrus logger.
}
func (l *EchoLogrusLogger) SetHeader(h string) {
}
func (l *EchoLogrusLogger) Prefix() string {
return ""
}
func (l *EchoLogrusLogger) SetPrefix(p string) {
}
func (l *EchoLogrusLogger) Print(i ...interface{}) {
l.logger.WithContext(l.ctx).Print(i...)
}
func (l *EchoLogrusLogger) Printf(format string, args ...interface{}) {
l.logger.WithContext(l.ctx).Printf(format, args...)
}
func (l *EchoLogrusLogger) Printj(j lslog.JSON) {
b, err := json.Marshal(j)
if err != nil {
panic(err)
}
l.logger.WithContext(l.ctx).Println(string(b))
}
func (l *EchoLogrusLogger) Debug(i ...interface{}) {
l.logger.WithContext(l.ctx).Debug(i...)
}
func (l *EchoLogrusLogger) Debugf(format string, args ...interface{}) {
l.logger.WithContext(l.ctx).Debugf(format, args...)
}
func (l *EchoLogrusLogger) Debugj(j lslog.JSON) {
b, err := json.Marshal(j)
if err != nil {
panic(err)
}
l.logger.WithContext(l.ctx).Debugln(string(b))
}
func (l *EchoLogrusLogger) Info(i ...interface{}) {
l.logger.WithContext(l.ctx).Info(i...)
}
func (l *EchoLogrusLogger) Infof(format string, args ...interface{}) {
l.logger.WithContext(l.ctx).Infof(format, args...)
}
func (l *EchoLogrusLogger) Infoj(j lslog.JSON) {
b, err := json.Marshal(j)
if err != nil {
panic(err)
}
l.logger.WithContext(l.ctx).Infoln(string(b))
}
func (l *EchoLogrusLogger) Warn(i ...interface{}) {
l.logger.WithContext(l.ctx).Warn(i...)
}
func (l *EchoLogrusLogger) Warnf(format string, args ...interface{}) {
l.logger.WithContext(l.ctx).Warnf(format, args...)
}
func (l *EchoLogrusLogger) Warnj(j lslog.JSON) {
b, err := json.Marshal(j)
if err != nil {
panic(err)
}
l.logger.WithContext(l.ctx).Warnln(string(b))
}
func (l *EchoLogrusLogger) Error(i ...interface{}) {
l.logger.WithContext(l.ctx).Error(i...)
}
func (l *EchoLogrusLogger) Errorf(format string, args ...interface{}) {
l.logger.WithContext(l.ctx).Errorf(format, args...)
}
func (l *EchoLogrusLogger) Errorj(j lslog.JSON) {
b, err := json.Marshal(j)
if err != nil {
panic(err)
}
l.logger.WithContext(l.ctx).Errorln(string(b))
}
func (l *EchoLogrusLogger) Fatal(i ...interface{}) {
l.logger.WithContext(l.ctx).Fatal(i...)
}
func (l *EchoLogrusLogger) Fatalf(format string, args ...interface{}) {
l.logger.WithContext(l.ctx).Fatalf(format, args...)
}
func (l *EchoLogrusLogger) Fatalj(j lslog.JSON) {
b, err := json.Marshal(j)
if err != nil {
panic(err)
}
l.logger.WithContext(l.ctx).Fatalln(string(b))
}
func (l *EchoLogrusLogger) Panic(i ...interface{}) {
l.logger.WithContext(l.ctx).Panic(i...)
}
func (l *EchoLogrusLogger) Panicf(format string, args ...interface{}) {
l.logger.WithContext(l.ctx).Panicf(format, args...)
}
func (l *EchoLogrusLogger) Panicj(j lslog.JSON) {
b, err := json.Marshal(j)
if err != nil {
panic(err)
}
l.logger.WithContext(l.ctx).Panicln(string(b))
}
// Write method is heavily used by the stdlib log package and called
// from the weldr API.
func (l *EchoLogrusLogger) Write(p []byte) (n int, err error) {
return l.writer.Write(p)
}