Skip to content

Commit a836724

Browse files
Dean KarnDean Karn
authored andcommitted
Update LoggingAndRecovery middleware
- added option for color or not - updated status colors to be constants.
1 parent ca110c5 commit a836724

File tree

3 files changed

+77
-34
lines changed

3 files changed

+77
-34
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
##Pure
22
<img align="right" src="https://raw.githubusercontent.com/go-playground/pure/master/logo.png">
3-
![Project status](https://img.shields.io/badge/version-2.2.1-green.svg)
3+
![Project status](https://img.shields.io/badge/version-2.3.0-green.svg)
44
[![Build Status](https://semaphoreci.com/api/v1/joeybloggs/pure/branches/master/badge.svg)](https://semaphoreci.com/joeybloggs/pure)
55
[![Coverage Status](https://coveralls.io/repos/github/go-playground/pure/badge.svg?branch=master)](https://coveralls.io/github/go-playground/pure?branch=master)
66
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/pure)](https://goreportcard.com/report/github.com/go-playground/pure)
@@ -44,7 +44,7 @@ import (
4444
func main() {
4545

4646
p := pure.New()
47-
p.Use(mw.LoggingAndRecovery)
47+
p.Use(mw.LoggingAndRecovery(true))
4848

4949
p.Get("/", helloWorld)
5050

examples/basic/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
func main() {
1111

1212
p := pure.New()
13-
p.Use(mw.LoggingAndRecovery)
13+
p.Use(mw.LoggingAndRecovery(true))
1414

1515
p.Get("/", helloWorld)
1616

examples/middleware/logging-recovery/logging_recovery.go

Lines changed: 74 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"runtime"
77
"sync"
88
"time"
9+
10+
"github.com/go-playground/pure"
911
)
1012

1113
// ANSIEscSeq is a predefined ANSI escape sequence
@@ -36,6 +38,13 @@ const (
3638
Reset = "\x1b[0m"
3739
)
3840

41+
const (
42+
status500 = Underscore + Blink + Red
43+
status400 = Red
44+
status300 = Yellow
45+
status = Green
46+
)
47+
3948
type logWriter struct {
4049
http.ResponseWriter
4150
status int
@@ -89,50 +98,84 @@ var lrpool = sync.Pool{
8998
}
9099

91100
// LoggingAndRecovery handle HTTP request logging + recovery
92-
func LoggingAndRecovery(next http.HandlerFunc) http.HandlerFunc {
101+
func LoggingAndRecovery(color bool) pure.Middleware {
93102

94-
return func(w http.ResponseWriter, r *http.Request) {
103+
return func(next http.HandlerFunc) http.HandlerFunc {
95104

96-
t1 := time.Now()
105+
if color {
97106

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) {
103108

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()
110110

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())
113150
}
151+
}
152+
153+
return func(w http.ResponseWriter, r *http.Request) {
114154

115-
lrpool.Put(lw)
116-
}()
155+
t1 := time.Now()
117156

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
119162

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+
}()
121173

122-
code := lw.Status()
174+
next(lw, r)
123175

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())
133177
}
134178

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())
136179
}
137180
}
138181

0 commit comments

Comments
 (0)