github.com/janelia-flyem/dvid@v1.0.0/dvid/log_local.go (about)

     1  // +build !clustered,!gcloud
     2  
     3  package dvid
     4  
     5  import (
     6  	"fmt"
     7  	"log"
     8  
     9  	"github.com/natefinch/lumberjack"
    10  )
    11  
    12  type stdLogger struct {
    13  	*lumberjack.Logger
    14  }
    15  
    16  var logger stdLogger
    17  
    18  type LogConfig struct {
    19  	Logfile string
    20  	MaxSize int `toml:"max_log_size"`
    21  	MaxAge  int `toml:"max_log_age"`
    22  }
    23  
    24  // SetLogger creates a logger that saves to a rotating log file.
    25  func (c *LogConfig) SetLogger() {
    26  	if c == nil || c.Logfile == "" {
    27  		Infof("Sending log messages to stdout since no log file specified.")
    28  		return
    29  	}
    30  	fmt.Printf("Sending log messages to: %s\n", c.Logfile)
    31  	l := &lumberjack.Logger{
    32  		Filename: c.Logfile,
    33  		MaxSize:  c.MaxSize, // megabytes
    34  		MaxAge:   c.MaxAge,  //days
    35  	}
    36  	log.SetOutput(l)
    37  	logger = stdLogger{l}
    38  }
    39  
    40  // --- Logger implementation ----
    41  
    42  // Debug writes directly to logger at DEBUG level.
    43  func (slog stdLogger) Debug(s string) {
    44  	if logger.Logger != nil {
    45  		logger.Write([]byte(" DEBUG " + s))
    46  	} else {
    47  		log.Printf(" DEBUG " + s)
    48  	}
    49  }
    50  
    51  // Info writes directly to logger at INFO level
    52  func (slog stdLogger) Info(s string) {
    53  	if logger.Logger != nil {
    54  		logger.Write([]byte(" INFO " + s))
    55  	} else {
    56  		log.Printf(" INFO " + s)
    57  	}
    58  }
    59  
    60  // Warning writes directly to logger at INFO level
    61  func (slog stdLogger) Warning(s string) {
    62  	if logger.Logger != nil {
    63  		logger.Write([]byte(" WARNING " + s))
    64  	} else {
    65  		log.Printf(" WARNING " + s)
    66  	}
    67  }
    68  
    69  // Error writes directly to logger at ERROR level
    70  func (slog stdLogger) Error(s string) {
    71  	if logger.Logger != nil {
    72  		logger.Write([]byte(" ERROR " + s))
    73  	} else {
    74  		log.Printf(" ERROR " + s)
    75  	}
    76  }
    77  
    78  // Critical writes directly to logger at CRITICAL level
    79  func (slog stdLogger) Critical(s string) {
    80  	if logger.Logger != nil {
    81  		logger.Write([]byte(" CRITICAL " + s))
    82  	} else {
    83  		log.Printf(" CRITICAL " + s)
    84  	}
    85  }
    86  
    87  // Debugf formats its arguments analogous to fmt.Printf and records the text as a log
    88  // message at Debug level.
    89  func (slog stdLogger) Debugf(format string, args ...interface{}) {
    90  	log.Printf(" DEBUG "+format, args...)
    91  }
    92  
    93  // Infof is like Debugf, but at Info level and will be written regardless if not in
    94  // verbose mode.
    95  func (slog stdLogger) Infof(format string, args ...interface{}) {
    96  	log.Printf(" INFO "+format, args...)
    97  }
    98  
    99  // Warningf is like Debugf, but at Warning level.
   100  func (slog stdLogger) Warningf(format string, args ...interface{}) {
   101  	log.Printf(" WARNING "+format, args...)
   102  }
   103  
   104  // Errorf is like Debugf, but at Error level.
   105  func (slog stdLogger) Errorf(format string, args ...interface{}) {
   106  	log.Printf(" ERROR "+format, args...)
   107  }
   108  
   109  // Criticalf is like Debugf, but at Critical level.
   110  func (slog stdLogger) Criticalf(format string, args ...interface{}) {
   111  	log.Printf(" CRITICAL "+format, args...)
   112  }
   113  
   114  func (slog stdLogger) Shutdown() {
   115  	log.Printf("Closing log file...\n")
   116  	if slog.Logger != nil {
   117  		slog.Close()
   118  	}
   119  }