Add API Framework Revel Source Files
[iec.git] / src / foundation / api / revel / logger / utils.go
1 package logger
2
3 import (
4         "github.com/revel/log15"
5         "gopkg.in/stack.v0"
6         "log"
7 )
8
9 // Utility package to make existing logging backwards compatible
10 var (
11         // Convert the string to LogLevel
12         toLevel = map[string]LogLevel{"debug": LogLevel(log15.LvlDebug),
13                 "info": LogLevel(log15.LvlInfo), "request": LogLevel(log15.LvlInfo), "warn": LogLevel(log15.LvlWarn),
14                 "error": LogLevel(log15.LvlError), "crit": LogLevel(log15.LvlCrit),
15                 "trace": LogLevel(log15.LvlDebug), // TODO trace is deprecated, replaced by debug
16         }
17 )
18
19 const (
20         // The test mode flag overrides the default log level and shows only errors
21         TEST_MODE_FLAG = "testModeFlag"
22         // The special use flag enables showing messages when the logger is setup
23         SPECIAL_USE_FLAG = "specialUseFlag"
24 )
25
26 // Returns the logger for the name
27 func GetLogger(name string, logger MultiLogger) (l *log.Logger) {
28         switch name {
29         case "trace": // TODO trace is deprecated, replaced by debug
30                 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlDebug}, "", 0)
31         case "debug":
32                 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlDebug}, "", 0)
33         case "info":
34                 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlInfo}, "", 0)
35         case "warn":
36                 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlWarn}, "", 0)
37         case "error":
38                 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlError}, "", 0)
39         case "request":
40                 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlInfo}, "", 0)
41         }
42
43         return l
44
45 }
46
47 // Used by the initFilterLog to handle the filters
48 var logFilterList = []struct {
49         LogPrefix, LogSuffix string
50         parentHandler        func(map[string]interface{}) ParentLogHandler
51 }{{
52         "log.", ".filter",
53         func(keyMap map[string]interface{}) ParentLogHandler {
54                 return NewParentLogHandler(func(child LogHandler) LogHandler {
55                         return MatchMapHandler(keyMap, child)
56                 })
57
58         },
59 }, {
60         "log.", ".nfilter",
61         func(keyMap map[string]interface{}) ParentLogHandler {
62                 return NewParentLogHandler(func(child LogHandler) LogHandler {
63                         return NotMatchMapHandler(keyMap, child)
64                 })
65         },
66 }}
67
68 // This structure and method will handle the old output format and log it to the new format
69 type loggerRewrite struct {
70         Logger         MultiLogger
71         Level          log15.Lvl
72         hideDeprecated bool
73 }
74
75 // The message indicating that a logger is using a deprecated log mechanism
76 var log_deprecated = []byte("* LOG DEPRECATED * ")
77
78 // Implements the Write of the logger
79 func (lr loggerRewrite) Write(p []byte) (n int, err error) {
80         if !lr.hideDeprecated {
81                 p = append(log_deprecated, p...)
82         }
83         n = len(p)
84         if len(p) > 0 && p[n-1] == '\n' {
85                 p = p[:n-1]
86                 n--
87         }
88
89         switch lr.Level {
90         case log15.LvlInfo:
91                 lr.Logger.Info(string(p))
92         case log15.LvlDebug:
93                 lr.Logger.Debug(string(p))
94         case log15.LvlWarn:
95                 lr.Logger.Warn(string(p))
96         case log15.LvlError:
97                 lr.Logger.Error(string(p))
98         case log15.LvlCrit:
99                 lr.Logger.Crit(string(p))
100         }
101
102         return
103 }
104
105 // For logging purposes the call stack can be used to record the stack trace of a bad error
106 // simply pass it as a context field in your log statement like
107 // `controller.Log.Crit("This should not occur","stack",revel.NewCallStack())`
108 func NewCallStack() interface{} {
109         return stack.Trace()
110 }