refactor: print ip without port
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Dawid Wysokiński 2023-05-09 11:04:45 +02:00
parent aed5b142ec
commit 63537e13dc
Signed by: Kichiyaki
GPG Key ID: B5445E357FB8B892
3 changed files with 10 additions and 12 deletions

View File

@ -38,7 +38,7 @@ func WithFilter(f Filter) Option {
} }
// WithAdditionalFieldExtractor takes a function that will be called on every // WithAdditionalFieldExtractor takes a function that will be called on every
// request and the returned fields will be added to a log entry. // request and the returned fields will be added to the log entry.
func WithAdditionalFieldExtractor(extractor AdditionalFieldExtractor) Option { func WithAdditionalFieldExtractor(extractor AdditionalFieldExtractor) Option {
return func(c *config) { return func(c *config) {
c.additionalFieldExtractors = append(c.additionalFieldExtractors, extractor) c.additionalFieldExtractors = append(c.additionalFieldExtractors, extractor)

View File

@ -1,6 +1,7 @@
package chizap package chizap
import ( import (
"net"
"net/http" "net/http"
"time" "time"
@ -10,10 +11,6 @@ import (
) )
// Logger returns a go-chi middleware that logs requests using go.uber.org/zap. // Logger returns a go-chi middleware that logs requests using go.uber.org/zap.
//
// Requests with status code >= 500 are logged using logger.Error.
// Requests with status code >= 400 are logged using logger.Warn.
// Other requests are logged using logger.Info.
func Logger(logger *zap.Logger, opts ...Option) func(next http.Handler) http.Handler { func Logger(logger *zap.Logger, opts ...Option) func(next http.Handler) http.Handler {
cfg := newConfig(opts...) cfg := newConfig(opts...)
return func(next http.Handler) http.Handler { return func(next http.Handler) http.Handler {
@ -34,11 +31,12 @@ func Logger(logger *zap.Logger, opts ...Option) func(next http.Handler) http.Han
end := time.Now() end := time.Now()
statusCode := ww.Status() statusCode := ww.Status()
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
fields := []zap.Field{ fields := []zap.Field{
zap.Int("statusCode", statusCode), zap.Int("statusCode", statusCode),
zap.Duration("duration", end.Sub(start)), zap.Duration("duration", end.Sub(start)),
zap.String("ip", r.RemoteAddr), zap.String("ip", ip),
zap.String("method", r.Method), zap.String("method", r.Method),
zap.String("query", query), zap.String("query", query),
zap.String("path", path), zap.String("path", path),

View File

@ -1,11 +1,11 @@
package chizap_test package chizap_test
import ( import (
"net"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"strings" "strings"
"testing" "testing"
"time"
"gitea.dwysokinski.me/Kichiyaki/chizap" "gitea.dwysokinski.me/Kichiyaki/chizap"
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
@ -25,28 +25,24 @@ func TestLogger(t *testing.T) {
excluded bool excluded bool
expectedLevel zapcore.Level expectedLevel zapcore.Level
expectedRoutePattern string expectedRoutePattern string
expectedTimeFormat string
expectedAdditionalFields []zap.Field expectedAdditionalFields []zap.Field
}{ }{
{ {
name: "/info?test=true", name: "/info?test=true",
req: httptest.NewRequest(http.MethodGet, "/info?test=true", nil), req: httptest.NewRequest(http.MethodGet, "/info?test=true", nil),
expectedLevel: zap.InfoLevel, expectedLevel: zap.InfoLevel,
expectedTimeFormat: time.RFC3339,
expectedRoutePattern: "/info", expectedRoutePattern: "/info",
}, },
{ {
name: "/warn?test=true", name: "/warn?test=true",
req: httptest.NewRequest(http.MethodGet, "/warn?test=true", nil), req: httptest.NewRequest(http.MethodGet, "/warn?test=true", nil),
expectedLevel: zap.WarnLevel, expectedLevel: zap.WarnLevel,
expectedTimeFormat: time.RFC3339,
expectedRoutePattern: "/warn", expectedRoutePattern: "/warn",
}, },
{ {
name: "/error?test=true", name: "/error?test=true",
req: httptest.NewRequest(http.MethodGet, "/error?test=true", nil), req: httptest.NewRequest(http.MethodGet, "/error?test=true", nil),
expectedLevel: zap.ErrorLevel, expectedLevel: zap.ErrorLevel,
expectedTimeFormat: time.RFC3339,
expectedRoutePattern: "/error", expectedRoutePattern: "/error",
}, },
{ {
@ -58,7 +54,6 @@ func TestLogger(t *testing.T) {
name: "/delete/123", name: "/delete/123",
req: httptest.NewRequest(http.MethodDelete, "/delete/123", nil), req: httptest.NewRequest(http.MethodDelete, "/delete/123", nil),
expectedLevel: zap.InfoLevel, expectedLevel: zap.InfoLevel,
expectedTimeFormat: time.RFC3339,
expectedRoutePattern: "/delete/{id}", expectedRoutePattern: "/delete/{id}",
expectedAdditionalFields: []zap.Field{ expectedAdditionalFields: []zap.Field{
zap.String("id", "123"), zap.String("id", "123"),
@ -89,10 +84,15 @@ func TestLogger(t *testing.T) {
assert.Equal(t, tt.req.URL.Path, entry.Message) assert.Equal(t, tt.req.URL.Path, entry.Message)
assert.Equal(t, tt.expectedLevel, entry.Level) assert.Equal(t, tt.expectedLevel, entry.Level)
require.Len(t, entry.Context, 11+len(tt.expectedAdditionalFields)) require.Len(t, entry.Context, 11+len(tt.expectedAdditionalFields))
ip, _, _ := net.SplitHostPort(tt.req.RemoteAddr)
assert.Contains(t, entry.Context, zap.String("ip", ip))
assert.Contains(t, entry.Context, zap.Int("statusCode", rr.Code)) assert.Contains(t, entry.Context, zap.Int("statusCode", rr.Code))
assert.Contains(t, entry.Context, zap.String("method", tt.req.Method)) assert.Contains(t, entry.Context, zap.String("method", tt.req.Method))
assert.Contains(t, entry.Context, zap.String("path", tt.req.URL.Path)) assert.Contains(t, entry.Context, zap.String("path", tt.req.URL.Path))
assert.Contains(t, entry.Context, zap.String("query", tt.req.URL.RawQuery)) assert.Contains(t, entry.Context, zap.String("query", tt.req.URL.RawQuery))
assert.Contains(t, entry.Context, zap.String("proto", tt.req.Proto))
assert.Contains(t, entry.Context, zap.String("referer", tt.req.Referer()))
assert.Contains(t, entry.Context, zap.String("userAgent", tt.req.UserAgent()))
assert.Contains(t, entry.Context, zap.String("routePattern", tt.expectedRoutePattern)) assert.Contains(t, entry.Context, zap.String("routePattern", tt.expectedRoutePattern))
for _, f := range tt.expectedAdditionalFields { for _, f := range tt.expectedAdditionalFields {
assert.Contains(t, entry.Context, f) assert.Contains(t, entry.Context, f)