summaryrefslogtreecommitdiff
path: root/internal/logger/logger.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/logger/logger.go')
-rw-r--r--internal/logger/logger.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/internal/logger/logger.go b/internal/logger/logger.go
new file mode 100644
index 0000000..bbc6a51
--- /dev/null
+++ b/internal/logger/logger.go
@@ -0,0 +1,82 @@
+package logger
+
+import (
+ "fmt"
+ "io"
+ golog "log"
+ "log/syslog"
+ "os"
+ "sync"
+
+ "gitlab.com/gitlab-org/gitlab-shell/internal/config"
+
+ log "github.com/sirupsen/logrus"
+)
+
+var (
+ logWriter io.Writer
+ bootstrapLogger *golog.Logger
+ pid int
+ mutex sync.Mutex
+ ProgName string
+)
+
+func Configure(cfg *config.Config) error {
+ mutex.Lock()
+ defer mutex.Unlock()
+
+ pid = os.Getpid()
+
+ var err error
+ logWriter, err = os.OpenFile(cfg.LogFile, os.O_WRONLY|os.O_APPEND, 0)
+ if err != nil {
+ return err
+ }
+
+ log.SetOutput(logWriter)
+ if cfg.LogFormat == "json" {
+ log.SetFormatter(&log.JSONFormatter{})
+ }
+
+ return nil
+}
+
+func logPrint(msg string, err error) {
+ mutex.Lock()
+ defer mutex.Unlock()
+
+ if logWriter == nil {
+ bootstrapLogPrint(msg, err)
+ return
+ }
+
+ log.WithError(err).WithFields(log.Fields{
+ "pid": pid,
+ }).Error(msg)
+}
+
+func Fatal(msg string, err error) {
+ logPrint(msg, err)
+ // We don't show the error to the end user because it can leak
+ // information that is private to the GitLab server.
+ fmt.Fprintf(os.Stderr, "%s: fatal: %s\n", ProgName, msg)
+ os.Exit(1)
+}
+
+// If our log file is not available we want to log somewhere else, but
+// not to standard error because that leaks information to the user. This
+// function attemps to log to syslog.
+//
+// We assume the logging mutex is already locked.
+func bootstrapLogPrint(msg string, err error) {
+ if bootstrapLogger == nil {
+ var err error
+ bootstrapLogger, err = syslog.NewLogger(syslog.LOG_ERR|syslog.LOG_USER, 0)
+ if err != nil {
+ // The message will not be logged.
+ return
+ }
+ }
+
+ bootstrapLogger.Print(ProgName+":", msg+":", err)
+}