dns.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. DNSCacheOptimiste = dnsStatus("cache OPTIMISTE:")
  42. )
  43. func joinNetIP(ips []net.IP) string {
  44. if len(ips) == 0 {
  45. return ""
  46. }
  47. sips := make([]string, 0, len(ips))
  48. for _, ip := range ips {
  49. sips = append(sips, ip.String())
  50. }
  51. return strings.Join(sips, ", ")
  52. }