summaryrefslogtreecommitdiff
path: root/src/mongo/gotools/src/github.com/mongodb/mongo-tools/legacy/log/tool_logger.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/gotools/src/github.com/mongodb/mongo-tools/legacy/log/tool_logger.go')
-rw-r--r--src/mongo/gotools/src/github.com/mongodb/mongo-tools/legacy/log/tool_logger.go162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/legacy/log/tool_logger.go b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/legacy/log/tool_logger.go
new file mode 100644
index 00000000000..bde3d871348
--- /dev/null
+++ b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/legacy/log/tool_logger.go
@@ -0,0 +1,162 @@
+// Copyright (C) MongoDB, Inc. 2014-present.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may
+// not use this file except in compliance with the License. You may obtain
+// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+
+// Package log provides a utility to log timestamped messages to an io.Writer.
+package log
+
+import (
+ "fmt"
+ "io"
+ "os"
+ "sync"
+ "time"
+)
+
+// Tool Logger verbosity constants
+const (
+ Always = iota
+ Info
+ DebugLow
+ DebugHigh
+)
+
+const (
+ ToolTimeFormat = "2006-01-02T15:04:05.000-0700"
+)
+
+//// Tool Logger Definition
+
+type ToolLogger struct {
+ mutex *sync.Mutex
+ writer io.Writer
+ format string
+ verbosity int
+}
+
+type VerbosityLevel interface {
+ Level() int
+ IsQuiet() bool
+}
+
+func (tl *ToolLogger) SetVerbosity(level VerbosityLevel) {
+ if level == nil {
+ tl.verbosity = 0
+ return
+ }
+
+ if level.IsQuiet() {
+ tl.verbosity = -1
+ } else {
+ tl.verbosity = level.Level()
+ }
+}
+
+func (tl *ToolLogger) SetWriter(writer io.Writer) {
+ tl.writer = writer
+}
+
+func (tl *ToolLogger) SetDateFormat(dateFormat string) {
+ tl.format = dateFormat
+}
+
+func (tl *ToolLogger) Logvf(minVerb int, format string, a ...interface{}) {
+ if minVerb < 0 {
+ panic("cannot set a minimum log verbosity that is less than 0")
+ }
+
+ if minVerb <= tl.verbosity {
+ tl.mutex.Lock()
+ defer tl.mutex.Unlock()
+ tl.log(fmt.Sprintf(format, a...))
+ }
+}
+
+func (tl *ToolLogger) Logv(minVerb int, msg string) {
+ if minVerb < 0 {
+ panic("cannot set a minimum log verbosity that is less than 0")
+ }
+
+ if minVerb <= tl.verbosity {
+ tl.mutex.Lock()
+ defer tl.mutex.Unlock()
+ tl.log(msg)
+ }
+}
+
+func (tl *ToolLogger) log(msg string) {
+ fmt.Fprintf(tl.writer, "%v\t%v\n", time.Now().Format(tl.format), msg)
+}
+
+func NewToolLogger(verbosity VerbosityLevel) *ToolLogger {
+ tl := &ToolLogger{
+ mutex: &sync.Mutex{},
+ writer: os.Stderr, // default to stderr
+ format: ToolTimeFormat,
+ }
+ tl.SetVerbosity(verbosity)
+ return tl
+}
+
+//// Log Writer Interface
+
+// toolLogWriter is an io.Writer wrapping a tool logger. It is a private
+// type meant for creation with the ToolLogger.Writer(...) method.
+type toolLogWriter struct {
+ logger *ToolLogger
+ minVerbosity int
+}
+
+func (tlw *toolLogWriter) Write(message []byte) (int, error) {
+ tlw.logger.Logv(tlw.minVerbosity, string(message))
+ return len(message), nil
+}
+
+// Writer returns an io.Writer that writes to the logger with
+// the given verbosity
+func (tl *ToolLogger) Writer(minVerb int) io.Writer {
+ return &toolLogWriter{tl, minVerb}
+}
+
+//// Global Logging
+
+var globalToolLogger *ToolLogger
+
+func init() {
+ if globalToolLogger == nil {
+ // initialize tool logger with verbosity level = 0
+ globalToolLogger = NewToolLogger(nil)
+ }
+}
+
+// IsInVerbosity returns true if the current verbosity level setting is
+// greater than or equal to the given level.
+func IsInVerbosity(minVerb int) bool {
+ return minVerb <= globalToolLogger.verbosity
+}
+
+func Logvf(minVerb int, format string, a ...interface{}) {
+ globalToolLogger.Logvf(minVerb, format, a...)
+}
+
+func Logv(minVerb int, msg string) {
+ globalToolLogger.Logv(minVerb, msg)
+}
+
+func SetVerbosity(verbosity VerbosityLevel) {
+ globalToolLogger.SetVerbosity(verbosity)
+}
+
+func SetWriter(writer io.Writer) {
+ globalToolLogger.SetWriter(writer)
+}
+
+func SetDateFormat(dateFormat string) {
+ globalToolLogger.SetDateFormat(dateFormat)
+}
+
+func Writer(minVerb int) io.Writer {
+ return globalToolLogger.Writer(minVerb)
+}