[OOM-K8S-CERT-EXTERNAL-PROVIDER] Change logger implementation provider
[oom/platform/cert-service.git] / certServiceK8sExternalProvider / src / leveledlogger / logger.go
1 /*
2  * ============LICENSE_START=======================================================
3  * oom-certservice-k8s-external-provider
4  * ================================================================================
5  * Copyright (C) 2020 Nokia. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package leveledlogger
22
23 import (
24         "encoding/json"
25         "fmt"
26         "io/ioutil"
27         "log"
28
29         "github.com/go-logr/logr"
30         "go.uber.org/zap/zapcore"
31         "github.com/go-logr/zapr"
32         "go.uber.org/zap"
33 )
34
35 const (
36         WARNING = int(zapcore.WarnLevel) * -1
37         INFO    = int(zapcore.InfoLevel) * -1
38         DEBUG   = int(zapcore.DebugLevel) * -1
39 )
40
41 type Logger struct {
42         Log logr.Logger
43         ConfigFile string
44 }
45
46 var configFileName = "default"
47 var logLevel = "warn"
48
49 func SetConfigFileName(newName string) {
50         configFileName = newName
51 }
52
53 func SetLogLevel(level string) {
54         logLevel = level
55 }
56
57 func GetLogger() Logger {
58         var cfg zap.Config
59
60         if err := json.Unmarshal(getConfig(), &cfg); err != nil {
61                 panic(err)
62         }
63         logger, err := cfg.Build()
64         if err != nil {
65                 panic(err)
66         }
67
68         leveledLogger := Logger{
69                 Log: zapr.NewLogger(logger),
70         }
71         return leveledLogger
72 }
73
74 func GetLoggerWithValues(keysAndValues ...interface{}) Logger {
75         leveledLogger := GetLogger()
76         leveledLogger.Log = leveledLogger.Log.WithValues(keysAndValues...)
77         return leveledLogger
78 }
79
80 func GetLoggerWithName(name string) Logger {
81         leveledLogger := GetLogger()
82         leveledLogger.Log = leveledLogger.Log.WithName(name)
83         return leveledLogger
84 }
85
86 func (logger *Logger) Error(err error, message string, keysAndValues ...interface{}) {
87         logger.Log.Error(err, message, keysAndValues...)
88 }
89
90 func (logger *Logger) Warning(message string, keysAndValues ...interface{}) {
91         logger.log(message, WARNING, keysAndValues...)
92 }
93
94 func (logger *Logger) Info(message string, keysAndValues ...interface{}) {
95         logger.log(message, INFO, keysAndValues...)
96 }
97
98 func (logger *Logger) Debug(message string, keysAndValues ...interface{}) {
99         logger.log(message, DEBUG, keysAndValues...)
100 }
101
102 func (logger *Logger) log(message string, lvl int, keysAndValues ...interface{}) {
103         logger.Log.V(lvl).Info(message, keysAndValues...)
104 }
105
106 func getDefaultConfig() []byte {
107         return []byte(fmt.Sprintf(`{
108                 "level": "%s",
109                 "encoding": "console",
110                 "outputPaths": ["stdout"],
111                 "encoderConfig": {
112                 "timeKey": "timeKey",
113                 "messageKey": "message",
114                 "levelKey": "level",
115                 "nameKey": "name",
116                 "levelEncoder": "capital",
117                 "timeEncoder": "iso8601"
118                 }
119                 }`, logLevel))
120 }
121
122 func getConfig() []byte {
123         var config = []byte{}
124         if configFileName == "default" {
125                 config = getDefaultConfig()
126         } else {
127                 config = readFile(configFileName)
128         }
129         return config
130 }
131
132 func readFile(filename string) []byte {
133         certRequest, err := ioutil.ReadFile(filename)
134         if err != nil {
135                 log.Fatal(err)
136         }
137         return certRequest
138 }