Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Mirrored from https://github.com/Slazee/caddy.git
Synced Nov 14, 01:30 UTC
caddyhttp: Split up logged remote address into IP and port (#4403)
Francis Lavoie committed
Nov 29, 2021 at 01:18 UTC
f55b123d63132e290789bcd07077375c76b6e1dd
5 files changed
+22
-8
admin.go
+7
-1
@@ -659,11 +659,17 @@ type adminHandler struct {
659
// ServeHTTP is the external entry point for API requests.
660
// It will only be called once per request.
661
func (h adminHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
662
+ ip, port, err := net.SplitHostPort(r.RemoteAddr)
663
+ if err != nil {
664
+ ip = r.RemoteAddr
665
+ port = ""
666
+ }
667
log := Log().Named("admin.api").With(
668
zap.String("method", r.Method),
669
zap.String("host", r.Host),
670
zap.String("uri", r.RequestURI),
666
- zap.String("remote_addr", r.RemoteAddr),
671
+ zap.String("remote_ip", ip),
672
+ zap.String("remote_port", port),
673
zap.Reflect("headers", r.Header),
674
)
675
if r.TLS != nil {
caddyconfig/httpcaddyfile/builtins_test.go
+2
-2
@@ -37,7 +37,7 @@ func TestLogDirectiveSyntax(t *testing.T) {
37
format filter {
38
wrap console
39
fields {
40
- request>remote_addr ip_mask {
40
+ request>remote_ip ip_mask {
41
ipv4 24
42
ipv6 32
43
}
@@ -46,7 +46,7 @@ func TestLogDirectiveSyntax(t *testing.T) {
46
}
47
}
48
`,
49
- output: `{"logging":{"logs":{"default":{"exclude":["http.log.access.log0"]},"log0":{"encoder":{"fields":{"request\u003eremote_addr":{"filter":"ip_mask","ipv4_cidr":24,"ipv6_cidr":32}},"format":"filter","wrap":{"format":"console"}},"include":["http.log.access.log0"]}}},"apps":{"http":{"servers":{"srv0":{"listen":[":8080"],"logs":{"default_logger_name":"log0"}}}}}}`,
49
+ output: `{"logging":{"logs":{"default":{"exclude":["http.log.access.log0"]},"log0":{"encoder":{"fields":{"request\u003eremote_ip":{"filter":"ip_mask","ipv4_cidr":24,"ipv6_cidr":32}},"format":"filter","wrap":{"format":"console"}},"include":["http.log.access.log0"]}}},"apps":{"http":{"servers":{"srv0":{"listen":[":8080"],"logs":{"default_logger_name":"log0"}}}}}}`,
50
expectError: false,
51
},
52
{
caddytest/integration/caddyfile_adapt/global_options_log_custom.txt
+2
-2
@@ -3,7 +3,7 @@
3
format filter {
4
wrap console
5
fields {
6
- request>remote_addr ip_mask {
6
+ request>remote_ip ip_mask {
7
ipv4 24
8
ipv6 32
9
}
@@ -18,7 +18,7 @@
18
"custom-logger": {
19
"encoder": {
20
"fields": {
21
- "request\u003eremote_addr": {
21
+ "request\u003eremote_ip": {
22
"filter": "ip_mask",
23
"ipv4_cidr": 24,
24
"ipv6_cidr": 32
caddytest/integration/caddyfile_adapt/log_filters.txt
+2
-2
@@ -15,7 +15,7 @@ log {
15
replace foo REDACTED
16
delete bar
17
}
18
- request>remote_addr ip_mask {
18
+ request>remote_ip ip_mask {
19
ipv4 24
20
ipv6 32
21
}
@@ -64,7 +64,7 @@ log {
64
"request\u003eheaders\u003eServer": {
65
"filter": "delete"
66
},
67
- "request\u003eremote_addr": {
67
+ "request\u003eremote_ip": {
68
"filter": "ip_mask",
69
"ipv4_cidr": 24,
70
"ipv6_cidr": 32
modules/caddyhttp/marshalers.go
+9
-1
@@ -16,6 +16,7 @@ package caddyhttp
16
17
import (
18
"crypto/tls"
19
+ "net"
20
"net/http"
21
"strings"
22
@@ -27,7 +28,14 @@ type LoggableHTTPRequest struct{ *http.Request }
28
29
// MarshalLogObject satisfies the zapcore.ObjectMarshaler interface.
30
func (r LoggableHTTPRequest) MarshalLogObject(enc zapcore.ObjectEncoder) error {
30
- enc.AddString("remote_addr", r.RemoteAddr)
31
+ ip, port, err := net.SplitHostPort(r.RemoteAddr)
32
+ if err != nil {
33
+ ip = r.RemoteAddr
34
+ port = ""
35
+ }
36
+
37
+ enc.AddString("remote_ip", ip)
38
+ enc.AddString("remote_port", port)
39
enc.AddString("proto", r.Proto)
40
enc.AddString("method", r.Method)
41
enc.AddString("host", r.Host)