Browse Source

access log add detour tag

fcying 6 years ago
parent
commit
fa926a1d1d

+ 7 - 0
app/dispatcher/default.go

@@ -14,6 +14,7 @@ import (
 	"v2ray.com/core/common"
 	"v2ray.com/core/common"
 	"v2ray.com/core/common/buf"
 	"v2ray.com/core/common/buf"
 	"v2ray.com/core/common/net"
 	"v2ray.com/core/common/net"
+	"v2ray.com/core/common/log"
 	"v2ray.com/core/common/protocol"
 	"v2ray.com/core/common/protocol"
 	"v2ray.com/core/common/session"
 	"v2ray.com/core/common/session"
 	"v2ray.com/core/features/outbound"
 	"v2ray.com/core/features/outbound"
@@ -281,5 +282,11 @@ func (d *DefaultDispatcher) routedDispatch(ctx context.Context, link *transport.
 		return
 		return
 	}
 	}
 
 
+	accessMessage := log.AccessMessageFromContext(ctx)
+	if accessMessage != nil {
+		accessMessage.Detour = "[" + handler.Tag() + "]"
+		log.Record(accessMessage)
+	}
+
 	handler.Dispatch(ctx, link)
 	handler.Dispatch(ctx, link)
 }
 }

+ 21 - 0
common/log/access.go

@@ -1,11 +1,18 @@
 package log
 package log
 
 
 import (
 import (
+	"context"
 	"strings"
 	"strings"
 
 
 	"v2ray.com/core/common/serial"
 	"v2ray.com/core/common/serial"
 )
 )
 
 
+type logKey int
+
+const (
+	accessMessageKey logKey = iota
+)
+
 type AccessStatus string
 type AccessStatus string
 
 
 const (
 const (
@@ -19,6 +26,7 @@ type AccessMessage struct {
 	Status AccessStatus
 	Status AccessStatus
 	Reason interface{}
 	Reason interface{}
 	Email  string
 	Email  string
+	Detour interface{}
 }
 }
 
 
 func (m *AccessMessage) String() string {
 func (m *AccessMessage) String() string {
@@ -29,6 +37,8 @@ func (m *AccessMessage) String() string {
 	builder.WriteByte(' ')
 	builder.WriteByte(' ')
 	builder.WriteString(serial.ToString(m.To))
 	builder.WriteString(serial.ToString(m.To))
 	builder.WriteByte(' ')
 	builder.WriteByte(' ')
+	builder.WriteString(serial.ToString(m.Detour))
+	builder.WriteByte(' ')
 	builder.WriteString(serial.ToString(m.Reason))
 	builder.WriteString(serial.ToString(m.Reason))
 
 
 	if len(m.Email) > 0 {
 	if len(m.Email) > 0 {
@@ -38,3 +48,14 @@ func (m *AccessMessage) String() string {
 	}
 	}
 	return builder.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
+}

+ 1 - 1
common/mux/server.go

@@ -120,7 +120,7 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata,
 			msg.From = inbound.Source
 			msg.From = inbound.Source
 			msg.Email = inbound.User.Email
 			msg.Email = inbound.User.Email
 		}
 		}
-		log.Record(msg)
+		ctx = log.ContextWithAccessMessage(ctx, msg)
 	}
 	}
 	link, err := w.dispatcher.Dispatch(ctx, meta.Target)
 	link, err := w.dispatcher.Dispatch(ctx, meta.Target)
 	if err != nil {
 	if err != nil {

+ 2 - 1
proxy/http/server.go

@@ -131,10 +131,11 @@ Start:
 	if err != nil {
 	if err != nil {
 		return newError("malformed proxy host: ", host).AtWarning().Base(err)
 		return newError("malformed proxy host: ", host).AtWarning().Base(err)
 	}
 	}
-	log.Record(&log.AccessMessage{
+	ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 		From:   conn.RemoteAddr(),
 		From:   conn.RemoteAddr(),
 		To:     request.URL,
 		To:     request.URL,
 		Status: log.AccessAccepted,
 		Status: log.AccessAccepted,
+		Reason: "",
 	})
 	})
 
 
 	if strings.EqualFold(request.Method, "CONNECT") {
 	if strings.EqualFold(request.Method, "CONNECT") {

+ 2 - 2
proxy/shadowsocks/server.go

@@ -134,7 +134,7 @@ func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection
 
 
 			dest := request.Destination()
 			dest := request.Destination()
 			if inbound.Source.IsValid() {
 			if inbound.Source.IsValid() {
-				log.Record(&log.AccessMessage{
+				ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 					From:   inbound.Source,
 					From:   inbound.Source,
 					To:     dest,
 					To:     dest,
 					Status: log.AccessAccepted,
 					Status: log.AccessAccepted,
@@ -176,7 +176,7 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection,
 	inbound.User = s.user
 	inbound.User = s.user
 
 
 	dest := request.Destination()
 	dest := request.Destination()
-	log.Record(&log.AccessMessage{
+	ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 		From:   conn.RemoteAddr(),
 		From:   conn.RemoteAddr(),
 		To:     dest,
 		To:     dest,
 		Status: log.AccessAccepted,
 		Status: log.AccessAccepted,

+ 2 - 2
proxy/socks/server.go

@@ -117,7 +117,7 @@ func (s *Server) processTCP(ctx context.Context, conn internet.Connection, dispa
 		dest := request.Destination()
 		dest := request.Destination()
 		newError("TCP Connect request to ", dest).WriteToLog(session.ExportIDToError(ctx))
 		newError("TCP Connect request to ", dest).WriteToLog(session.ExportIDToError(ctx))
 		if inbound != nil && inbound.Source.IsValid() {
 		if inbound != nil && inbound.Source.IsValid() {
-			log.Record(&log.AccessMessage{
+			ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 				From:   inbound.Source,
 				From:   inbound.Source,
 				To:     dest,
 				To:     dest,
 				Status: log.AccessAccepted,
 				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))
 			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() {
 			if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Source.IsValid() {
-				log.Record(&log.AccessMessage{
+				ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 					From:   inbound.Source,
 					From:   inbound.Source,
 					To:     request.Destination(),
 					To:     request.Destination(),
 					Status: log.AccessAccepted,
 					Status: log.AccessAccepted,

+ 1 - 1
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 {
 	if request.Command != protocol.RequestCommandMux {
-		log.Record(&log.AccessMessage{
+		ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{
 			From:   connection.RemoteAddr(),
 			From:   connection.RemoteAddr(),
 			To:     request.Destination(),
 			To:     request.Destination(),
 			Status: log.AccessAccepted,
 			Status: log.AccessAccepted,