Compare commits
	
		
			6 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9eaab95519 | |||
|  | 9219dc6b2a | ||
| 52607b38f1 | |||
|  | 886f046409 | ||
| 4d6d469d40 | |||
|  | 4a944274f4 | 
| @@ -1,5 +1,5 @@ | ||||
| # Micro | ||||
|  | ||||
|  | ||||
| [](https://opensource.org/licenses/Apache-2.0) | ||||
| [](https://pkg.go.dev/go.unistack.org/micro/v4?tab=overview) | ||||
| [](https://git.unistack.org/unistack-org/micro/actions?query=workflow%3Abuild+branch%3Av4+event%3Apush) | ||||
|   | ||||
| @@ -52,6 +52,12 @@ type Options struct { | ||||
| 	AddStacktrace bool | ||||
| 	// DedupKeys deduplicate keys in log output | ||||
| 	DedupKeys bool | ||||
| 	// FatalFinalizers runs in order in [logger.Fatal] method | ||||
| 	FatalFinalizers []func(context.Context) | ||||
| } | ||||
|  | ||||
| var DefaultFatalFinalizer = func(ctx context.Context) { | ||||
| 	os.Exit(1) | ||||
| } | ||||
|  | ||||
| // NewOptions creates new options struct | ||||
| @@ -65,6 +71,7 @@ func NewOptions(opts ...Option) Options { | ||||
| 		AddSource:        true, | ||||
| 		TimeFunc:         time.Now, | ||||
| 		Meter:            meter.DefaultMeter, | ||||
| 		FatalFinalizers:  []func(context.Context){DefaultFatalFinalizer}, | ||||
| 	} | ||||
|  | ||||
| 	WithMicroKeys()(&options) | ||||
| @@ -76,6 +83,13 @@ func NewOptions(opts ...Option) Options { | ||||
| 	return options | ||||
| } | ||||
|  | ||||
| // WithFatalFinalizers set logger.Fatal finalizers | ||||
| func WithFatalFinalizers(fncs ...func(context.Context)) Option { | ||||
| 	return func(o *Options) { | ||||
| 		o.FatalFinalizers = fncs | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WithContextAttrFuncs appends default funcs for the context attrs filler | ||||
| func WithContextAttrFuncs(fncs ...ContextAttrFunc) Option { | ||||
| 	return func(o *Options) { | ||||
|   | ||||
| @@ -4,14 +4,12 @@ import ( | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"log/slog" | ||||
| 	"os" | ||||
| 	"reflect" | ||||
| 	"regexp" | ||||
| 	"runtime" | ||||
| 	"strconv" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
|  | ||||
| 	"go.unistack.org/micro/v4/logger" | ||||
| 	"go.unistack.org/micro/v4/semconv" | ||||
| @@ -231,11 +229,12 @@ func (s *slogLogger) Error(ctx context.Context, msg string, attrs ...interface{} | ||||
|  | ||||
| func (s *slogLogger) Fatal(ctx context.Context, msg string, attrs ...interface{}) { | ||||
| 	s.printLog(ctx, logger.FatalLevel, msg, attrs...) | ||||
| 	for _, fn := range s.opts.FatalFinalizers { | ||||
| 		fn(ctx) | ||||
| 	} | ||||
| 	if closer, ok := s.opts.Out.(io.Closer); ok { | ||||
| 		closer.Close() | ||||
| 	} | ||||
| 	time.Sleep(1 * time.Second) | ||||
| 	os.Exit(1) | ||||
| } | ||||
|  | ||||
| func (s *slogLogger) Warn(ctx context.Context, msg string, attrs ...interface{}) { | ||||
|   | ||||
| @@ -469,3 +469,25 @@ func Test_WithContextAttrFunc(t *testing.T) { | ||||
|  | ||||
| 	// t.Logf("xxx %s", buf.Bytes()) | ||||
| } | ||||
|  | ||||
| func TestFatalFinalizers(t *testing.T) { | ||||
| 	ctx := context.TODO() | ||||
| 	buf := bytes.NewBuffer(nil) | ||||
| 	l := NewLogger( | ||||
| 		logger.WithLevel(logger.TraceLevel), | ||||
| 		logger.WithOutput(buf), | ||||
| 	) | ||||
| 	if err := l.Init( | ||||
| 		logger.WithFatalFinalizers(func(ctx context.Context) { | ||||
| 			l.Info(ctx, "fatal finalizer") | ||||
| 		})); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	l.Fatal(ctx, "info_msg1") | ||||
| 	if !bytes.Contains(buf.Bytes(), []byte("fatal finalizer")) { | ||||
| 		t.Fatalf("logger dont have fatal message, buf %s", buf.Bytes()) | ||||
| 	} | ||||
| 	if !bytes.Contains(buf.Bytes(), []byte("info_msg1")) { | ||||
| 		t.Fatalf("logger dont have info_msg1 message, buf %s", buf.Bytes()) | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -82,7 +82,11 @@ type FloatCounter interface { | ||||
|  | ||||
| // Gauge is a float64 gauge | ||||
| type Gauge interface { | ||||
| 	Add(float64) | ||||
| 	Get() float64 | ||||
| 	Set(float64) | ||||
| 	Dec() | ||||
| 	Inc() | ||||
| } | ||||
|  | ||||
| // Histogram is a histogram for non-negative values with automatically created buckets | ||||
|   | ||||
| @@ -136,6 +136,18 @@ type noopGauge struct { | ||||
| 	labels []string | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Add(float64) { | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Set(float64) { | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Inc() { | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Dec() { | ||||
| } | ||||
|  | ||||
| func (r *noopGauge) Get() float64 { | ||||
| 	return 0 | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user