diff --git a/config.yml.sample b/config.yml.sample index 44fb3d44c..db30341e2 100644 --- a/config.yml.sample +++ b/config.yml.sample @@ -168,6 +168,10 @@ log: events: "off" # The log level for event log messages. Possible values (case-insensitive) are ERROR, INFO, DEBUG. eventslevel: "info" + # Whether or not to log mail log messages. This will not log mail contents. Possible values are stdout, stderr, file or off to disable mail-related logging. + mail: "off" + # The log level for mail log messages. Possible values (case-insensitive) are ERROR, WARNING, INFO, DEBUG. + maillevel: "info" ratelimit: # whether or not to enable the rate limit diff --git a/docs/content/doc/setup/config.md b/docs/content/doc/setup/config.md index 11103546e..ff63fde5e 100644 --- a/docs/content/doc/setup/config.md +++ b/docs/content/doc/setup/config.md @@ -871,6 +871,28 @@ Full path: `log.eventslevel` Environment path: `VIKUNJA_LOG_EVENTSLEVEL` +### mail + +Whether or not to log mail log messages. This will not log mail contents. Possible values are stdout, stderr, file or off to disable mail-related logging. + +Default: `off` + +Full path: `log.mail` + +Environment path: `VIKUNJA_LOG_MAIL` + + +### maillevel + +The log level for mail log messages. Possible values (case-insensitive) are ERROR, WARNING, INFO, DEBUG. + +Default: `info` + +Full path: `log.maillevel` + +Environment path: `VIKUNJA_LOG_MAILLEVEL` + + --- ## ratelimit diff --git a/pkg/config/config.go b/pkg/config/config.go index c081b277c..993e8a2c4 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -118,6 +118,8 @@ const ( LogPath Key = `log.path` LogEvents Key = `log.events` LogEventsLevel Key = `log.eventslevel` + LogMail Key = `log.mail` + LogMailLevel Key = `log.maillevel` RateLimitEnabled Key = `ratelimit.enabled` RateLimitKind Key = `ratelimit.kind` @@ -351,6 +353,8 @@ func InitDefaultConfig() { LogPath.setDefault(ServiceRootpath.GetString() + "/logs") LogEvents.setDefault("off") LogEventsLevel.setDefault("INFO") + LogMail.setDefault("off") + LogMailLevel.setDefault("INFO") // Rate Limit RateLimitEnabled.setDefault(false) RateLimitKind.setDefault("user") diff --git a/pkg/log/mail_logger.go b/pkg/log/mail_logger.go new file mode 100644 index 000000000..09acf52dc --- /dev/null +++ b/pkg/log/mail_logger.go @@ -0,0 +1,70 @@ +package log + +import ( + "code.vikunja.io/api/pkg/config" + "github.com/op/go-logging" + "strings" + "time" + "xorm.io/xorm/log" +) + +type MailLogger struct { + logger *logging.Logger + level log.LogLevel +} + +const mailFormat = `%{color}%{time:` + time.RFC3339Nano + `}: %{level}` + "\t" + `▶ [MAIL] %{id:03x}%{color:reset} %{message}` +const mailLogModule = `vikunja_mail` + +func NewMailLogger() *MailLogger { + lvl := strings.ToUpper(config.LogMailLevel.GetString()) + level, err := logging.LogLevel(lvl) + if err != nil { + Criticalf("Error setting database log level: %s", err.Error()) + } + + mailLogger := &MailLogger{ + logger: logging.MustGetLogger(mailLogModule), + } + + logBackend := logging.NewLogBackend(GetLogWriter("mail"), "", 0) + backend := logging.NewBackendFormatter(logBackend, logging.MustStringFormatter(mailFormat+"\n")) + + backendLeveled := logging.AddModuleLevel(backend) + backendLeveled.SetLevel(level, mailLogModule) + + mailLogger.logger.SetBackend(backendLeveled) + + switch level { + case logging.CRITICAL: + case logging.ERROR: + mailLogger.level = log.LOG_ERR + case logging.WARNING: + mailLogger.level = log.LOG_WARNING + case logging.NOTICE: + case logging.INFO: + mailLogger.level = log.LOG_INFO + case logging.DEBUG: + mailLogger.level = log.LOG_DEBUG + default: + mailLogger.level = log.LOG_OFF + } + + return mailLogger +} + +func (m *MailLogger) Errorf(format string, v ...interface{}) { + m.logger.Errorf(format, v...) +} + +func (m *MailLogger) Warnf(format string, v ...interface{}) { + m.logger.Warningf(format, v...) +} + +func (m *MailLogger) Infof(format string, v ...interface{}) { + m.logger.Infof(format, v...) +} + +func (m *MailLogger) Debugf(format string, v ...interface{}) { + m.logger.Debugf(format, v...) +} diff --git a/pkg/mail/mail.go b/pkg/mail/mail.go index 4ac2c5ae0..1d4329eff 100644 --- a/pkg/mail/mail.go +++ b/pkg/mail/mail.go @@ -56,6 +56,8 @@ func getClient() (*mail.Client, error) { ServerName: config.MailerHost.GetString(), }), mail.WithTimeout((config.MailerQueueTimeout.GetDuration() + 3) * time.Second), // 3s more for us to close before mail server timeout + mail.WithLogger(log.NewMailLogger()), + mail.WithDebugLog(), } if config.MailerForceSSL.GetBool() {