internal/logger/logger.go (104 lines of code) (raw):

// Copyright Amazon.com Inc. or its affiliates. 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. A copy of the // License is located at // // http://aws.amazon.com/apache2.0 // // or in the "license" file accompanying this file. This file 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. // Package logger provides logging functionality. package logger import ( "context" "fmt" "os" "path/filepath" "time" "github.com/aws/aws-signer-notation-plugin/internal/version" ) type contextKey int const logContextKey contextKey = iota var userConfigDir = os.UserConfigDir // for unit test var discardLogger = &debugLogger{} type debugLogger struct { file *os.File } // New creates a new debugLogger instance func New() (*debugLogger, error) { cfgDir, err := userConfigDir() if err != nil { return nil, err } path := filepath.Join(cfgDir, "notation-aws-signer", "plugin.log") if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil { return nil, err } file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600) if err != nil { return nil, err } dl := &debugLogger{ file: file, } dl.Debugln("-----------------------------------------------------------------------------------------") dl.Debugf("Logs from execution of AWS signer plugin version: %s\n", version.GetVersion()) return dl, nil } // Close closes the logger and associated resources func (l *debugLogger) Close() { if l.file != nil { err := l.file.Close() if err != nil { l.Errorf("error while closing the log file", err) } } } // GetLogger returns the logger instance func GetLogger(ctx context.Context) *debugLogger { debugLogger, ok := ctx.Value(logContextKey).(*debugLogger) if !ok { return discardLogger } return debugLogger } // UpdateContext returns context with the logger entry func (l *debugLogger) UpdateContext(ctx context.Context) context.Context { return context.WithValue(ctx, logContextKey, l) } // IsDebug returns true if Debug log is enabled func (l *debugLogger) IsDebug() bool { return l.file != nil } func (l *debugLogger) Debug(args ...interface{}) { l.log("DEBUG", args...) } func (l *debugLogger) Debugf(format string, args ...interface{}) { l.logf("DEBUG", format, args...) } func (l *debugLogger) Debugln(args ...interface{}) { l.logln("DEBUG", args...) } func (l *debugLogger) Info(args ...interface{}) { l.log("INFO", args...) } func (l *debugLogger) Infof(format string, args ...interface{}) { l.logf("INFO", format, args...) } func (l *debugLogger) Infoln(args ...interface{}) { l.logln("INFO", args...) } func (l *debugLogger) Warn(args ...interface{}) { l.log("WARN", args...) } func (l *debugLogger) Warnf(format string, args ...interface{}) { l.logf("WARN", format, args...) } func (l *debugLogger) Warnln(args ...interface{}) { l.logln("WARN", args...) } func (l *debugLogger) Error(args ...interface{}) { l.log("ERROR", args...) } func (l *debugLogger) Errorf(format string, args ...interface{}) { l.logf("ERROR", format, args...) } func (l *debugLogger) Errorln(args ...interface{}) { l.logln("ERROR", args...) } func (l *debugLogger) logf(levelPrefix, format string, args ...interface{}) { if l.file != nil { _, _ = fmt.Fprintf(l.file, "%s [%s] "+format, append([]interface{}{time.Now().Format(time.RFC3339Nano), levelPrefix}, args...)...) } } func (l *debugLogger) log(levelPrefix string, args ...interface{}) { l.logf(levelPrefix, "%v", args...) } func (l *debugLogger) logln(levelPrefix string, args ...interface{}) { l.logf(levelPrefix, "%v\n", args...) }