Development discussion of WireGuard
 help / color / mirror / Atom feed
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


      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).