|
6 | 6 | "runtime" |
7 | 7 | "sync" |
8 | 8 | "time" |
| 9 | + |
| 10 | + "github.com/go-playground/pure" |
9 | 11 | ) |
10 | 12 |
|
11 | 13 | // ANSIEscSeq is a predefined ANSI escape sequence |
@@ -36,6 +38,13 @@ const ( |
36 | 38 | Reset = "\x1b[0m" |
37 | 39 | ) |
38 | 40 |
|
| 41 | +const ( |
| 42 | + status500 = Underscore + Blink + Red |
| 43 | + status400 = Red |
| 44 | + status300 = Yellow |
| 45 | + status = Green |
| 46 | +) |
| 47 | + |
39 | 48 | type logWriter struct { |
40 | 49 | http.ResponseWriter |
41 | 50 | status int |
@@ -89,50 +98,84 @@ var lrpool = sync.Pool{ |
89 | 98 | } |
90 | 99 |
|
91 | 100 | // LoggingAndRecovery handle HTTP request logging + recovery |
92 | | -func LoggingAndRecovery(next http.HandlerFunc) http.HandlerFunc { |
| 101 | +func LoggingAndRecovery(color bool) pure.Middleware { |
93 | 102 |
|
94 | | - return func(w http.ResponseWriter, r *http.Request) { |
| 103 | + return func(next http.HandlerFunc) http.HandlerFunc { |
95 | 104 |
|
96 | | - t1 := time.Now() |
| 105 | + if color { |
97 | 106 |
|
98 | | - lw := lrpool.Get().(*logWriter) |
99 | | - lw.status = 200 |
100 | | - lw.size = 0 |
101 | | - lw.committed = false |
102 | | - lw.ResponseWriter = w |
| 107 | + return func(w http.ResponseWriter, r *http.Request) { |
103 | 108 |
|
104 | | - defer func() { |
105 | | - if err := recover(); err != nil { |
106 | | - trace := make([]byte, 1<<16) |
107 | | - n := runtime.Stack(trace, true) |
108 | | - log.Printf(" %srecovering from panic: %+v\nStack Trace:\n %s%s", Red, err, trace[:n], Reset) |
109 | | - HandlePanic(lw, r, trace[:n]) |
| 109 | + t1 := time.Now() |
110 | 110 |
|
111 | | - lrpool.Put(lw) |
112 | | - return |
| 111 | + lw := lrpool.Get().(*logWriter) |
| 112 | + lw.status = 200 |
| 113 | + lw.size = 0 |
| 114 | + lw.committed = false |
| 115 | + lw.ResponseWriter = w |
| 116 | + |
| 117 | + defer func() { |
| 118 | + if err := recover(); err != nil { |
| 119 | + trace := make([]byte, 1<<16) |
| 120 | + n := runtime.Stack(trace, true) |
| 121 | + log.Printf(" %srecovering from panic: %+v\nStack Trace:\n %s%s", Red, err, trace[:n], Reset) |
| 122 | + HandlePanic(lw, r, trace[:n]) |
| 123 | + |
| 124 | + lrpool.Put(lw) |
| 125 | + return |
| 126 | + } |
| 127 | + |
| 128 | + lrpool.Put(lw) |
| 129 | + }() |
| 130 | + |
| 131 | + next(lw, r) |
| 132 | + |
| 133 | + // var color string |
| 134 | + color := status |
| 135 | + |
| 136 | + code := lw.Status() |
| 137 | + |
| 138 | + switch { |
| 139 | + case code >= http.StatusInternalServerError: |
| 140 | + color = status500 |
| 141 | + case code >= http.StatusBadRequest: |
| 142 | + color = status400 |
| 143 | + case code >= http.StatusMultipleChoices: |
| 144 | + color = status300 |
| 145 | + default: |
| 146 | + color = status |
| 147 | + } |
| 148 | + |
| 149 | + log.Printf("%s %d %s[%s%s%s] %q %v %d\n", color, code, Reset, color, r.Method, Reset, r.URL, time.Since(t1), lw.Size()) |
113 | 150 | } |
| 151 | + } |
| 152 | + |
| 153 | + return func(w http.ResponseWriter, r *http.Request) { |
114 | 154 |
|
115 | | - lrpool.Put(lw) |
116 | | - }() |
| 155 | + t1 := time.Now() |
117 | 156 |
|
118 | | - next(lw, r) |
| 157 | + lw := lrpool.Get().(*logWriter) |
| 158 | + lw.status = 200 |
| 159 | + lw.size = 0 |
| 160 | + lw.committed = false |
| 161 | + lw.ResponseWriter = w |
119 | 162 |
|
120 | | - var color string |
| 163 | + defer func() { |
| 164 | + if err := recover(); err != nil { |
| 165 | + trace := make([]byte, 1<<16) |
| 166 | + n := runtime.Stack(trace, true) |
| 167 | + log.Printf(" %srecovering from panic: %+v\nStack Trace:\n %s%s", Red, err, trace[:n], Reset) |
| 168 | + HandlePanic(lw, r, trace[:n]) |
| 169 | + } |
| 170 | + |
| 171 | + lrpool.Put(lw) |
| 172 | + }() |
121 | 173 |
|
122 | | - code := lw.Status() |
| 174 | + next(lw, r) |
123 | 175 |
|
124 | | - switch { |
125 | | - case code >= http.StatusInternalServerError: |
126 | | - color = Underscore + Blink + Red |
127 | | - case code >= http.StatusBadRequest: |
128 | | - color = Red |
129 | | - case code >= http.StatusMultipleChoices: |
130 | | - color = Yellow |
131 | | - default: |
132 | | - color = Green |
| 176 | + log.Printf("%d [%s] %q %v %d\n", lw.Status(), r.Method, r.URL, time.Since(t1), lw.Size()) |
133 | 177 | } |
134 | 178 |
|
135 | | - log.Printf("%s %d %s[%s%s%s] %q %v %d\n", color, code, Reset, color, r.Method, Reset, r.URL, time.Since(t1), lw.Size()) |
136 | 179 | } |
137 | 180 | } |
138 | 181 |
|
|
0 commit comments