mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
* add FN_LOG_DEST for logs, fixup init * FN_LOG_DEST can point to a remote logging place (papertrail, whatever) * FN_LOG_PREFIX can add a prefix onto each log line sent to FN_LOG_DEST default remains stderr with no prefix. users need this to send to various logging backends, though it could be done operationally, this is somewhat simpler. we were doing some configuration stuff inside of init() for some of the global things. even though they're global, it's nice to keep them all in the normal server init path. we have had strange issues with the tracing setup, I tested the last repro of this repeatedly and didn't have any luck reproducing it, though maybe it comes back. * add docs
77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
package common
|
|
|
|
import (
|
|
"net/url"
|
|
"os"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func SetLogLevel(ll string) {
|
|
if ll == "" {
|
|
ll = "info"
|
|
}
|
|
logrus.WithFields(logrus.Fields{"level": ll}).Info("Setting log level to")
|
|
logLevel, err := logrus.ParseLevel(ll)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{"level": ll}).Warn("Could not parse log level, setting to INFO")
|
|
logLevel = logrus.InfoLevel
|
|
}
|
|
logrus.SetLevel(logLevel)
|
|
|
|
// this effectively just adds more gin log goodies
|
|
gin.SetMode(gin.ReleaseMode)
|
|
if logLevel == logrus.DebugLevel {
|
|
gin.SetMode(gin.DebugMode)
|
|
}
|
|
}
|
|
|
|
func SetLogDest(to, prefix string) {
|
|
logrus.SetOutput(os.Stderr) // in case logrus changes their mind...
|
|
if to == "stderr" {
|
|
return
|
|
}
|
|
|
|
// possible schemes: { udp, tcp, file }
|
|
// file url must contain only a path, syslog must contain only a host[:port]
|
|
// expect: [scheme://][host][:port][/path]
|
|
// default scheme to udp:// if none given
|
|
|
|
url, err := url.Parse(to)
|
|
if url.Host == "" && url.Path == "" {
|
|
logrus.WithFields(logrus.Fields{"to": to}).Warn("No scheme on logging url, adding udp://")
|
|
// this happens when no scheme like udp:// is present
|
|
to = "udp://" + to
|
|
url, err = url.Parse(to)
|
|
}
|
|
if err != nil {
|
|
logrus.WithError(err).WithFields(logrus.Fields{"to": to}).Error("could not parse logging URI, defaulting to stderr")
|
|
return
|
|
}
|
|
|
|
// File URL must contain only `url.Path`. Syslog location must contain only `url.Host`
|
|
if (url.Host == "" && url.Path == "") || (url.Host != "" && url.Path != "") {
|
|
logrus.WithFields(logrus.Fields{"to": to, "uri": url}).Error("invalid logging location, defaulting to stderr")
|
|
return
|
|
}
|
|
|
|
switch url.Scheme {
|
|
case "udp", "tcp":
|
|
err = NewSyslogHook(url, prefix)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{"uri": url, "to": to}).WithError(err).Error("unable to connect to syslog, defaulting to stderr")
|
|
return
|
|
}
|
|
case "file":
|
|
f, err := os.OpenFile(url.Path, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
|
|
if err != nil {
|
|
logrus.WithError(err).WithFields(logrus.Fields{"to": to, "path": url.Path}).Error("cannot open file, defaulting to stderr")
|
|
return
|
|
}
|
|
logrus.SetOutput(f)
|
|
default:
|
|
logrus.WithFields(logrus.Fields{"scheme": url.Scheme, "to": to}).Error("unknown logging location scheme, defaulting to stderr")
|
|
}
|
|
}
|