Some checks failed
Server CI / Postgres (shard 0) (push) Has been skipped
Server CI / Postgres (shard 3) (push) Has been skipped
BuildEnv Docker Image / build-image (push) Failing after 4s
BuildEnv Docker Image / build-image-fips (push) Failing after 4s
Migration Review & Release Notes / Generate migration review & release notes (push) Failing after 3s
Server CI / Build Environment (push) Failing after 3s
Server CI / Postgres (shard 1) (push) Has been skipped
Tools CI / check-style (mattermost-govet) (push) Failing after 4s
Server CI / Postgres (shard 2) (push) Has been skipped
Tools CI / check-style (mmgotool) (push) Failing after 3s
Server CI / Elasticsearch v8 Compatibility (push) Has been skipped
Server CI / OpenSearch v2 Compatibility (push) Has been skipped
Server CI / Postgres FIPS (shard 0) (push) Has been skipped
Tools CI / Test (mattermost-govet) (push) Failing after 3s
Server CI / Postgres FIPS (shard 1) (push) Has been skipped
Server CI / Postgres FIPS (shard 2) (push) Has been skipped
Tools CI / Test (mmgotool) (push) Failing after 3s
Server CI / Postgres FIPS (shard 3) (push) Has been skipped
Server CI / Run mmctl tests (push) Has been skipped
Server CI / Run mmctl tests (FIPS) (push) Has been skipped
Server CI / Merge Postgres Test Results (push) Has been skipped
Server CI / Merge Postgres FIPS Test Results (push) Has been skipped
Server CI / Check backport migrations (push) Has been skipped
Server CI / Check generated files (push) Has been skipped
Server CI / check-style (push) Has been skipped
Server CI / Vet API (push) Has been skipped
Server CI / Build mattermost server app (push) Has been skipped
Server CI / Server CI Complete (push) Failing after 2s
Server CI / Server CI Artifacts (push) Has been skipped
Server CI / Sentry Upload (push) Has been skipped
Server CI / Server CI Report (push) Failing after 5m1s
Server CI Nightly Race / Race Detector (push) Has been skipped
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Webapp CI Cache Warm / Warm Webapp node_modules Cache (push) Has been cancelled
E2E CI Cache Warm / Warm E2E npm Registry Cache (push) Has been cancelled
API / build (push) Has been cancelled
Web App CI / check-types (push) Has been cancelled
Web App CI / check-lint (push) Has been cancelled
Web App CI / check-i18n (push) Has been cancelled
Web App CI / check-external-links (push) Has been cancelled
Web App CI / test (platform) (push) Has been cancelled
Web App CI / test (mattermost-redux) (push) Has been cancelled
Web App CI / test (channels shard 1/4) (push) Has been cancelled
Web App CI / test (channels shard 2/4) (push) Has been cancelled
Web App CI / test (channels shard 3/4) (push) Has been cancelled
Web App CI / test (channels shard 4/4) (push) Has been cancelled
Web App CI / upload-coverage (push) Has been cancelled
Web App CI / build (push) Has been cancelled
YAML Lint / yamllint (push) Has been cancelled
Push mirrored docker images / cd/Push mirrored docker images (push) Has been cancelled
docs-cd / Build and deploy docs (push) Has been cancelled
Docs CI / build (push) Has been cancelled
E2E Cache Warm: Cypress deps / Warm Cypress deps cache (push) Has been cancelled
Scorecards supply-chain security / Scorecard analysis (push) Has been cancelled
Server CI Weekly / Postgres FIPS (push) Has been skipped
Server CI Weekly / Run mmctl tests (FIPS) (push) Has been skipped
Server CI Weekly / Postgres with binary parameters (push) Has been skipped
Server CI Weekly / Build Environment (push) Failing after 1s
Server CI Cache Warm / Warm Go Module and Build Cache (push) Failing after 2s
Server CI Nightly Race / Build Environment (push) Failing after 1s
146 lines
3.7 KiB
Go
146 lines
3.7 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package mlog
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"os"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/mattermost/logr/v2"
|
|
"github.com/mattermost/logr/v2/formatters"
|
|
"github.com/mattermost/logr/v2/targets"
|
|
)
|
|
|
|
// AddWriterTarget adds a simple io.Writer target to an existing Logger.
|
|
// The `io.Writer` can be a buffer which is useful for testing.
|
|
// When adding a buffer to collect logs make sure to use `mlog.Buffer` which is
|
|
// a thread safe version of `bytes.Buffer`.
|
|
func AddWriterTarget(logger *Logger, w io.Writer, useJSON bool, levels ...Level) error {
|
|
filter := logr.NewCustomFilter(levels...)
|
|
|
|
var formatter logr.Formatter
|
|
if useJSON {
|
|
formatter = &formatters.JSON{EnableCaller: true}
|
|
} else {
|
|
formatter = &formatters.Plain{EnableCaller: true}
|
|
}
|
|
|
|
target := targets.NewWriterTarget(w)
|
|
return logger.log.Logr().AddTarget(target, "_testWriter", filter, formatter, 1000)
|
|
}
|
|
|
|
// CreateConsole createa a logger that outputs to [os.Stdout].
|
|
// It's useful in places where no log configuration is accessible.
|
|
func CreateConsoleLogger() *Logger {
|
|
logger, err := NewLogger()
|
|
if err != nil {
|
|
panic("failed create logger " + err.Error())
|
|
}
|
|
|
|
filter := logr.StdFilter{
|
|
Lvl: LvlTrace,
|
|
Stacktrace: LvlPanic,
|
|
}
|
|
formatter := &formatters.Plain{
|
|
EnableCaller: true,
|
|
EnableColor: true,
|
|
}
|
|
|
|
target := targets.NewWriterTarget(os.Stdout)
|
|
if err := logger.log.Logr().AddTarget(target, "_testcon", filter, formatter, 1000); err != nil {
|
|
panic("failed to add target " + err.Error())
|
|
}
|
|
|
|
return logger
|
|
}
|
|
|
|
// CreateConsoleTestLogger creates a logger for unit tests. Log records are output to `os.Stdout`.
|
|
// All log messages with level trace or lower are logged.
|
|
// The returned logger get Shutdown() when the tests completes. The caller should not shut it down.
|
|
func CreateConsoleTestLogger(tb testing.TB) *Logger {
|
|
tb.Helper()
|
|
|
|
logger, err := NewLogger()
|
|
if err != nil {
|
|
tb.Fatalf("failed create logger %v", err)
|
|
}
|
|
|
|
filter := logr.StdFilter{
|
|
Lvl: LvlTrace,
|
|
Stacktrace: LvlPanic,
|
|
}
|
|
formatter := &formatters.Plain{EnableCaller: true}
|
|
|
|
target := targets.NewWriterTarget(os.Stdout)
|
|
if err := logger.log.Logr().AddTarget(target, "_testcon", filter, formatter, 1000); err != nil {
|
|
tb.Fatalf("failed to add target %v", err)
|
|
}
|
|
|
|
tb.Cleanup(func() {
|
|
err := logger.Shutdown()
|
|
if err != nil {
|
|
tb.Fatalf("failed to shut down test logger %v", err)
|
|
}
|
|
})
|
|
|
|
return logger
|
|
}
|
|
|
|
// CreateTestLogger creates a logger for unit tests. Log records are output via `t.Log`.
|
|
// All log messages with level trace or lower are logged.
|
|
// The returned logger get Shutdown() when the tests completes. The caller should not shut it down.
|
|
func CreateTestLogger(t *testing.T) *Logger {
|
|
t.Helper()
|
|
|
|
logger, err := NewLogger()
|
|
if err != nil {
|
|
t.Fatalf("failed create logger %v", err)
|
|
}
|
|
|
|
filter := logr.StdFilter{
|
|
Lvl: LvlTrace,
|
|
Stacktrace: LvlPanic,
|
|
}
|
|
formatter := &formatters.Plain{EnableCaller: true}
|
|
target := targets.NewTestingTarget(t)
|
|
|
|
if err := logger.log.Logr().AddTarget(target, "test", filter, formatter, 1000); err != nil {
|
|
t.Fatalf("failed to add target %v", err)
|
|
}
|
|
|
|
t.Cleanup(func() {
|
|
err := logger.Shutdown()
|
|
if err != nil {
|
|
t.Errorf("failed to shut down test logger %v", err)
|
|
}
|
|
})
|
|
|
|
return logger
|
|
}
|
|
|
|
// Buffer provides a thread-safe buffer useful for logging to memory in unit tests.
|
|
type Buffer struct {
|
|
buf bytes.Buffer
|
|
mux sync.Mutex
|
|
}
|
|
|
|
func (b *Buffer) Read(p []byte) (n int, err error) {
|
|
b.mux.Lock()
|
|
defer b.mux.Unlock()
|
|
return b.buf.Read(p)
|
|
}
|
|
func (b *Buffer) Write(p []byte) (n int, err error) {
|
|
b.mux.Lock()
|
|
defer b.mux.Unlock()
|
|
return b.buf.Write(p)
|
|
}
|
|
func (b *Buffer) String() string {
|
|
b.mux.Lock()
|
|
defer b.mux.Unlock()
|
|
return b.buf.String()
|
|
}
|