File tree Expand file tree Collapse file tree 2 files changed +46
-1
lines changed Expand file tree Collapse file tree 2 files changed +46
-1
lines changed Original file line number Diff line number Diff line change 9
9
)
10
10
11
11
type (
12
+ // LogLevelSetter defines a function to get log level for the recovered value.
13
+ LogLevelSetter func (value interface {}) log.Lvl
14
+
12
15
// RecoverConfig defines the config for Recover middleware.
13
16
RecoverConfig struct {
14
17
// Skipper defines a function to skip middleware.
@@ -30,6 +33,10 @@ type (
30
33
// LogLevel is log level to printing stack trace.
31
34
// Optional. Default value 0 (Print).
32
35
LogLevel log.Lvl
36
+
37
+ // LogLevelSetter defines a function to get log level for the recovered value.
38
+ // LogLevelSetter has higher priority than LogLevel when it's set.
39
+ LogLevelSetter LogLevelSetter
33
40
}
34
41
)
35
42
41
48
DisableStackAll : false ,
42
49
DisablePrintStack : false ,
43
50
LogLevel : 0 ,
51
+ LogLevelSetter : nil ,
44
52
}
45
53
)
46
54
@@ -73,11 +81,15 @@ func RecoverWithConfig(config RecoverConfig) echo.MiddlewareFunc {
73
81
if ! ok {
74
82
err = fmt .Errorf ("%v" , r )
75
83
}
84
+ logLevel := config .LogLevel
85
+ if config .LogLevelSetter != nil {
86
+ logLevel = config .LogLevelSetter (r )
87
+ }
76
88
stack := make ([]byte , config .StackSize )
77
89
length := runtime .Stack (stack , ! config .DisableStackAll )
78
90
if ! config .DisablePrintStack {
79
91
msg := fmt .Sprintf ("[PANIC RECOVER] %v %s\n " , err , stack [:length ])
80
- switch config . LogLevel {
92
+ switch logLevel {
81
93
case log .DEBUG :
82
94
c .Logger ().Debug (msg )
83
95
case log .INFO :
Original file line number Diff line number Diff line change @@ -81,3 +81,36 @@ func TestRecoverWithConfig_LogLevel(t *testing.T) {
81
81
})
82
82
}
83
83
}
84
+
85
+ func TestRecoverWithConfig_LogLevelSetter (t * testing.T ) {
86
+ e := echo .New ()
87
+ e .Logger .SetLevel (log .DEBUG )
88
+
89
+ buf := new (bytes.Buffer )
90
+ e .Logger .SetOutput (buf )
91
+
92
+ req := httptest .NewRequest (http .MethodGet , "/" , nil )
93
+ rec := httptest .NewRecorder ()
94
+ c := e .NewContext (req , rec )
95
+
96
+ config := DefaultRecoverConfig
97
+ config .LogLevelSetter = func (value interface {}) log.Lvl {
98
+ if s , ok := value .(string ); ok {
99
+ if s == "test" {
100
+ return log .DEBUG
101
+ }
102
+ }
103
+ return log .ERROR
104
+ }
105
+ h := RecoverWithConfig (config )(echo .HandlerFunc (func (c echo.Context ) error {
106
+ panic ("test" )
107
+ }))
108
+
109
+ h (c )
110
+
111
+ assert .Equal (t , http .StatusInternalServerError , rec .Code )
112
+
113
+ output := buf .String ()
114
+ assert .Contains (t , output , "PANIC RECOVER" )
115
+ assert .Contains (t , output , `"level":"DEBUG"` )
116
+ }
You can’t perform that action at this time.
0 commit comments