logsystem.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package logger
  2. import (
  3. "io"
  4. "log"
  5. "sync/atomic"
  6. )
  7. // LogSystem is implemented by log output devices.
  8. // All methods can be called concurrently from multiple goroutines.
  9. type LogSystem interface {
  10. GetLogLevel() LogLevel
  11. SetLogLevel(i LogLevel)
  12. LogPrint(LogLevel, string)
  13. }
  14. // NewStdLogSystem creates a LogSystem that prints to the given writer.
  15. // The flag values are defined package log.
  16. func NewStdLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem {
  17. logger := log.New(writer, "", flags)
  18. return &stdLogSystem{logger, uint32(level)}
  19. }
  20. type stdLogSystem struct {
  21. logger *log.Logger
  22. level uint32
  23. }
  24. func (t *stdLogSystem) LogPrint(level LogLevel, msg string) {
  25. t.logger.Print(msg)
  26. }
  27. func (t *stdLogSystem) SetLogLevel(i LogLevel) {
  28. atomic.StoreUint32(&t.level, uint32(i))
  29. }
  30. func (t *stdLogSystem) GetLogLevel() LogLevel {
  31. return LogLevel(atomic.LoadUint32(&t.level))
  32. }
  33. // NewRawLogSystem creates a LogSystem that prints to the given writer without
  34. // adding extra information. Suitable for preformatted output
  35. func NewRawLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem {
  36. logger := log.New(writer, "", 0)
  37. return &rawLogSystem{logger, uint32(level)}
  38. }
  39. type rawLogSystem struct {
  40. logger *log.Logger
  41. level uint32
  42. }
  43. func (t *rawLogSystem) LogPrint(level LogLevel, msg string) {
  44. t.logger.Print(msg)
  45. }
  46. func (t *rawLogSystem) SetLogLevel(i LogLevel) {
  47. atomic.StoreUint32(&t.level, uint32(i))
  48. }
  49. func (t *rawLogSystem) GetLogLevel() LogLevel {
  50. return LogLevel(atomic.LoadUint32(&t.level))
  51. }
  52. // NewRawLogSystem creates a LogSystem that prints to the given writer without
  53. // adding extra information. Suitable for preformatted output
  54. func NewJsonLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem {
  55. logger := log.New(writer, "", 0)
  56. return &jsonLogSystem{logger, uint32(level)}
  57. }
  58. type jsonLogSystem struct {
  59. logger *log.Logger
  60. level uint32
  61. }
  62. func (t *jsonLogSystem) LogPrint(level LogLevel, msg string) {
  63. t.logger.Print(msg)
  64. }
  65. func (t *jsonLogSystem) SetLogLevel(i LogLevel) {
  66. atomic.StoreUint32(&t.level, uint32(i))
  67. }
  68. func (t *jsonLogSystem) GetLogLevel() LogLevel {
  69. return LogLevel(atomic.LoadUint32(&t.level))
  70. }