querylog.go 994 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package querylog
  2. import (
  3. "encoding/json"
  4. "gopkg.in/natefinch/lumberjack.v2"
  5. )
  6. type QueryLogger interface {
  7. Write(*Entry) error
  8. }
  9. // easyjson:json
  10. type Entry struct {
  11. Time int64
  12. Hostname string `json:"omitempty"` // not filled in by geodns
  13. Origin string
  14. Name string
  15. Qtype uint16
  16. Rcode int
  17. Answers int
  18. Targets []string
  19. LabelName string
  20. RemoteAddr string
  21. ClientAddr string
  22. HasECS bool
  23. // todo:
  24. // - GeoDNS version
  25. // - TCP?
  26. // - log the answer data
  27. }
  28. type FileLogger struct {
  29. logger lumberjack.Logger
  30. }
  31. func NewFileLogger(filename string, maxsize int, keep int) (*FileLogger, error) {
  32. fl := &FileLogger{}
  33. fl.logger = lumberjack.Logger{
  34. Filename: filename,
  35. MaxSize: maxsize, // megabytes
  36. MaxBackups: keep,
  37. }
  38. return fl, nil
  39. }
  40. func (l *FileLogger) Write(e *Entry) error {
  41. js, err := json.Marshal(e)
  42. if err != nil {
  43. return err
  44. }
  45. js = append(js, []byte("\n")...)
  46. _, err = l.logger.Write(js)
  47. return err
  48. }