github.com/t2y/goofys@v0.19.1-0.20190123053037-27053313e616/internal/logger.go (about)

     1  // Copyright 2015 - 2017 Ka-Hing Cheung
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package internal
    16  
    17  import (
    18  	"fmt"
    19  	glog "log"
    20  	"log/syslog"
    21  	"os"
    22  	"strings"
    23  	"sync"
    24  
    25  	"github.com/sirupsen/logrus"
    26  	logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"
    27  )
    28  
    29  var mu sync.Mutex
    30  var loggers = make(map[string]*LogHandle)
    31  
    32  var log = GetLogger("main")
    33  var fuseLog = GetLogger("fuse")
    34  
    35  var syslogHook *logrus_syslog.SyslogHook
    36  
    37  func InitLoggers(logToSyslog bool) {
    38  	if logToSyslog {
    39  		var err error
    40  		syslogHook, err = logrus_syslog.NewSyslogHook("", "", syslog.LOG_DEBUG, "")
    41  		if err != nil {
    42  			panic("Unable to connect to local syslog daemon")
    43  		}
    44  
    45  		for _, l := range loggers {
    46  			l.Hooks.Add(syslogHook)
    47  		}
    48  	}
    49  }
    50  
    51  type LogHandle struct {
    52  	logrus.Logger
    53  
    54  	name string
    55  	Lvl  *logrus.Level
    56  }
    57  
    58  func (l *LogHandle) Format(e *logrus.Entry) ([]byte, error) {
    59  	// Mon Jan 2 15:04:05 -0700 MST 2006
    60  	timestamp := ""
    61  	lvl := e.Level
    62  	if l.Lvl != nil {
    63  		lvl = *l.Lvl
    64  	}
    65  
    66  	if syslogHook == nil {
    67  		const timeFormat = "2006/01/02 15:04:05.000000"
    68  
    69  		timestamp = e.Time.Format(timeFormat) + " "
    70  	}
    71  
    72  	str := fmt.Sprintf("%v%v.%v %v",
    73  		timestamp,
    74  		l.name,
    75  		strings.ToUpper(lvl.String()),
    76  		e.Message)
    77  
    78  	if len(e.Data) != 0 {
    79  		str += " " + fmt.Sprint(e.Data)
    80  	}
    81  
    82  	str += "\n"
    83  	return []byte(str), nil
    84  }
    85  
    86  // for aws.Logger
    87  func (l *LogHandle) Log(args ...interface{}) {
    88  	l.Debugln(args...)
    89  }
    90  
    91  func NewLogger(name string) *LogHandle {
    92  	l := &LogHandle{name: name}
    93  	l.Out = os.Stderr
    94  	l.Formatter = l
    95  	l.Level = logrus.InfoLevel
    96  	l.Hooks = make(logrus.LevelHooks)
    97  	if syslogHook != nil {
    98  		l.Hooks.Add(syslogHook)
    99  	}
   100  	return l
   101  }
   102  
   103  func GetLogger(name string) *LogHandle {
   104  	mu.Lock()
   105  	defer mu.Unlock()
   106  
   107  	if logger, ok := loggers[name]; ok {
   108  		return logger
   109  	} else {
   110  		logger := NewLogger(name)
   111  		loggers[name] = logger
   112  		return logger
   113  	}
   114  }
   115  
   116  func GetStdLogger(l *LogHandle, lvl logrus.Level) *glog.Logger {
   117  	mu.Lock()
   118  	defer mu.Unlock()
   119  
   120  	w := l.Writer()
   121  	l.Formatter.(*LogHandle).Lvl = &lvl
   122  	l.Level = lvl
   123  	return glog.New(w, "", 0)
   124  }