aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorAndrew Morgan <1342360+anoadragon453@users.noreply.github.com>2019-07-24 05:44:05 +0100
committerAlex Chen <Cnly@users.noreply.github.com>2019-07-24 12:44:05 +0800
commit4410acc673b27e747e8ba757e9b271ada55c0269 (patch)
tree046640558f3b0cb9f00501049ec76aa008e2b28a /common
parent78032b3f4c0ca2d272180afb09142fce82313109 (diff)
Add filepath and function name to log output (#755)
Adds detailed logging, describing which file/line a log message came from, as well as the name of the function that it was contained within.
Diffstat (limited to 'common')
-rw-r--r--common/log.go28
1 files changed, 26 insertions, 2 deletions
diff --git a/common/log.go b/common/log.go
index 89a70582..f9ed84ed 100644
--- a/common/log.go
+++ b/common/log.go
@@ -15,9 +15,12 @@
package common
import (
+ "fmt"
"os"
"path"
"path/filepath"
+ "runtime"
+ "strings"
"github.com/matrix-org/dendrite/common/config"
"github.com/matrix-org/dugong"
@@ -54,15 +57,35 @@ func (h *logLevelHook) Levels() []logrus.Level {
return levels
}
+// callerPrettyfier is a function that given a runtime.Frame object, will
+// extract the calling function's name and file, and return them in a nicely
+// formatted way
+func callerPrettyfier(f *runtime.Frame) (string, string) {
+ // Retrieve just the function name
+ s := strings.Split(f.Function, ".")
+ funcname := s[len(s)-1]
+
+ // Append a newline + tab to it to move the actual log content to its own line
+ funcname += "\n\t"
+
+ // Surround the filepath in brackets and append line number so IDEs can quickly
+ // navigate
+ filename := fmt.Sprintf(" [%s:%d]", f.File, f.Line)
+
+ return funcname, filename
+}
+
// SetupStdLogging configures the logging format to standard output. Typically, it is called when the config is not yet loaded.
func SetupStdLogging() {
+ logrus.SetReportCaller(true)
logrus.SetFormatter(&utcFormatter{
&logrus.TextFormatter{
TimestampFormat: "2006-01-02T15:04:05.000000000Z07:00",
FullTimestamp: true,
DisableColors: false,
DisableTimestamp: false,
- DisableSorting: false,
+ QuoteEmptyFields: true,
+ CallerPrettyfier: callerPrettyfier,
},
})
}
@@ -71,8 +94,8 @@ func SetupStdLogging() {
// If something fails here it means that the logging was improperly configured,
// so we just exit with the error
func SetupHookLogging(hooks []config.LogrusHook, componentName string) {
+ logrus.SetReportCaller(true)
for _, hook := range hooks {
-
// Check we received a proper logging level
level, err := logrus.ParseLevel(hook.Level)
if err != nil {
@@ -126,6 +149,7 @@ func setupFileHook(hook config.LogrusHook, level logrus.Level, componentName str
DisableColors: true,
DisableTimestamp: false,
DisableSorting: false,
+ QuoteEmptyFields: true,
},
},
&dugong.DailyRotationSchedule{GZip: true},