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
							 | 
						|
								}
							 |