diff --git a/fileserver/fileserver.go b/fileserver/fileserver.go index 9c668eb..39acddc 100644 --- a/fileserver/fileserver.go +++ b/fileserver/fileserver.go @@ -30,6 +30,7 @@ import ( _ "github.com/mattn/go-sqlite3" log "github.com/sirupsen/logrus" "gopkg.in/ini.v1" + stdlog "log" "net/http/pprof" ) @@ -374,17 +375,6 @@ func main() { log.SetLevel(level) } - if absLogFile != "" { - errorLogFile := filepath.Join(filepath.Dir(absLogFile), "fileserver-error.log") - fp, err := os.OpenFile(errorLogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) - if err != nil { - log.Fatalf("Failed to open or create error log file: %v", err) - } - syscall.Dup3(int(fp.Fd()), int(os.Stderr.Fd()), 0) - // We need to close the old fp, because it has beed duped. - fp.Close() - } - if err := option.LoadSeahubConfig(); err != nil { log.Fatalf("Failed to read seahub config: %v", err) } @@ -418,8 +408,14 @@ func main() { log.Print("Seafile file server started.") - addr := fmt.Sprintf("%s:%d", option.Host, option.Port) - err = http.ListenAndServe(addr, router) + server := new(http.Server) + server.Addr = fmt.Sprintf("%s:%d", option.Host, option.Port) + server.Handler = router + + errorLog := stdlog.New(log.StandardLogger().Writer(), "", 0) + server.ErrorLog = errorLog + + err = server.ListenAndServe() if err != nil { log.Printf("File server exiting: %v", err) } @@ -457,14 +453,6 @@ func logRotate() { logFp.Close() logFp = fp } - - errorLogFile := filepath.Join(filepath.Dir(absLogFile), "fileserver-error.log") - errFp, err := os.OpenFile(errorLogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) - if err != nil { - log.Fatalf("Failed to reopen fileserver error log: %v", err) - } - syscall.Dup3(int(errFp.Fd()), int(os.Stderr.Fd()), 0) - errFp.Close() } var rpcclient *searpc.Client diff --git a/notification-server/logger.go b/notification-server/logger.go index e6a2e12..600808b 100644 --- a/notification-server/logger.go +++ b/notification-server/logger.go @@ -1,18 +1,36 @@ package main import ( + "fmt" + "strings" + log "github.com/sirupsen/logrus" ) const ( - timestampFormat = "2006/01/02 15:04:05 " + timestampFormat = "[2006-01-02 15:04:05] " ) type LogFormatter struct{} func (f *LogFormatter) Format(entry *log.Entry) ([]byte, error) { - buf := make([]byte, 0, len(timestampFormat)+len(entry.Message)+1) + levelStr := entry.Level.String() + if levelStr == "fatal" { + levelStr = "ERROR" + } else { + levelStr = strings.ToUpper(levelStr) + } + level := fmt.Sprintf("[%s] ", levelStr) + appName := "" + if logToStdout { + appName = "[notification-server] " + } + buf := make([]byte, 0, len(appName)+len(timestampFormat)+len(level)+len(entry.Message)+1) + if logToStdout { + buf = append(buf, appName...) + } buf = entry.Time.AppendFormat(buf, timestampFormat) + buf = append(buf, level...) buf = append(buf, entry.Message...) buf = append(buf, '\n') return buf, nil diff --git a/notification-server/server.go b/notification-server/server.go index e1d62b4..4ab94bd 100644 --- a/notification-server/server.go +++ b/notification-server/server.go @@ -20,6 +20,7 @@ import ( "github.com/gorilla/websocket" log "github.com/sirupsen/logrus" "gopkg.in/ini.v1" + stdlog "log" ) var configDir string @@ -31,10 +32,17 @@ var logFp *os.File var ccnetDB *sql.DB +var logToStdout bool + func init() { flag.StringVar(&configDir, "c", "", "config directory") flag.StringVar(&logFile, "l", "", "log file path") + env := os.Getenv("SEAFILE_LOG_TO_STDOUT") + if env == "true" { + logToStdout = true + } + log.SetFormatter(&LogFormatter{}) } @@ -166,7 +174,9 @@ func main() { log.Fatalf("config directory %s doesn't exist: %v.", configDir, err) } - if logFile == "" { + if logToStdout { + // Use default output (StdOut) + } else if logFile == "" { absLogFile = filepath.Join(configDir, "notification-server.log") fp, err := os.OpenFile(absLogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) if err != nil { @@ -187,16 +197,6 @@ func main() { log.SetOutput(fp) } - if absLogFile != "" { - errorLogFile := filepath.Join(filepath.Dir(absLogFile), "notification-server-error.log") - fp, err := os.OpenFile(errorLogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) - if err != nil { - log.Fatalf("Failed to open or create error log file: %v", err) - } - syscall.Dup3(int(fp.Fd()), int(os.Stderr.Fd()), 0) - fp.Close() - } - if err := loadJwtPrivateKey(); err != nil { log.Fatalf("Failed to read config: %v", err) } @@ -212,8 +212,13 @@ func main() { log.Info("notification server started.") - addr := fmt.Sprintf("%s:%d", host, port) - err = http.ListenAndServe(addr, router) + server := new(http.Server) + server.Addr = fmt.Sprintf("%s:%d", host, port) + server.Handler = router + + errorLog := stdlog.New(log.StandardLogger().Writer(), "", 0) + server.ErrorLog = errorLog + err = server.ListenAndServe() if err != nil { log.Infof("notificationserver exiting: %v", err) } @@ -239,6 +244,9 @@ func handleUser1Signal() { } func logRotate() { + if logToStdout { + return + } fp, err := os.OpenFile(absLogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) if err != nil { log.Fatalf("Failed to reopen notification log: %v", err) @@ -248,14 +256,6 @@ func logRotate() { logFp.Close() logFp = fp } - - errorLogFile := filepath.Join(filepath.Dir(absLogFile), "notification-server-error.log") - errFp, err := os.OpenFile(errorLogFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) - if err != nil { - log.Fatalf("Failed to reopen notification error log: %v", err) - } - syscall.Dup3(int(errFp.Fd()), int(os.Stderr.Fd()), 0) - errFp.Close() } func newHTTPRouter() *mux.Router {