Skip to content

Commit 2d4b590

Browse files
authored
Merge pull request #1 from cabify/colega/rc-v1.3.0-configure-service-logger
RC v1.3.0 configure service logger
2 parents a9791b9 + edda9af commit 2d4b590

File tree

4 files changed

+132
-0
lines changed

4 files changed

+132
-0
lines changed

CHANGELOG.md

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Changelog
2+
All notable changes to this project will be documented in this file.
3+
4+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6+
7+
## [Unreleased]
8+
### Added
9+
- Nothing
10+
11+
### Changed
12+
- Nothing
13+
14+
### Deprecated
15+
- Nothing
16+
17+
### Removed
18+
- Nothing
19+
20+
### Fixed
21+
- Nothing
22+
23+
### Security
24+
- Nothing
25+
26+
## [1.3.0] - 2019-02-27
27+
### Added
28+
- `ConfigureDefaultLogger` boilerplate for logger configuration
29+
- `measuredLoggingHandler` to wrap loggers with metrics
30+
- `CHANGELOG.md`: this file

configure.go

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package log
2+
3+
import (
4+
"os"
5+
)
6+
7+
// Config defines the logging configuration
8+
type Config struct {
9+
Level string `default:"info"`
10+
Output string `default:"stdout"`
11+
}
12+
13+
// ConfigureDefaultLogger configures loggers for your service, optionally adding log message counters with your favorite
14+
// metrics system
15+
func ConfigureDefaultLogger(name string, cfg Config, logCounters ...CountLogMessage) {
16+
if logLevel, ok := logLevelMap[cfg.Level]; ok {
17+
SetLevel(logLevel) // This sets the default level for all future
18+
DefaultLevel = logLevel
19+
} else {
20+
Warningf("Unknown log level configured: %s", cfg.Level)
21+
}
22+
23+
var handler Handler = NewFileHandler(getLoggerOutput(cfg.Output))
24+
25+
if len(logCounters) > 0 {
26+
handler = &metricsAgentLoggingHandler{
27+
Handler: handler,
28+
logCounters: logCounters,
29+
}
30+
}
31+
handler.SetFormatter(DefaultFormatter)
32+
33+
logger := NewLogger(name)
34+
if cfg.Level != logLevelDebug {
35+
logger = NoDebugLogger{
36+
Logger: logger,
37+
}
38+
}
39+
logger.SetHandler(handler)
40+
41+
DefaultLogger = logger
42+
Infof("Configured default logger %s with log level %s", name, cfg.Level)
43+
}
44+
45+
func getLoggerOutput(outputName string) *os.File {
46+
switch outputName {
47+
case "stdout":
48+
return os.Stdout
49+
case "stderr":
50+
return os.Stderr
51+
default:
52+
Warningf("Unknown logger output defined in the config: '%s'", outputName)
53+
return os.Stderr
54+
}
55+
}

log.go

+26
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,29 @@ func Infoln(args ...interface{}) { DefaultLogger.Infoln(args..
5858
func Debug(args ...interface{}) { DefaultLogger.Debug(args...) }
5959
func Debugf(format string, args ...interface{}) { DefaultLogger.Debugf(format, args...) }
6060
func Debugln(args ...interface{}) { DefaultLogger.Debugln(args...) }
61+
62+
const (
63+
logLevelCritical = "critical"
64+
logLevelError = "error"
65+
logLevelWarning = "warning"
66+
logLevelNotice = "notice"
67+
logLevelInfo = "info"
68+
logLevelDebug = "debug"
69+
)
70+
71+
var logLevelMap = map[string]Level{
72+
logLevelCritical: CRITICAL,
73+
logLevelError: ERROR,
74+
logLevelWarning: WARNING,
75+
logLevelNotice: NOTICE,
76+
logLevelInfo: INFO,
77+
logLevelDebug: DEBUG,
78+
}
79+
80+
var logLevelNameMap = make(map[Level]string)
81+
82+
func init() {
83+
for name, value := range logLevelMap {
84+
logLevelNameMap[value] = name
85+
}
86+
}

metrics_logging_handler.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package log
2+
3+
// CountLogMessage offers a method to count log messages logged by the logger
4+
type CountLogMessage func(level string)
5+
6+
type metricsAgentLoggingHandler struct {
7+
Handler
8+
logCounters []CountLogMessage
9+
}
10+
11+
// Handle decorates Handler's Handle method counting the log messages
12+
func (h *metricsAgentLoggingHandler) Handle(record *Record) {
13+
level := "unknown"
14+
if levelName, ok := logLevelNameMap[record.Level]; ok {
15+
level = levelName
16+
}
17+
for _, countLogMessage := range h.logCounters {
18+
countLogMessage(level)
19+
}
20+
h.Handler.Handle(record)
21+
}

0 commit comments

Comments
 (0)