Full Mattermost server source with integrated Community Enterprise features. Includes vendor directory for offline/air-gapped builds. Structure: - enterprise-impl/: Enterprise feature implementations - enterprise-community/: Init files that register implementations - enterprise/: Bridge imports (community_imports.go) - vendor/: All dependencies for offline builds Build (online): go build ./cmd/mattermost Build (offline/air-gapped): go build -mod=vendor ./cmd/mattermost 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
78 lines
1.7 KiB
Go
78 lines
1.7 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package human
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type LogrusWriter struct {
|
|
logger *logrus.Logger
|
|
}
|
|
|
|
func (w *LogrusWriter) Write(e LogEntry) {
|
|
if e.Level == "" {
|
|
fmt.Fprintln(w.logger.Out, e.Message)
|
|
return
|
|
}
|
|
|
|
lvl, err := logrus.ParseLevel(e.Level)
|
|
if err != nil {
|
|
fmt.Fprintln(w.logger.Out, err)
|
|
lvl = logrus.TraceLevel + 1 // will invoke Println
|
|
}
|
|
|
|
logger := w.logger.WithTime(e.Time)
|
|
|
|
if e.Caller != "" {
|
|
// logrus has a system of reporting the caller, but there's no easy way to override it
|
|
logger = logger.WithField("caller", e.Caller)
|
|
}
|
|
|
|
for _, field := range e.Fields {
|
|
logger = logger.WithField(field.Key, field.Interface)
|
|
}
|
|
|
|
switch lvl {
|
|
case logrus.PanicLevel:
|
|
// Prevent panic from causing us to exit
|
|
defer func() {
|
|
_ = recover()
|
|
}()
|
|
logger.Panic(e.Message)
|
|
case logrus.FatalLevel:
|
|
logger.Fatal(e.Message)
|
|
case logrus.ErrorLevel:
|
|
logger.Error(e.Message)
|
|
case logrus.WarnLevel:
|
|
logger.Warn(e.Message)
|
|
case logrus.InfoLevel:
|
|
logger.Info(e.Message)
|
|
case logrus.DebugLevel:
|
|
logger.Debug(e.Message)
|
|
case logrus.TraceLevel:
|
|
logger.Trace(e.Message)
|
|
default:
|
|
logger.Println(e.Message)
|
|
}
|
|
}
|
|
|
|
func NewLogrusWriter(output io.Writer) *LogrusWriter {
|
|
w := new(LogrusWriter)
|
|
w.logger = logrus.New()
|
|
w.logger.SetLevel(logrus.TraceLevel) // don't filter any logs
|
|
w.logger.ExitFunc = func(int) {} // prevent Fatal from causing us to exit
|
|
w.logger.SetReportCaller(false)
|
|
w.logger.SetOutput(output)
|
|
var tf logrus.TextFormatter
|
|
tf.FullTimestamp = true
|
|
tf.TimestampFormat = time.RFC3339Nano
|
|
w.logger.SetFormatter(&tf)
|
|
return w
|
|
}
|