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>
90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.enterprise for license information.
|
|
|
|
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/mattermost/logr/v2"
|
|
"github.com/mattermost/mattermost/server/public/shared/mlog"
|
|
)
|
|
|
|
func NewLogger(backend string, mlogger mlog.LoggerIFace, trace bool) *Logger {
|
|
return &Logger{
|
|
backend: backend,
|
|
logger: mlogger,
|
|
trace: trace,
|
|
}
|
|
}
|
|
|
|
// Logger is a target to pass to the Logger instance of the search backend.
|
|
type Logger struct {
|
|
backend string
|
|
trace bool
|
|
logger mlog.LoggerIFace
|
|
}
|
|
|
|
// LogRoundTrip prints the information about request and response.
|
|
func (l *Logger) LogRoundTrip(req *http.Request, res *http.Response, err error, start time.Time, dur time.Duration) error {
|
|
// Set error level.
|
|
// 0 = debug, 1=warn, 2=error
|
|
var level int
|
|
switch {
|
|
case err != nil:
|
|
level = 2
|
|
case res != nil && res.StatusCode > 0 && res.StatusCode < 500:
|
|
level = 0
|
|
case res != nil && res.StatusCode > 499:
|
|
level = 2
|
|
default:
|
|
level = 2
|
|
}
|
|
|
|
// Capture fields.
|
|
fields := []mlog.Field{
|
|
mlog.String("method", req.Method),
|
|
mlog.Int("status_code", res.StatusCode),
|
|
mlog.String("duration", dur.String()),
|
|
mlog.String("url", req.URL.String()),
|
|
}
|
|
|
|
var logFn func(string, ...logr.Field)
|
|
switch level {
|
|
case 0:
|
|
logFn = l.logger.Debug
|
|
case 1:
|
|
logFn = l.logger.Warn
|
|
case 2:
|
|
logFn = l.logger.Error
|
|
}
|
|
logFn(l.backend+" request", fields...)
|
|
|
|
return nil
|
|
}
|
|
|
|
// RequestBodyEnabled makes the client pass request body to logger
|
|
func (l *Logger) RequestBodyEnabled() bool { return l.trace }
|
|
|
|
// ResponseBodyEnabled makes the client pass response body to logger
|
|
func (l *Logger) ResponseBodyEnabled() bool { return false }
|
|
|
|
func NewBulkIndexerLogger(mlogger mlog.LoggerIFace, name string) BulkIndexerDebugLogger {
|
|
return BulkIndexerDebugLogger{
|
|
logger: mlogger,
|
|
name: name,
|
|
}
|
|
}
|
|
|
|
type BulkIndexerDebugLogger struct {
|
|
logger mlog.LoggerIFace
|
|
name string
|
|
}
|
|
|
|
func (bl BulkIndexerDebugLogger) Printf(str string, params ...any) {
|
|
line := fmt.Sprintf(str, params...)
|
|
bl.logger.Debug(line, mlog.String("workername", bl.name))
|
|
}
|