* feat: introduce tls parameters in config to allow startTLS * feat: pass tls config for startTLS to ldap server * build: update libs to use newer ldap * feat: allow tls config for startTLS
86 lines
1.9 KiB
Go
86 lines
1.9 KiB
Go
//go:build !windows
|
|
// +build !windows
|
|
|
|
package logging
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"log/syslog"
|
|
"os"
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
// We will use this package to wrap log messages coming from libraries who have no interest
|
|
// in generating structured output.
|
|
|
|
var (
|
|
ldapliblogmatcher = regexp.MustCompile(`^\d{4}\/\d{1,2}\/\d{1,2} \d{1,2}\:\d{1,2}\:\d{1,2} `)
|
|
)
|
|
|
|
func InitLogging(reqdebug bool, reqsyslog bool, reqstructlog bool) zerolog.Logger {
|
|
var level zerolog.Level
|
|
if reqdebug {
|
|
level = zerolog.DebugLevel
|
|
} else {
|
|
level = zerolog.InfoLevel
|
|
}
|
|
|
|
var mainWriter io.Writer
|
|
if reqstructlog {
|
|
// Vroom vroom
|
|
mainWriter = os.Stderr
|
|
zerolog.TimeFieldFormat = time.RFC1123Z
|
|
} else {
|
|
// This is the inefficient writer
|
|
mainWriter = zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC1123Z}
|
|
}
|
|
|
|
var logr zerolog.Logger
|
|
if reqsyslog {
|
|
s, err := syslog.New(syslog.LOG_INFO, "glauth")
|
|
if err != nil {
|
|
fmt.Println("Unable to write to syslog: ignoring...")
|
|
reqsyslog = false
|
|
} else {
|
|
writers := zerolog.MultiLevelWriter(mainWriter, zerolog.SyslogLevelWriter(s))
|
|
logr = zerolog.New(writers).Level(level).With().Timestamp().Logger()
|
|
}
|
|
}
|
|
|
|
if !reqsyslog {
|
|
logr = zerolog.New(mainWriter).Level(level).With().Timestamp().Logger()
|
|
}
|
|
|
|
log.SetOutput(customWriter{logr: logr, structlog: reqstructlog})
|
|
|
|
return logr
|
|
}
|
|
|
|
type customWriter struct {
|
|
logr zerolog.Logger
|
|
structlog bool
|
|
}
|
|
|
|
func (e customWriter) Write(p []byte) (int, error) {
|
|
submatchall := ldapliblogmatcher.FindAllString(string(p), 1)
|
|
var msg string
|
|
for _, element := range submatchall {
|
|
msg = strings.TrimSpace(string(p[len(element):]))
|
|
}
|
|
if msg == "" {
|
|
msg = strings.TrimSpace(string(p))
|
|
}
|
|
if e.structlog {
|
|
fmt.Fprintf(os.Stderr, "{\"level\":\"info\",\"time\":\"%s\",\"message\":\"%s\"}\n", time.Now().Format(time.RFC1123Z), strings.Replace(strings.TrimSpace(msg), `"`, `\"`, -1))
|
|
} else {
|
|
e.logr.Info().Msg(msg)
|
|
}
|
|
return len(p), nil
|
|
}
|