summaryrefslogtreecommitdiff
path: root/internal/log/log.go
diff options
context:
space:
mode:
authorLibravatar kim <grufwub@gmail.com>2025-09-07 14:47:45 +0200
committerLibravatar kim <gruf@noreply.codeberg.org>2025-09-07 14:47:45 +0200
commit19784e381bfe6e0aa44cd03928e0ce74edda14eb (patch)
tree8d63774bb09ee3be26f68766a02d97d4c21be6e4 /internal/log/log.go
parent[bugfix] fix lo paging value not always being set (#4407) (diff)
downloadgotosocial-19784e381bfe6e0aa44cd03928e0ce74edda14eb.tar.xz
[performance] more logging tweaks (#4415)
- reduces number of necessary function calls by moving log level checking out of the uninlineable `logf(...)` function and into each of its caller (which are all inlined). this in turn means the log level check is performed in-situ wherever a call to `log.Debug(...)` (etc) is made, reduce unnecessary calls when a certain log level is disabled. - sets the http.Server{}.ErrorLog to output to our internal logging package (which in turn ensures it gets wrapped in either our logfmt or json log formatting) Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4415 Co-authored-by: kim <grufwub@gmail.com> Co-committed-by: kim <grufwub@gmail.com>
Diffstat (limited to 'internal/log/log.go')
-rw-r--r--internal/log/log.go89
1 files changed, 84 insertions, 5 deletions
diff --git a/internal/log/log.go b/internal/log/log.go
index 50236db6e..8be846945 100644
--- a/internal/log/log.go
+++ b/internal/log/log.go
@@ -112,101 +112,161 @@ func WithFields(fields ...kv.Field) Entry {
// Trace will log formatted args as 'msg' field to the log at TRACE level.
func Trace(ctx context.Context, a ...interface{}) {
+ if TRACE > loglvl {
+ return
+ }
logf(ctx, TRACE, nil, "", a...)
}
// Tracef will log format string as 'msg' field to the log at TRACE level.
func Tracef(ctx context.Context, s string, a ...interface{}) {
+ if TRACE > loglvl {
+ return
+ }
logf(ctx, TRACE, nil, s, a...)
}
// TraceKV will log the one key-value field to the log at TRACE level.
func TraceKV(ctx context.Context, key string, value interface{}) {
+ if TRACE > loglvl {
+ return
+ }
logf(ctx, TRACE, []kv.Field{{K: key, V: value}}, "")
}
// TraceKVs will log key-value fields to the log at TRACE level.
func TraceKVs(ctx context.Context, kvs ...kv.Field) {
+ if TRACE > loglvl {
+ return
+ }
logf(ctx, TRACE, kvs, "")
}
// Debug will log formatted args as 'msg' field to the log at DEBUG level.
func Debug(ctx context.Context, a ...interface{}) {
+ if DEBUG > loglvl {
+ return
+ }
logf(ctx, DEBUG, nil, "", a...)
}
// Debugf will log format string as 'msg' field to the log at DEBUG level.
func Debugf(ctx context.Context, s string, a ...interface{}) {
+ if DEBUG > loglvl {
+ return
+ }
logf(ctx, DEBUG, nil, s, a...)
}
// DebugKV will log the one key-value field to the log at DEBUG level.
func DebugKV(ctx context.Context, key string, value interface{}) {
+ if DEBUG > loglvl {
+ return
+ }
logf(ctx, DEBUG, []kv.Field{{K: key, V: value}}, "")
}
// DebugKVs will log key-value fields to the log at DEBUG level.
func DebugKVs(ctx context.Context, kvs ...kv.Field) {
+ if DEBUG > loglvl {
+ return
+ }
logf(ctx, DEBUG, kvs, "")
}
// Info will log formatted args as 'msg' field to the log at INFO level.
func Info(ctx context.Context, a ...interface{}) {
+ if INFO > loglvl {
+ return
+ }
logf(ctx, INFO, nil, "", a...)
}
// Infof will log format string as 'msg' field to the log at INFO level.
func Infof(ctx context.Context, s string, a ...interface{}) {
+ if INFO > loglvl {
+ return
+ }
logf(ctx, INFO, nil, s, a...)
}
// InfoKV will log the one key-value field to the log at INFO level.
func InfoKV(ctx context.Context, key string, value interface{}) {
+ if INFO > loglvl {
+ return
+ }
logf(ctx, INFO, []kv.Field{{K: key, V: value}}, "")
}
// InfoKVs will log key-value fields to the log at INFO level.
func InfoKVs(ctx context.Context, kvs ...kv.Field) {
+ if INFO > loglvl {
+ return
+ }
logf(ctx, INFO, kvs, "")
}
// Warn will log formatted args as 'msg' field to the log at WARN level.
func Warn(ctx context.Context, a ...interface{}) {
+ if WARN > loglvl {
+ return
+ }
logf(ctx, WARN, nil, "", a...)
}
// Warnf will log format string as 'msg' field to the log at WARN level.
func Warnf(ctx context.Context, s string, a ...interface{}) {
+ if WARN > loglvl {
+ return
+ }
logf(ctx, WARN, nil, s, a...)
}
// WarnKV will log the one key-value field to the log at WARN level.
func WarnKV(ctx context.Context, key string, value interface{}) {
+ if WARN > loglvl {
+ return
+ }
logf(ctx, WARN, []kv.Field{{K: key, V: value}}, "")
}
// WarnKVs will log key-value fields to the log at WARN level.
func WarnKVs(ctx context.Context, kvs ...kv.Field) {
+ if WARN > loglvl {
+ return
+ }
logf(ctx, WARN, kvs, "")
}
// Error will log formatted args as 'msg' field to the log at ERROR level.
func Error(ctx context.Context, a ...interface{}) {
+ if ERROR > loglvl {
+ return
+ }
logf(ctx, ERROR, nil, "", a...)
}
// Errorf will log format string as 'msg' field to the log at ERROR level.
func Errorf(ctx context.Context, s string, a ...interface{}) {
+ if ERROR > loglvl {
+ return
+ }
logf(ctx, ERROR, nil, s, a...)
}
// ErrorKV will log the one key-value field to the log at ERROR level.
func ErrorKV(ctx context.Context, key string, value interface{}) {
+ if ERROR > loglvl {
+ return
+ }
logf(ctx, ERROR, []kv.Field{{K: key, V: value}}, "")
}
// ErrorKVs will log key-value fields to the log at ERROR level.
func ErrorKVs(ctx context.Context, kvs ...kv.Field) {
+ if ERROR > loglvl {
+ return
+ }
logf(ctx, ERROR, kvs, "")
}
@@ -214,6 +274,9 @@ func ErrorKVs(ctx context.Context, kvs ...kv.Field) {
// This will then call panic causing the application to crash.
func Panic(ctx context.Context, a ...interface{}) {
defer panic(fmt.Sprint(a...))
+ if PANIC > loglvl {
+ return
+ }
logf(ctx, PANIC, nil, "", a...)
}
@@ -221,6 +284,9 @@ func Panic(ctx context.Context, a ...interface{}) {
// This will then call panic causing the application to crash.
func Panicf(ctx context.Context, s string, a ...interface{}) {
defer panic(fmt.Sprintf(s, a...))
+ if PANIC > loglvl {
+ return
+ }
logf(ctx, PANIC, nil, s, a...)
}
@@ -228,6 +294,9 @@ func Panicf(ctx context.Context, s string, a ...interface{}) {
// This will then call panic causing the application to crash.
func PanicKV(ctx context.Context, key string, value interface{}) {
defer panic(kv.Field{K: key, V: value}.String())
+ if PANIC > loglvl {
+ return
+ }
logf(ctx, PANIC, []kv.Field{{K: key, V: value}}, "")
}
@@ -235,26 +304,41 @@ func PanicKV(ctx context.Context, key string, value interface{}) {
// This will then call panic causing the application to crash.
func PanicKVs(ctx context.Context, kvs ...kv.Field) {
defer panic(kv.Fields(kvs).String())
+ if PANIC > loglvl {
+ return
+ }
logf(ctx, PANIC, kvs, "")
}
// Log will log formatted args as 'msg' field to the log at given level.
func Log(ctx context.Context, lvl LEVEL, a ...interface{}) { //nolint:revive
+ if lvl > loglvl {
+ return
+ }
logf(ctx, lvl, nil, "", a...)
}
// Logf will log format string as 'msg' field to the log at given level.
func Logf(ctx context.Context, lvl LEVEL, s string, a ...interface{}) { //nolint:revive
+ if lvl > loglvl {
+ return
+ }
logf(ctx, lvl, nil, s, a...)
}
// LogKV will log the one key-value field to the log at given level.
func LogKV(ctx context.Context, lvl LEVEL, key string, value interface{}) { //nolint:revive
+ if lvl > loglvl {
+ return
+ }
logf(ctx, lvl, []kv.Field{{K: key, V: value}}, "")
}
// LogKVs will log key-value fields to the log at given level.
func LogKVs(ctx context.Context, lvl LEVEL, kvs ...kv.Field) { //nolint:revive
+ if lvl > loglvl {
+ return
+ }
logf(ctx, lvl, kvs, "")
}
@@ -272,11 +356,6 @@ func Printf(s string, a ...interface{}) {
func logf(ctx context.Context, lvl LEVEL, fields []kv.Field, msg string, args ...interface{}) {
var out *os.File
- // Check if enabled.
- if lvl > loglvl {
- return
- }
-
// Split errors to stderr,
// all else goes to stdout.
if lvl <= ERROR {