log_entry.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package internal
  2. import (
  3. "fmt"
  4. "github.com/v2ray/v2ray-core/common"
  5. "github.com/v2ray/v2ray-core/common/alloc"
  6. "github.com/v2ray/v2ray-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.Sprint(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 (this *ErrorLog) Release() {
  36. for index := range this.Values {
  37. this.Values[index] = nil
  38. }
  39. this.Values = nil
  40. }
  41. func (this *ErrorLog) String() string {
  42. b := alloc.NewSmallBuffer().Clear()
  43. defer b.Release()
  44. b.AppendString(this.Prefix)
  45. for _, value := range this.Values {
  46. b.AppendString(InterfaceToString(value))
  47. }
  48. return b.String()
  49. }
  50. type AccessLog struct {
  51. From interface{}
  52. To interface{}
  53. Status string
  54. Reason interface{}
  55. }
  56. func (this *AccessLog) Release() {
  57. this.From = nil
  58. this.To = nil
  59. this.Reason = nil
  60. }
  61. func (this *AccessLog) String() string {
  62. b := alloc.NewSmallBuffer().Clear()
  63. defer b.Release()
  64. b.AppendString(InterfaceToString(this.From)).AppendString(" ")
  65. b.AppendString(this.Status).AppendString(" ")
  66. b.AppendString(InterfaceToString(this.To)).AppendString(" ")
  67. b.AppendString(InterfaceToString(this.Reason))
  68. return b.String()
  69. }