logger.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package main
  2. import (
  3. "encoding/csv"
  4. "log"
  5. "net"
  6. "net/http"
  7. "os"
  8. "path/filepath"
  9. "time"
  10. "strconv"
  11. )
  12. const (
  13. timeFormat = "2006-01-02 15:04"
  14. dateFormat = "20060102"
  15. )
  16. type searchInfo struct {
  17. Date time.Time
  18. Host, Phrase, Language string
  19. ResultsServed int
  20. }
  21. func (s *searchInfo) ToArray() []string {
  22. return []string{s.Date.Format(timeFormat), s.Host, s.Phrase, s.Language, strconv.Itoa(s.ResultsServed)}
  23. }
  24. func getInfoFromRequest(r *http.Request) searchInfo {
  25. info := searchInfo{Date: time.Now()}
  26. info.Host, _, _ = net.SplitHostPort(r.RemoteAddr)
  27. info.Phrase = r.URL.Query().Get("phrase")
  28. language := r.URL.Query().Get("lang")
  29. if language == "" {
  30. info.Language = "All languages"
  31. } else {
  32. info.Language = app.Languages[language]
  33. }
  34. return info
  35. }
  36. func getWriter() *csv.Writer {
  37. logFile := filepath.Join("log", (time.Now().Format(dateFormat) + ".log"))
  38. logOutput, err := os.OpenFile(logFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
  39. if err != nil {
  40. log.Fatalf("Error creating log file: %v", err)
  41. }
  42. writer := csv.NewWriter(logOutput)
  43. return writer
  44. }
  45. // WriteLog main function, saves event to the log.
  46. func WriteLog(r *http.Request, resultsServed int) {
  47. info := getInfoFromRequest(r)
  48. info.ResultsServed = resultsServed
  49. writer := getWriter()
  50. writer.Write(info.ToArray())
  51. writer.Flush()
  52. }