You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.4 KiB
85 lines
2.4 KiB
package worker
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
wtasks "github.com/seaweedfs/seaweedfs/weed/worker/tasks"
|
|
wtypes "github.com/seaweedfs/seaweedfs/weed/worker/types"
|
|
)
|
|
|
|
// taskLoggerAdapter adapts a tasks.TaskLogger to the types.Logger interface used by tasks
|
|
// so that structured WithFields logs from task implementations are captured into file logs.
|
|
type taskLoggerAdapter struct {
|
|
base wtasks.TaskLogger
|
|
fields map[string]interface{}
|
|
}
|
|
|
|
func newTaskLoggerAdapter(base wtasks.TaskLogger) *taskLoggerAdapter {
|
|
return &taskLoggerAdapter{base: base}
|
|
}
|
|
|
|
// WithFields returns a new adapter instance that includes the provided fields.
|
|
func (a *taskLoggerAdapter) WithFields(fields map[string]interface{}) wtypes.Logger {
|
|
// copy fields to avoid mutation by caller
|
|
copied := make(map[string]interface{}, len(fields))
|
|
for k, v := range fields {
|
|
copied[k] = v
|
|
}
|
|
return &taskLoggerAdapter{base: a.base, fields: copied}
|
|
}
|
|
|
|
// Info logs an info message, including any structured fields if present.
|
|
func (a *taskLoggerAdapter) Info(msg string, args ...interface{}) {
|
|
if a.base == nil {
|
|
return
|
|
}
|
|
if len(a.fields) > 0 {
|
|
a.base.LogWithFields("INFO", fmt.Sprintf(msg, args...), toStringMap(a.fields))
|
|
return
|
|
}
|
|
a.base.Info(msg, args...)
|
|
}
|
|
|
|
func (a *taskLoggerAdapter) Warning(msg string, args ...interface{}) {
|
|
if a.base == nil {
|
|
return
|
|
}
|
|
if len(a.fields) > 0 {
|
|
a.base.LogWithFields("WARNING", fmt.Sprintf(msg, args...), toStringMap(a.fields))
|
|
return
|
|
}
|
|
a.base.Warning(msg, args...)
|
|
}
|
|
|
|
func (a *taskLoggerAdapter) Error(msg string, args ...interface{}) {
|
|
if a.base == nil {
|
|
return
|
|
}
|
|
if len(a.fields) > 0 {
|
|
a.base.LogWithFields("ERROR", fmt.Sprintf(msg, args...), toStringMap(a.fields))
|
|
return
|
|
}
|
|
a.base.Error(msg, args...)
|
|
}
|
|
|
|
func (a *taskLoggerAdapter) Debug(msg string, args ...interface{}) {
|
|
if a.base == nil {
|
|
return
|
|
}
|
|
if len(a.fields) > 0 {
|
|
a.base.LogWithFields("DEBUG", fmt.Sprintf(msg, args...), toStringMap(a.fields))
|
|
return
|
|
}
|
|
a.base.Debug(msg, args...)
|
|
}
|
|
|
|
// toStringMap converts map[string]interface{} to map[string]interface{} where values are printable.
|
|
// The underlying tasks.TaskLogger handles arbitrary JSON values, but our gRPC conversion later
|
|
// expects strings; we rely on existing conversion there. Here we keep interface{} to preserve detail.
|
|
func toStringMap(in map[string]interface{}) map[string]interface{} {
|
|
out := make(map[string]interface{}, len(in))
|
|
for k, v := range in {
|
|
out[k] = v
|
|
}
|
|
return out
|
|
}
|