logger.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package logger
  2. import (
  3. "fmt"
  4. "net/http"
  5. "os"
  6. "time"
  7. )
  8. type Logger struct {
  9. wwwDir string
  10. cdata chan string
  11. cclose chan bool
  12. }
  13. func (this *Logger) write(str string) {
  14. // TODO: write to console or to file
  15. // If www and host home dir are exists
  16. fmt.Fprintln(os.Stdout, str)
  17. }
  18. func New() *Logger {
  19. // Logs channel
  20. cdata := make(chan string)
  21. // Close channel
  22. cclose := make(chan bool)
  23. // Init logger pointer
  24. lg := Logger{cdata: cdata, cclose: cclose}
  25. // Write log string in background
  26. go func() {
  27. for {
  28. select {
  29. case str := <-cdata:
  30. lg.write(str)
  31. case <-cclose:
  32. cclose <- true
  33. return
  34. }
  35. }
  36. }()
  37. return &lg
  38. }
  39. func (this *Logger) Log(str string) {
  40. // Do not wait
  41. go func() {
  42. select {
  43. case this.cdata <- str:
  44. return
  45. case <-time.After(1 * time.Second):
  46. fmt.Println("Logger error, log channel is overflowed (1)")
  47. return
  48. }
  49. }()
  50. }
  51. func (this *Logger) SetWwwDir(dir string) {
  52. this.wwwDir = dir
  53. }
  54. func (this *Logger) Handler(h http.Handler) http.Handler {
  55. return handler{
  56. h: h,
  57. w: os.Stdout,
  58. c: this.cdata,
  59. }
  60. }
  61. func (this *Logger) Close() {
  62. this.cclose <- true
  63. <-this.cclose
  64. }