github.com/del680202/goofys@v0.19.1-0.20180727070818-6a609fafa266/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 }