access.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package log
  2. import (
  3. "log"
  4. "os"
  5. )
  6. type AccessStatus string
  7. const (
  8. AccessAccepted = AccessStatus("accepted")
  9. AccessRejected = AccessStatus("rejected")
  10. )
  11. type accessLogger interface {
  12. Log(from, to string, status AccessStatus, reason string)
  13. }
  14. type noOpAccessLogger struct {
  15. }
  16. func (logger *noOpAccessLogger) Log(from, to string, status AccessStatus, reason string) {
  17. // Swallow
  18. }
  19. type accessLog struct {
  20. From string
  21. To string
  22. Status AccessStatus
  23. Reason string
  24. }
  25. type fileAccessLogger struct {
  26. queue chan *accessLog
  27. logger *log.Logger
  28. file *os.File
  29. }
  30. func (logger *fileAccessLogger) close() {
  31. logger.file.Close()
  32. }
  33. func (logger *fileAccessLogger) Log(from, to string, status AccessStatus, reason string) {
  34. logger.queue <- &accessLog{
  35. From: from,
  36. To: to,
  37. Status: status,
  38. Reason: reason,
  39. }
  40. }
  41. func (logger *fileAccessLogger) Run() {
  42. for entry := range logger.queue {
  43. logger.logger.Println(entry.From + " " + string(entry.Status) + " " + entry.To + " " + entry.Reason)
  44. }
  45. }
  46. func newFileAccessLogger(path string) accessLogger {
  47. file, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
  48. if err != nil {
  49. log.Printf("Unable to create or open file (%s): %v\n", path, err)
  50. return nil
  51. }
  52. return &fileAccessLogger{
  53. queue: make(chan *accessLog, 16),
  54. logger: log.New(file, "", log.Ldate|log.Ltime),
  55. file: file,
  56. }
  57. }
  58. var accessLoggerInstance accessLogger = &noOpAccessLogger{}
  59. func InitAccessLogger(file string) {
  60. logger := newFileAccessLogger(file)
  61. if logger != nil {
  62. go logger.(*fileAccessLogger).Run()
  63. accessLoggerInstance = logger
  64. }
  65. }
  66. func Access(from, to string, status AccessStatus, reason string) {
  67. accessLoggerInstance.Log(from, to, status, reason)
  68. }