dns.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package log
  2. import (
  3. "net"
  4. "strings"
  5. "time"
  6. )
  7. type DNSLog struct {
  8. Server string
  9. Domain string
  10. Result []net.IP
  11. Status dnsStatus
  12. Elapsed time.Duration
  13. Error error
  14. }
  15. func (l *DNSLog) String() string {
  16. builder := &strings.Builder{}
  17. // Server got answer: domain -> [ip1, ip2] 23ms
  18. builder.WriteString(l.Server)
  19. builder.WriteString(" ")
  20. builder.WriteString(string(l.Status))
  21. builder.WriteString(" ")
  22. builder.WriteString(l.Domain)
  23. builder.WriteString(" -> [")
  24. builder.WriteString(joinNetIP(l.Result))
  25. builder.WriteString("]")
  26. if l.Elapsed > 0 {
  27. builder.WriteString(" ")
  28. builder.WriteString(l.Elapsed.String())
  29. }
  30. if l.Error != nil {
  31. builder.WriteString(" <")
  32. builder.WriteString(l.Error.Error())
  33. builder.WriteString(">")
  34. }
  35. return builder.String()
  36. }
  37. type dnsStatus string
  38. var (
  39. DNSQueried = dnsStatus("got answer:")
  40. DNSCacheHit = dnsStatus("cache HIT:")
  41. )
  42. func joinNetIP(ips []net.IP) string {
  43. if len(ips) == 0 {
  44. return ""
  45. }
  46. sips := make([]string, 0, len(ips))
  47. for _, ip := range ips {
  48. sips = append(sips, ip.String())
  49. }
  50. return strings.Join(sips, ", ")
  51. }