From: "J.R. Oldroyd" <wgrd@opal.com>
To: WireGuard mailing list <wireguard@lists.zx2c4.com>
Cc: "J.R. Oldroyd" <wgrd@opal.com>
Subject: [PATCH 1/1] Add support for logging to syslog(3) on operating systems that support it (i.e., non-Windows, non-Plan9).
Date: Tue, 17 Mar 2020 11:09:57 +0100 [thread overview]
Message-ID: <20200317100956.73928-2-wgrd@opal.com> (raw)
In-Reply-To: <CAHmME9onNwD9+hw2LgzZg_OqN21mOPEyQ9wAsFGjTA6=mK7xgA@mail.gmail.com>
Signed-off-by: J.R. Oldroyd <wgrd@opal.com>
---
device/logger.go | 45 ++++++----------
device/logger_syslog.go | 112 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 129 insertions(+), 28 deletions(-)
create mode 100644 device/logger_syslog.go
diff --git a/device/logger.go b/device/logger.go
index 7c8b704..8095b3d 100644
--- a/device/logger.go
+++ b/device/logger.go
@@ -1,3 +1,5 @@
+// +build windows,plan9
+
/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2017-2019 WireGuard LLC. All Rights Reserved.
@@ -6,7 +8,6 @@
package device
import (
- "io"
"io/ioutil"
"log"
"os"
@@ -26,34 +27,22 @@ type Logger struct {
}
func NewLogger(level int, prepend string) *Logger {
- output := os.Stdout
logger := new(Logger)
- logErr, logInfo, logDebug := func() (io.Writer, io.Writer, io.Writer) {
- if level >= LogLevelDebug {
- return output, output, output
- }
- if level >= LogLevelInfo {
- return output, output, ioutil.Discard
- }
- if level >= LogLevelError {
- return output, ioutil.Discard, ioutil.Discard
- }
- return ioutil.Discard, ioutil.Discard, ioutil.Discard
- }()
-
- logger.Debug = log.New(logDebug,
- "DEBUG: "+prepend,
- log.Ldate|log.Ltime,
- )
-
- logger.Info = log.New(logInfo,
- "INFO: "+prepend,
- log.Ldate|log.Ltime,
- )
- logger.Error = log.New(logErr,
- "ERROR: "+prepend,
- log.Ldate|log.Ltime,
- )
+ nullLog := log.New(ioutil.Discard, "", 0)
+ logger.Debug = nullLog
+ logger.Info = nullLog
+ logger.Error = nullLog
+
+ if level >= LogLevelDebug {
+ logger.Debug = log.New(os.Stdout, "DEBUG: "+prepend, log.Ldate|log.Ltime)
+ }
+ if level >= LogLevelInfo {
+ logger.Info = log.New(os.Stdout, "INFO: "+prepend, log.Ldate|log.Ltime)
+ }
+ if level >= LogLevelError {
+ logger.Error = log.New(os.Stdout, "ERROR: "+prepend, log.Ldate|log.Ltime)
+ }
+
return logger
}
diff --git a/device/logger_syslog.go b/device/logger_syslog.go
new file mode 100644
index 0000000..1271155
--- /dev/null
+++ b/device/logger_syslog.go
@@ -0,0 +1,112 @@
+// +build !windows,!plan9
+
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2017-2019 WireGuard LLC. All Rights Reserved.
+ */
+
+package device
+
+import (
+ "io/ioutil"
+ "log"
+ "log/syslog"
+ "os"
+ "strings"
+)
+
+const (
+ LogLevelSilent = iota
+ LogLevelError
+ LogLevelInfo
+ LogLevelDebug
+)
+
+type Logger struct {
+ Debug *log.Logger
+ Info *log.Logger
+ Error *log.Logger
+}
+
+func NewLogger(level int, prepend string) *Logger {
+ logger := new(Logger)
+
+ nullLog := log.New(ioutil.Discard, "", 0)
+ logger.Debug = nullLog
+ logger.Info = nullLog
+ logger.Error = nullLog
+
+ logdest := os.Getenv("WG_LOG_DEST")
+
+ logfacility := syslog.LOG_DAEMON
+ if logdest == "syslog" {
+ facility := os.Getenv("WG_LOG_FACILITY")
+ facility = strings.ToLower(facility)
+ facility = strings.TrimPrefix(facility, "log_")
+ // the commented-out ones exist on BSD but not in Go
+ switch facility {
+ case "auth": logfacility = syslog.LOG_AUTH
+ case "authpriv": logfacility = syslog.LOG_AUTHPRIV
+ //case "console": logfacility = syslog.LOG_CONSOLE
+ case "cron": logfacility = syslog.LOG_CRON
+ case "daemon": logfacility = syslog.LOG_DAEMON
+ case "ftp": logfacility = syslog.LOG_FTP
+ case "kern": logfacility = syslog.LOG_KERN
+ case "local0": logfacility = syslog.LOG_LOCAL0
+ case "local1": logfacility = syslog.LOG_LOCAL1
+ case "local2": logfacility = syslog.LOG_LOCAL2
+ case "local3": logfacility = syslog.LOG_LOCAL3
+ case "local4": logfacility = syslog.LOG_LOCAL4
+ case "local5": logfacility = syslog.LOG_LOCAL5
+ case "local6": logfacility = syslog.LOG_LOCAL6
+ case "local7": logfacility = syslog.LOG_LOCAL7
+ case "lpr": logfacility = syslog.LOG_LPR
+ case "mail": logfacility = syslog.LOG_MAIL
+ //case "ntp": logfacility = syslog.LOG_NTP
+ case "news": logfacility = syslog.LOG_NEWS
+ //case "security": logfacility = syslog.LOG_SECURITY
+ case "syslog": logfacility = syslog.LOG_SYSLOG
+ case "user": logfacility = syslog.LOG_USER
+ case "uucp": logfacility = syslog.LOG_UUCP
+ }
+ }
+
+ if level >= LogLevelDebug {
+ if logdest == "syslog" {
+ sysLog, err := syslog.NewLogger(logfacility | syslog.LOG_DEBUG, 0)
+ if err == nil {
+ logger.Debug = sysLog
+ } else {
+ logger.Debug = log.New(os.Stdout, "DEBUG: "+prepend, log.Ldate|log.Ltime)
+ }
+ } else {
+ logger.Debug = log.New(os.Stdout, "DEBUG: "+prepend, log.Ldate|log.Ltime)
+ }
+ }
+ if level >= LogLevelInfo {
+ if logdest == "syslog" {
+ sysLog, err := syslog.NewLogger(logfacility | syslog.LOG_INFO, 0)
+ if err == nil {
+ logger.Info = sysLog
+ } else {
+ logger.Info = log.New(os.Stdout, "INFO: "+prepend, log.Ldate|log.Ltime)
+ }
+ } else {
+ logger.Info = log.New(os.Stdout, "INFO: "+prepend, log.Ldate|log.Ltime)
+ }
+ }
+ if level >= LogLevelError {
+ if logdest == "syslog" {
+ sysLog, err := syslog.NewLogger(logfacility | syslog.LOG_ERR, 0)
+ if err == nil {
+ logger.Error = sysLog
+ } else {
+ logger.Error = log.New(os.Stdout, "ERROR: "+prepend, log.Ldate|log.Ltime)
+ }
+ } else {
+ logger.Error = log.New(os.Stdout, "ERROR: "+prepend, log.Ldate|log.Ltime)
+ }
+ }
+
+ return logger
+}
--
2.24.0
prev parent reply other threads:[~2020-03-17 17:23 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-15 13:16 Logging J.R. Oldroyd
2020-03-16 11:25 ` Logging Arti Zirk
2020-03-16 19:30 ` Logging Jason A. Donenfeld
2020-03-17 7:37 ` Logging J.R. Oldroyd
2020-03-17 18:12 ` Logging Luis Ressel
2020-03-18 8:14 ` Logging J.R. Oldroyd
2020-03-18 10:43 ` Logging Luis Ressel
2020-03-17 10:09 ` [PATCH 0/1] Logging J.R. Oldroyd
2020-03-17 10:09 ` J.R. Oldroyd [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200317100956.73928-2-wgrd@opal.com \
--to=wgrd@opal.com \
--cc=wireguard@lists.zx2c4.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).