8460: Cancel context before returning from handler.
[arvados.git] / services / ws / log.go
1 package main
2
3 import (
4         "context"
5
6         "github.com/Sirupsen/logrus"
7 )
8
9 var (
10         loggerCtxKey = new(int)
11         rootLogger   = logrus.New()
12 )
13
14 const rfc3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00"
15
16 // contextWithLogger returns a new child context such that
17 // logger(child) returns the given logger.
18 func contextWithLogger(ctx context.Context, logger *logrus.Entry) context.Context {
19         return context.WithValue(ctx, loggerCtxKey, logger)
20 }
21
22 // logger returns the logger suitable for the given context -- the one
23 // attached by contextWithLogger() if applicable, otherwise the
24 // top-level logger with no fields/values.
25 func logger(ctx context.Context) *logrus.Entry {
26         if ctx != nil {
27                 if logger, ok := ctx.Value(loggerCtxKey).(*logrus.Entry); ok {
28                         return logger
29                 }
30         }
31         return rootLogger.WithFields(nil)
32 }
33
34 // loggerConfig sets up logging to behave as configured.
35 func loggerConfig(cfg Config) {
36         lvl, err := logrus.ParseLevel(cfg.LogLevel)
37         if err != nil {
38                 logrus.Fatal(err)
39         }
40         rootLogger.Level = lvl
41         switch cfg.LogFormat {
42         case "text":
43                 rootLogger.Formatter = &logrus.TextFormatter{
44                         FullTimestamp:   true,
45                         TimestampFormat: rfc3339NanoFixed,
46                 }
47         case "json":
48                 rootLogger.Formatter = &logrus.JSONFormatter{
49                         TimestampFormat: rfc3339NanoFixed,
50                 }
51         default:
52                 logrus.WithField("LogFormat", cfg.LogFormat).Fatal("unknown log format")
53         }
54 }