stdlog.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package stdlog
  2. import (
  3. "bytes"
  4. "fmt"
  5. stdlog "log"
  6. "github.com/ydb-platform/ydb/library/go/core/log"
  7. )
  8. func levelToFunc(logger log.Logger, lvl log.Level) (func(msg string, fields ...log.Field), error) {
  9. switch lvl {
  10. case log.DebugLevel:
  11. return logger.Debug, nil
  12. case log.TraceLevel:
  13. return logger.Trace, nil
  14. case log.InfoLevel:
  15. return logger.Info, nil
  16. case log.WarnLevel:
  17. return logger.Warn, nil
  18. case log.ErrorLevel:
  19. return logger.Error, nil
  20. case log.FatalLevel:
  21. return logger.Fatal, nil
  22. }
  23. return nil, fmt.Errorf("unknown log level: %v", lvl)
  24. }
  25. type loggerWriter struct {
  26. logFunc func(msg string, fields ...log.Field)
  27. }
  28. func (w *loggerWriter) Write(p []byte) (int, error) {
  29. p = bytes.TrimSpace(p)
  30. w.logFunc(string(p))
  31. return len(p), nil
  32. }
  33. // New creates stdlib log.Logger that writes to provided logger on Error level
  34. func New(logger log.Logger) *stdlog.Logger {
  35. l := log.AddCallerSkip(logger, 3)
  36. return stdlog.New(&loggerWriter{logFunc: l.Error}, "", 0)
  37. }
  38. // NewAt creates stdlib log.Logger that writes to provided logger on specified level
  39. func NewAt(logger log.Logger, lvl log.Level) (*stdlog.Logger, error) {
  40. l := log.AddCallerSkip(logger, 3)
  41. logFunc, err := levelToFunc(l, lvl)
  42. if err != nil {
  43. return nil, err
  44. }
  45. return stdlog.New(&loggerWriter{logFunc: logFunc}, "", 0), nil
  46. }