[MM-18150] plugin panic trace should not be lost (#13559)
* Transit panic from debug to error * Parse plugin's StdErr and output panic to the mlog.Error * Add unit tests * Change log test * Remove buffer from logger * Remove 'panic' string filter * Change *Buffer to io.Writer Co-authored-by: mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
771574b652
Коммит
5d928b4f94
@@ -144,6 +144,15 @@ func (l *Logger) StdLogWriter() io.Writer {
|
||||
return &loggerWriter{f}
|
||||
}
|
||||
|
||||
// StdErrPanicLogWriter returns a writer that can be hooked up to the output of a golang standard logger
|
||||
// all of the stderr will be interpreted as log entry.
|
||||
func (l *Logger) StdErrPanicLogWriter() io.Writer {
|
||||
newLogger := *l
|
||||
newLogger.zap = newLogger.zap.WithOptions(zap.AddCallerSkip(4), getStdLogOption())
|
||||
f := newLogger.Error
|
||||
return &panicLoggerWriter{f}
|
||||
}
|
||||
|
||||
func (l *Logger) WithCallerSkip(skip int) *Logger {
|
||||
newlogger := *l
|
||||
newlogger.zap = newlogger.zap.WithOptions(zap.AddCallerSkip(skip))
|
||||
|
||||
@@ -85,3 +85,13 @@ func (l *loggerWriter) Write(p []byte) (int, error) {
|
||||
}
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
type panicLoggerWriter struct {
|
||||
logFunc func(msg string, fields ...Field)
|
||||
}
|
||||
|
||||
func (l *panicLoggerWriter) Write(p []byte) (int, error) {
|
||||
trimmed := string(bytes.TrimSpace(p))
|
||||
l.logFunc(trimmed)
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
package mlog
|
||||
|
||||
import (
|
||||
"io"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
@@ -23,9 +24,10 @@ func (tw *testingWriter) Write(b []byte) (int, error) {
|
||||
|
||||
// NewTestingLogger creates a Logger that proxies logs through a testing interface.
|
||||
// This allows tests that spin up App instances to avoid spewing logs unless the test fails or -verbose is specified.
|
||||
func NewTestingLogger(tb testing.TB) *Logger {
|
||||
func NewTestingLogger(tb testing.TB, writer io.Writer) *Logger {
|
||||
logWriter := &testingWriter{tb}
|
||||
logWriterSync := zapcore.AddSync(logWriter)
|
||||
multiWriter := io.MultiWriter(logWriter, writer)
|
||||
logWriterSync := zapcore.AddSync(multiWriter)
|
||||
|
||||
testingLogger := &Logger{
|
||||
consoleLevel: zap.NewAtomicLevelAt(getZapLevel("debug")),
|
||||
|
||||
Ссылка в новой задаче
Block a user