diff options
author | Joanna Jeremicz <joanna.jeremicz@nokia.com> | 2020-10-30 17:06:04 +0100 |
---|---|---|
committer | Joanna Jeremicz <joanna.jeremicz@nokia.com> | 2020-11-05 13:53:05 +0100 |
commit | 5fe9e1b7c43fc1a34b38899a2a055540cc30ac81 (patch) | |
tree | 5a83d0219fa03f0d280db61ed44f64d377a04138 /certServiceK8sExternalProvider/src/leveledlogger | |
parent | 15446c2ccfc117a0feb5a5249c2e62714b2cd3d7 (diff) |
[OOM-K8S-CERT-EXTERNAL-PROVIDER] Change logger implementation provider
Issue-ID: OOM-2559
Signed-off-by: Joanna Jeremicz <joanna.jeremicz@nokia.com>
Change-Id: I717dfcfd74a01ccb81b2eb03c52be2c90fc3a9c5
Diffstat (limited to 'certServiceK8sExternalProvider/src/leveledlogger')
7 files changed, 266 insertions, 0 deletions
diff --git a/certServiceK8sExternalProvider/src/leveledlogger/logger.go b/certServiceK8sExternalProvider/src/leveledlogger/logger.go new file mode 100644 index 00000000..ee839cbc --- /dev/null +++ b/certServiceK8sExternalProvider/src/leveledlogger/logger.go @@ -0,0 +1,138 @@ +/* + * ============LICENSE_START======================================================= + * oom-certservice-k8s-external-provider + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package leveledlogger + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "log" + + "github.com/go-logr/logr" + "go.uber.org/zap/zapcore" + "github.com/go-logr/zapr" + "go.uber.org/zap" +) + +const ( + WARNING = int(zapcore.WarnLevel) * -1 + INFO = int(zapcore.InfoLevel) * -1 + DEBUG = int(zapcore.DebugLevel) * -1 +) + +type Logger struct { + Log logr.Logger + ConfigFile string +} + +var configFileName = "default" +var logLevel = "warn" + +func SetConfigFileName(newName string) { + configFileName = newName +} + +func SetLogLevel(level string) { + logLevel = level +} + +func GetLogger() Logger { + var cfg zap.Config + + if err := json.Unmarshal(getConfig(), &cfg); err != nil { + panic(err) + } + logger, err := cfg.Build() + if err != nil { + panic(err) + } + + leveledLogger := Logger{ + Log: zapr.NewLogger(logger), + } + return leveledLogger +} + +func GetLoggerWithValues(keysAndValues ...interface{}) Logger { + leveledLogger := GetLogger() + leveledLogger.Log = leveledLogger.Log.WithValues(keysAndValues...) + return leveledLogger +} + +func GetLoggerWithName(name string) Logger { + leveledLogger := GetLogger() + leveledLogger.Log = leveledLogger.Log.WithName(name) + return leveledLogger +} + +func (logger *Logger) Error(err error, message string, keysAndValues ...interface{}) { + logger.Log.Error(err, message, keysAndValues...) +} + +func (logger *Logger) Warning(message string, keysAndValues ...interface{}) { + logger.log(message, WARNING, keysAndValues...) +} + +func (logger *Logger) Info(message string, keysAndValues ...interface{}) { + logger.log(message, INFO, keysAndValues...) +} + +func (logger *Logger) Debug(message string, keysAndValues ...interface{}) { + logger.log(message, DEBUG, keysAndValues...) +} + +func (logger *Logger) log(message string, lvl int, keysAndValues ...interface{}) { + logger.Log.V(lvl).Info(message, keysAndValues...) +} + +func getDefaultConfig() []byte { + return []byte(fmt.Sprintf(`{ + "level": "%s", + "encoding": "console", + "outputPaths": ["stdout"], + "encoderConfig": { + "timeKey": "timeKey", + "messageKey": "message", + "levelKey": "level", + "nameKey": "name", + "levelEncoder": "capital", + "timeEncoder": "iso8601" + } + }`, logLevel)) +} + +func getConfig() []byte { + var config = []byte{} + if configFileName == "default" { + config = getDefaultConfig() + } else { + config = readFile(configFileName) + } + return config +} + +func readFile(filename string) []byte { + certRequest, err := ioutil.ReadFile(filename) + if err != nil { + log.Fatal(err) + } + return certRequest +} diff --git a/certServiceK8sExternalProvider/src/leveledlogger/logger_config.json b/certServiceK8sExternalProvider/src/leveledlogger/logger_config.json new file mode 100644 index 00000000..96ba7024 --- /dev/null +++ b/certServiceK8sExternalProvider/src/leveledlogger/logger_config.json @@ -0,0 +1,13 @@ +{ + "level": "debug", + "encoding": "console", + "outputPaths": ["stdout"], + "encoderConfig": { + "timeKey": "timeKey", + "messageKey": "message", + "levelKey": "level", + "nameKey": "name", + "levelEncoder": "capital", + "timeEncoder": "iso8601" + } +} diff --git a/certServiceK8sExternalProvider/src/leveledlogger/logger_test.go b/certServiceK8sExternalProvider/src/leveledlogger/logger_test.go new file mode 100644 index 00000000..84aa5907 --- /dev/null +++ b/certServiceK8sExternalProvider/src/leveledlogger/logger_test.go @@ -0,0 +1,87 @@ +/* + * ============LICENSE_START======================================================= + * oom-certservice-k8s-external-provider + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package leveledlogger + +import ( + "bytes" + "fmt" + "log" + "os" + "testing" +) + +func TestLoggerOnWarningLevel(t *testing.T) { + const resultLogName = "testdata/test_result_warn.log" + const expectedLogName = "testdata/test_expected_warn.log" + + SetConfigFileName("testdata/test_logger_config_warn.json") + logger := GetLoggerWithName("loggername") + + logOnAllLevels(logger) + + resultLogBytes := readFile(resultLogName) + expectedLogBytes := readFile(expectedLogName) + + assertLogEquals(t, resultLogBytes, expectedLogBytes, resultLogName) +} + +func TestLoggerOnDebugLevel(t *testing.T) { + const resultLogName = "testdata/test_result_debug.log" + const expectedLogName = "testdata/test_expected_debug.log" + + SetConfigFileName("testdata/test_logger_config_debug.json") + logger := GetLoggerWithName("loggername") + + logOnAllLevels(logger) + + resultLogBytes := readFile(resultLogName) + expectedLogBytes := readFile(expectedLogName) + + assertLogEquals(t, resultLogBytes, expectedLogBytes, resultLogName) +} + +func logOnAllLevels(logger Logger) { + logger.Debug("this is a debug message") + logger.Info("this is an info message") + logger.Warning("this is a warning message", "key1", "value1") + logger.Error(fmt.Errorf("this is an error message"), "err msg") +} + +func assertLogEquals(t *testing.T, resultLogBytes []byte, expectedLogBytes []byte, resultLogName string) { + if areEqual(resultLogBytes, expectedLogBytes) { + removeTemporaryFile(resultLogName) + } else { + t.Fatal("Logs are different than expected. Please check: " + resultLogName) + } +} + +func areEqual(slice1 []byte, slice2 []byte) bool { + return bytes.Compare(slice1, slice2) == 0 +} + +func removeTemporaryFile(fileName string) { + if _, err := os.Stat(fileName); err == nil { + e := os.Remove(fileName) + if e != nil { + log.Fatal(e) + } + } +} diff --git a/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_expected_debug.log b/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_expected_debug.log new file mode 100644 index 00000000..25242eee --- /dev/null +++ b/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_expected_debug.log @@ -0,0 +1,4 @@ +DEBUG loggername this is a debug message +INFO loggername this is an info message +WARN loggername this is a warning message {"key1": "value1"} +ERROR loggername err msg {"error": "this is an error message"} diff --git a/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_expected_warn.log b/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_expected_warn.log new file mode 100644 index 00000000..b6a1985b --- /dev/null +++ b/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_expected_warn.log @@ -0,0 +1,2 @@ +WARN loggername this is a warning message {"key1": "value1"} +ERROR loggername err msg {"error": "this is an error message"} diff --git a/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_logger_config_debug.json b/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_logger_config_debug.json new file mode 100644 index 00000000..96ac5dc7 --- /dev/null +++ b/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_logger_config_debug.json @@ -0,0 +1,11 @@ +{ + "level": "debug", + "encoding": "console", + "outputPaths": ["stdout", "testdata/test_result_debug.log"], + "encoderConfig": { + "messageKey": "message", + "levelKey": "level", + "nameKey": "name", + "levelEncoder": "capital" + } +} diff --git a/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_logger_config_warn.json b/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_logger_config_warn.json new file mode 100644 index 00000000..a07bdb26 --- /dev/null +++ b/certServiceK8sExternalProvider/src/leveledlogger/testdata/test_logger_config_warn.json @@ -0,0 +1,11 @@ +{ + "level": "warn", + "encoding": "console", + "outputPaths": ["stdout", "testdata/test_result_warn.log"], + "encoderConfig": { + "messageKey": "message", + "levelKey": "level", + "nameKey": "name", + "levelEncoder": "capital" + } +} |