From fa926a1d1dc1df4db827da1f13fd9f813b8db3d7 Mon Sep 17 00:00:00 2001 From: fcying Date: Wed, 12 Jun 2019 13:04:34 +0800 Subject: [PATCH] access log add detour tag --- app/dispatcher/default.go | 7 +++++++ common/log/access.go | 21 +++++++++++++++++++++ common/mux/server.go | 2 +- proxy/http/server.go | 3 ++- proxy/shadowsocks/server.go | 4 ++-- proxy/socks/server.go | 4 ++-- proxy/vmess/inbound/inbound.go | 2 +- 7 files changed, 36 insertions(+), 7 deletions(-) diff --git a/app/dispatcher/default.go b/app/dispatcher/default.go index 5e11eea5f..626aef1cf 100644 --- a/app/dispatcher/default.go +++ b/app/dispatcher/default.go @@ -14,6 +14,7 @@ import ( "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" + "v2ray.com/core/common/log" "v2ray.com/core/common/protocol" "v2ray.com/core/common/session" "v2ray.com/core/features/outbound" @@ -281,5 +282,11 @@ func (d *DefaultDispatcher) routedDispatch(ctx context.Context, link *transport. return } + accessMessage := log.AccessMessageFromContext(ctx) + if accessMessage != nil { + accessMessage.Detour = "[" + handler.Tag() + "]" + log.Record(accessMessage) + } + handler.Dispatch(ctx, link) } diff --git a/common/log/access.go b/common/log/access.go index 41946c9b2..61b53915b 100644 --- a/common/log/access.go +++ b/common/log/access.go @@ -1,11 +1,18 @@ package log import ( + "context" "strings" "v2ray.com/core/common/serial" ) +type logKey int + +const ( + accessMessageKey logKey = iota +) + type AccessStatus string const ( @@ -19,6 +26,7 @@ type AccessMessage struct { Status AccessStatus Reason interface{} Email string + Detour interface{} } func (m *AccessMessage) String() string { @@ -29,6 +37,8 @@ func (m *AccessMessage) String() string { builder.WriteByte(' ') builder.WriteString(serial.ToString(m.To)) builder.WriteByte(' ') + builder.WriteString(serial.ToString(m.Detour)) + builder.WriteByte(' ') builder.WriteString(serial.ToString(m.Reason)) if len(m.Email) > 0 { @@ -38,3 +48,14 @@ func (m *AccessMessage) String() string { } return builder.String() } + +func ContextWithAccessMessage(ctx context.Context, accessMessage *AccessMessage) context.Context { + return context.WithValue(ctx, accessMessageKey, accessMessage) +} + +func AccessMessageFromContext(ctx context.Context) *AccessMessage { + if accessMessage, ok := ctx.Value(accessMessageKey).(*AccessMessage); ok { + return accessMessage + } + return nil +} diff --git a/common/mux/server.go b/common/mux/server.go index 626a6fd11..48c4a23a0 100644 --- a/common/mux/server.go +++ b/common/mux/server.go @@ -120,7 +120,7 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, msg.From = inbound.Source msg.Email = inbound.User.Email } - log.Record(msg) + ctx = log.ContextWithAccessMessage(ctx, msg) } link, err := w.dispatcher.Dispatch(ctx, meta.Target) if err != nil { diff --git a/proxy/http/server.go b/proxy/http/server.go index 7d7bcb54c..dfb23c9ae 100755 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -131,10 +131,11 @@ Start: if err != nil { return newError("malformed proxy host: ", host).AtWarning().Base(err) } - log.Record(&log.AccessMessage{ + ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: conn.RemoteAddr(), To: request.URL, Status: log.AccessAccepted, + Reason: "", }) if strings.EqualFold(request.Method, "CONNECT") { diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index ece76e099..2f9277eb2 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -134,7 +134,7 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection dest := request.Destination() if inbound.Source.IsValid() { - log.Record(&log.AccessMessage{ + ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: inbound.Source, To: dest, Status: log.AccessAccepted, @@ -176,7 +176,7 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, inbound.User = s.user dest := request.Destination() - log.Record(&log.AccessMessage{ + ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: conn.RemoteAddr(), To: dest, Status: log.AccessAccepted, diff --git a/proxy/socks/server.go b/proxy/socks/server.go index 1c4cb2b7b..aacb8a2a9 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -117,7 +117,7 @@ func (s *Server) processTCP(ctx context.Context, conn internet.Connection, dispa dest := request.Destination() newError("TCP Connect request to ", dest).WriteToLog(session.ExportIDToError(ctx)) if inbound != nil && inbound.Source.IsValid() { - log.Record(&log.AccessMessage{ + ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: inbound.Source, To: dest, Status: log.AccessAccepted, @@ -229,7 +229,7 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn internet.Connection, newError("send packet to ", request.Destination(), " with ", payload.Len(), " bytes").AtDebug().WriteToLog(session.ExportIDToError(ctx)) if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Source.IsValid() { - log.Record(&log.AccessMessage{ + ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: inbound.Source, To: request.Destination(), Status: log.AccessAccepted, diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 409900b1a..96a0f022c 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -250,7 +250,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection i } if request.Command != protocol.RequestCommandMux { - log.Record(&log.AccessMessage{ + ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: connection.RemoteAddr(), To: request.Destination(), Status: log.AccessAccepted,