hid: port logging facilities
Though the regular mode now has timestamps and a new mode for systemd has been added.
This commit is contained in:
		
							
								
								
									
										99
									
								
								hid/main.go
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								hid/main.go
									
									
									
									
									
								
							@@ -28,6 +28,7 @@ import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
	"log/syslog"
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/signal"
 | 
			
		||||
@@ -48,6 +49,100 @@ const (
 | 
			
		||||
	projectVersion = "0"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// --- Logging -----------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
type logPrio int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	prioFatal logPrio = iota
 | 
			
		||||
	prioError
 | 
			
		||||
	prioWarning
 | 
			
		||||
	prioStatus
 | 
			
		||||
	prioDebug
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (lp logPrio) prefix() string {
 | 
			
		||||
	switch lp {
 | 
			
		||||
	case prioFatal:
 | 
			
		||||
		return "fatal: "
 | 
			
		||||
	case prioError:
 | 
			
		||||
		return "error: "
 | 
			
		||||
	case prioWarning:
 | 
			
		||||
		return "warning: "
 | 
			
		||||
	case prioStatus:
 | 
			
		||||
		return ""
 | 
			
		||||
	case prioDebug:
 | 
			
		||||
		return "debug: "
 | 
			
		||||
	default:
 | 
			
		||||
		panic("unhandled log priority")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lp logPrio) syslogPrio() syslog.Priority {
 | 
			
		||||
	switch lp {
 | 
			
		||||
	case prioFatal:
 | 
			
		||||
		return syslog.LOG_ERR
 | 
			
		||||
	case prioError:
 | 
			
		||||
		return syslog.LOG_ERR
 | 
			
		||||
	case prioWarning:
 | 
			
		||||
		return syslog.LOG_WARNING
 | 
			
		||||
	case prioStatus:
 | 
			
		||||
		return syslog.LOG_INFO
 | 
			
		||||
	case prioDebug:
 | 
			
		||||
		return syslog.LOG_DEBUG
 | 
			
		||||
	default:
 | 
			
		||||
		panic("unhandled log priority")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | 
			
		||||
 | 
			
		||||
func logMessageStdio(prio logPrio, format string, args ...interface{}) {
 | 
			
		||||
	// TODO: isatty-enabled colors based on prio.
 | 
			
		||||
	os.Stderr.WriteString(time.Now().Format("2006-01-02 15:04:05 ") +
 | 
			
		||||
		prio.prefix() + fmt.Sprintf(format, args...) + "\n")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func logMessageSystemd(prio logPrio, format string, args ...interface{}) {
 | 
			
		||||
	if prio == prioFatal {
 | 
			
		||||
		// There is no corresponding syslog severity.
 | 
			
		||||
		format = "fatal: " + format
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "<%d>%s\n",
 | 
			
		||||
		prio.syslogPrio(), fmt.Sprintf(format, args...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | 
			
		||||
 | 
			
		||||
var logMessage = logMessageStdio
 | 
			
		||||
 | 
			
		||||
func printDebug(format string, args ...interface{}) {
 | 
			
		||||
	if debugMode {
 | 
			
		||||
		logMessage(prioDebug, format, args...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func printStatus(format string, args ...interface{}) {
 | 
			
		||||
	logMessage(prioStatus, format, args...)
 | 
			
		||||
}
 | 
			
		||||
func printWarning(format string, args ...interface{}) {
 | 
			
		||||
	logMessage(prioWarning, format, args...)
 | 
			
		||||
}
 | 
			
		||||
func printError(format string, args ...interface{}) {
 | 
			
		||||
	logMessage(prioError, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// "fatal" is reserved for failures that would harm further operation.
 | 
			
		||||
 | 
			
		||||
func printFatal(format string, args ...interface{}) {
 | 
			
		||||
	logMessage(prioFatal, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func exitFatal(format string, args ...interface{}) {
 | 
			
		||||
	printFatal(format, args...)
 | 
			
		||||
	os.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// --- Utilities ---------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Split a string by a set of UTF-8 delimiters, optionally ignoring empty items.
 | 
			
		||||
@@ -3316,6 +3411,7 @@ func main() {
 | 
			
		||||
	version := flag.Bool("version", false, "show version and exit")
 | 
			
		||||
	writeDefaultCfg := flag.Bool("writedefaultcfg", false,
 | 
			
		||||
		"write a default configuration file and exit")
 | 
			
		||||
	systemd := flag.Bool("systemd", false, "log in systemd format")
 | 
			
		||||
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
@@ -3327,6 +3423,9 @@ func main() {
 | 
			
		||||
		callSimpleConfigWriteDefault("", configTable)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if *systemd {
 | 
			
		||||
		logMessage = logMessageSystemd
 | 
			
		||||
	}
 | 
			
		||||
	if flag.NArg() > 0 {
 | 
			
		||||
		flag.Usage()
 | 
			
		||||
		os.Exit(2)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user