log_entry.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package internal
  2. import (
  3. "fmt"
  4. "strings"
  5. "v2ray.com/core/common"
  6. "v2ray.com/core/common/serial"
  7. )
  8. func InterfaceToString(value interface{}) string {
  9. if value == nil {
  10. return " "
  11. }
  12. switch value := value.(type) {
  13. case string:
  14. return value
  15. case *string:
  16. return *value
  17. case fmt.Stringer:
  18. return value.String()
  19. case error:
  20. return value.Error()
  21. case []byte:
  22. return serial.BytesToHexString(value)
  23. default:
  24. return fmt.Sprintf("%+v", value)
  25. }
  26. }
  27. type LogEntry interface {
  28. common.Releasable
  29. fmt.Stringer
  30. }
  31. type ErrorLog struct {
  32. Prefix string
  33. Values []interface{}
  34. }
  35. func (v *ErrorLog) Release() {
  36. for index := range v.Values {
  37. v.Values[index] = nil
  38. }
  39. v.Values = nil
  40. }
  41. func (v *ErrorLog) String() string {
  42. values := make([]string, len(v.Values)+1)
  43. values[0] = v.Prefix
  44. for i, value := range v.Values {
  45. values[i+1] = InterfaceToString(value)
  46. }
  47. return strings.Join(values, "")
  48. }
  49. type AccessLog struct {
  50. From interface{}
  51. To interface{}
  52. Status string
  53. Reason interface{}
  54. }
  55. func (v *AccessLog) Release() {
  56. v.From = nil
  57. v.To = nil
  58. v.Reason = nil
  59. }
  60. func (v *AccessLog) String() string {
  61. return strings.Join([]string{InterfaceToString(v.From), v.Status, InterfaceToString(v.To), InterfaceToString(v.Reason)}, " ")
  62. }