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.
		
		
		
		
		
			
		
			
				
					
					
						
							246 lines
						
					
					
						
							9.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							246 lines
						
					
					
						
							9.8 KiB
						
					
					
				| package glog | |
| 
 | |
| import ( | |
| 	"context" | |
| 	"fmt" | |
| 	"sync/atomic" | |
| 
 | |
| 	reqid "github.com/seaweedfs/seaweedfs/weed/util/request_id" | |
| ) | |
| 
 | |
| const requestIDField = "request_id" | |
| 
 | |
| // formatMetaTag returns a formatted request ID tag from the context, | |
| // like "request_id:abc123". Returns an empty string if no request ID is found. | |
| func formatMetaTag(ctx context.Context) string { | |
| 	if requestID := reqid.Get(ctx); requestID != "" { | |
| 		return fmt.Sprintf("%s:%s", requestIDField, requestID) | |
| 	} | |
| 	return "" | |
| } | |
| 
 | |
| // InfoCtx is a context-aware alternative to Verbose.Info. | |
| // Logs to the INFO log, guarded by the value of v, and prepends a request ID from the context if present. | |
| // Arguments are handled in the manner of fmt.Print. | |
| func (v Verbose) InfoCtx(ctx context.Context, args ...interface{}) { | |
| 	if !v { | |
| 		return | |
| 	} | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.print(infoLog, args...) | |
| } | |
| 
 | |
| // InfolnCtx is a context-aware alternative to Verbose.Infoln. | |
| // Logs to the INFO log, prepending a request ID from the context if it exists. | |
| // Arguments are handled in the manner of fmt.Println. | |
| func (v Verbose) InfolnCtx(ctx context.Context, args ...interface{}) { | |
| 	if !v { | |
| 		return | |
| 	} | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.println(infoLog, args...) | |
| } | |
| 
 | |
| // InfofCtx is a context-aware alternative to Verbose.Infof. | |
| // Logs to the INFO log, guarded by the value of v, and prepends a request ID from the context if present. | |
| // Arguments are handled in the manner of fmt.Printf. | |
| func (v Verbose) InfofCtx(ctx context.Context, format string, args ...interface{}) { | |
| 	if !v { | |
| 		return | |
| 	} | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		format = metaTag + " " + format | |
| 	} | |
| 	logging.printf(infoLog, format, args...) | |
| } | |
| 
 | |
| // InfofCtx logs a formatted message at info level, prepending a request ID from | |
| // the context if it exists. This is a context-aware alternative to Infof. | |
| func InfofCtx(ctx context.Context, format string, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		format = metaTag + " " + format | |
| 	} | |
| 	logging.printf(infoLog, format, args...) | |
| } | |
| 
 | |
| // InfoCtx logs a message at info level, prepending a request ID from the context | |
| // if it exists. This is a context-aware alternative to Info. | |
| func InfoCtx(ctx context.Context, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.print(infoLog, args...) | |
| } | |
| 
 | |
| // WarningCtx logs to the WARNING and INFO logs. | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Print. | |
| // This is a context-aware alternative to Warning. | |
| func WarningCtx(ctx context.Context, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.print(warningLog, args...) | |
| } | |
| 
 | |
| // WarningDepthCtx logs to the WARNING and INFO logs with a custom call depth. | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Print. | |
| // This is a context-aware alternative to WarningDepth. | |
| func WarningDepthCtx(ctx context.Context, depth int, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.printDepth(warningLog, depth, args...) | |
| } | |
| 
 | |
| // WarninglnCtx logs to the WARNING and INFO logs. | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Println. | |
| // This is a context-aware alternative to Warningln. | |
| func WarninglnCtx(ctx context.Context, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.println(warningLog, args...) | |
| } | |
| 
 | |
| // WarningfCtx logs to the WARNING and INFO logs. | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Printf. | |
| // This is a context-aware alternative to Warningf. | |
| func WarningfCtx(ctx context.Context, format string, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		format = metaTag + " " + format | |
| 	} | |
| 	logging.printf(warningLog, format, args...) | |
| } | |
| 
 | |
| // ErrorCtx logs to the ERROR, WARNING, and INFO logs. | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Print. | |
| // This is a context-aware alternative to Error. | |
| func ErrorCtx(ctx context.Context, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.print(errorLog, args...) | |
| } | |
| 
 | |
| // ErrorDepthCtx logs to the ERROR, WARNING, and INFO logs with a custom call depth. | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Print. | |
| // This is a context-aware alternative to ErrorDepth. | |
| func ErrorDepthCtx(ctx context.Context, depth int, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.printDepth(errorLog, depth, args...) | |
| } | |
| 
 | |
| // ErrorlnCtx logs to the ERROR, WARNING, and INFO logs. | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Println. | |
| // This is a context-aware alternative to Errorln. | |
| func ErrorlnCtx(ctx context.Context, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.println(errorLog, args...) | |
| } | |
| 
 | |
| // ErrorfCtx logs to the ERROR, WARNING, and INFO logs. | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Printf. | |
| // This is a context-aware alternative to Errorf. | |
| func ErrorfCtx(ctx context.Context, format string, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		format = metaTag + " " + format | |
| 	} | |
| 	logging.printf(errorLog, format, args...) | |
| } | |
| 
 | |
| // FatalCtx logs to the FATAL, ERROR, WARNING, and INFO logs, | |
| // including a stack trace of all running goroutines, then calls os.Exit(255). | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Print. | |
| // This is a context-aware alternative to Fatal. | |
| func FatalCtx(ctx context.Context, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.print(fatalLog, args...) | |
| } | |
| 
 | |
| // FatalDepthCtx logs to the FATAL, ERROR, WARNING, and INFO logs with a custom call depth, | |
| // including a stack trace of all running goroutines, then calls os.Exit(255). | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Print. | |
| // This is a context-aware alternative to FatalDepth. | |
| func FatalDepthCtx(ctx context.Context, depth int, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.printDepth(fatalLog, depth, args...) | |
| } | |
| 
 | |
| // FatallnCtx logs to the FATAL, ERROR, WARNING, and INFO logs, | |
| // including a stack trace of all running goroutines, then calls os.Exit(255). | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Println. | |
| // This is a context-aware alternative to Fatalln. | |
| func FatallnCtx(ctx context.Context, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.println(fatalLog, args...) | |
| } | |
| 
 | |
| // FatalfCtx logs to the FATAL, ERROR, WARNING, and INFO logs, | |
| // including a stack trace of all running goroutines, then calls os.Exit(255). | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Printf. | |
| // This is a context-aware alternative to Fatalf. | |
| func FatalfCtx(ctx context.Context, format string, args ...interface{}) { | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		format = metaTag + " " + format | |
| 	} | |
| 	logging.printf(fatalLog, format, args...) | |
| } | |
| 
 | |
| // ExitCtx logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1). | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Print. | |
| // This is a context-aware alternative to ExitCtx | |
| func ExitCtx(ctx context.Context, args ...interface{}) { | |
| 	atomic.StoreUint32(&fatalNoStacks, 1) | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.print(fatalLog, args...) | |
| } | |
| 
 | |
| // ExitDepthCtx logs to the FATAL, ERROR, WARNING, and INFO logs with a custom call depth, | |
| // then calls os.Exit(1). Prepends a request ID from the context if it exists. | |
| // Arguments are handled in the manner of fmt.Print. | |
| // This is a context-aware alternative to ExitDepth. | |
| func ExitDepthCtx(ctx context.Context, depth int, args ...interface{}) { | |
| 	atomic.StoreUint32(&fatalNoStacks, 1) | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.printDepth(fatalLog, depth, args...) | |
| } | |
| 
 | |
| // ExitlnCtx logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1). | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Println. | |
| // This is a context-aware alternative to Exitln. | |
| func ExitlnCtx(ctx context.Context, args ...interface{}) { | |
| 	atomic.StoreUint32(&fatalNoStacks, 1) | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		args = append([]interface{}{metaTag}, args...) | |
| 	} | |
| 	logging.println(fatalLog, args...) | |
| } | |
| 
 | |
| // ExitfCtx logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1). | |
| // Prepends a request ID from the context if it exists. Arguments are handled in the manner of fmt.Printf. | |
| // This is a context-aware alternative to Exitf. | |
| func ExitfCtx(ctx context.Context, format string, args ...interface{}) { | |
| 	atomic.StoreUint32(&fatalNoStacks, 1) | |
| 	if metaTag := formatMetaTag(ctx); metaTag != "" { | |
| 		format = metaTag + " " + format | |
| 	} | |
| 	logging.printf(fatalLog, format, args...) | |
| }
 |