logger.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package logger
  2. import (
  3. "log"
  4. "os"
  5. )
  6. type LogLevel int
  7. const (
  8. DebugLevel LogLevel = iota
  9. InfoLevel
  10. ErrorLevel
  11. )
  12. type Logger struct {
  13. level LogLevel
  14. logger *log.Logger
  15. }
  16. type LogFunc func(format string, v ...interface{})
  17. type LoggerOption func(*Logger)
  18. func WithLogLevel(level LogLevel) LoggerOption {
  19. return func(l *Logger) {
  20. l.level = level
  21. }
  22. }
  23. func WithOutput(output *os.File) LoggerOption {
  24. return func(l *Logger) {
  25. l.logger.SetOutput(output)
  26. }
  27. }
  28. func NewLogger(opts ...LoggerOption) *Logger {
  29. l := &Logger{
  30. level: InfoLevel,
  31. logger: log.New(os.Stdout, "", log.LstdFlags),
  32. }
  33. for _, opt := range opts {
  34. opt(l)
  35. }
  36. return l
  37. }
  38. func (l *Logger) Debug(format string, v ...interface{}) {
  39. if l.level <= DebugLevel {
  40. l.logger.Printf("[DEBUG] "+format, v...)
  41. }
  42. }
  43. func (l *Logger) Info(format string, v ...interface{}) {
  44. if l.level <= InfoLevel {
  45. l.logger.Printf("[INFO] "+format, v...)
  46. }
  47. }
  48. func (l *Logger) Error(format string, v ...interface{}) {
  49. if l.level <= ErrorLevel {
  50. l.logger.Printf("[ERROR] "+format, v...)
  51. }
  52. }
  53. func (l *Logger) LogFunc(level LogLevel) LogFunc {
  54. return func(format string, v ...interface{}) {
  55. switch level {
  56. case DebugLevel:
  57. l.Debug(format, v...)
  58. case InfoLevel:
  59. l.Info(format, v...)
  60. case ErrorLevel:
  61. l.Error(format, v...)
  62. }
  63. }
  64. }