| 
									
										
										
										
											2023-03-12 16:00:57 +01:00
										 |  |  | // GoToSocial | 
					
						
							|  |  |  | // Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | // SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | // GNU Affero General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  | // along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2021-03-03 18:12:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | package log | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2021-12-12 18:00:20 +01:00
										 |  |  | 	"log/syslog" | 
					
						
							| 
									
										
										
										
											2022-05-07 16:46:59 +01:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	"strings" | 
					
						
							|  |  |  | 	"syscall" | 
					
						
							|  |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2021-12-12 18:00:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	"codeberg.org/gruf/go-kv" | 
					
						
							|  |  |  | 	"codeberg.org/gruf/go-logger/v2/level" | 
					
						
							| 
									
										
										
										
											2021-03-03 18:12:02 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | var ( | 
					
						
							|  |  |  | 	// loglvl is the currently set logging level. | 
					
						
							| 
									
										
										
										
											2023-08-21 20:07:55 +02:00
										 |  |  | 	loglvl level.LEVEL | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// lvlstrs is the lookup table of log levels to strings. | 
					
						
							|  |  |  | 	lvlstrs = level.Default() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 	// syslog output, only set if enabled. | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	sysout *syslog.Writer | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:07:55 +02:00
										 |  |  | 	// timefmt is the logging time format used, which includes | 
					
						
							|  |  |  | 	// the full field and required quoting | 
					
						
							|  |  |  | 	timefmt = `timestamp="02/01/2006 15:04:05.000" ` | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// ctxhooks allows modifying log content based on context. | 
					
						
							|  |  |  | 	ctxhooks []func(context.Context, []kv.Field) []kv.Field | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | // Hook adds the given hook to the global logger context hooks stack. | 
					
						
							|  |  |  | func Hook(hook func(ctx context.Context, kvs []kv.Field) []kv.Field) { | 
					
						
							|  |  |  | 	ctxhooks = append(ctxhooks, hook) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | // Level returns the currently set log level. | 
					
						
							|  |  |  | func Level() level.LEVEL { | 
					
						
							| 
									
										
										
										
											2023-08-21 20:07:55 +02:00
										 |  |  | 	return loglvl | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetLevel sets the max logging level. | 
					
						
							|  |  |  | func SetLevel(lvl level.LEVEL) { | 
					
						
							| 
									
										
										
										
											2023-08-21 20:07:55 +02:00
										 |  |  | 	loglvl = lvl | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // TimeFormat returns the currently-set timestamp format. | 
					
						
							|  |  |  | func TimeFormat() string { | 
					
						
							|  |  |  | 	return timefmt | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetTimeFormat sets the timestamp format to the given string. | 
					
						
							|  |  |  | func SetTimeFormat(format string) { | 
					
						
							|  |  |  | 	if format == "" { | 
					
						
							|  |  |  | 		timefmt = format | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	timefmt = `timestamp="` + format + `" ` | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | // New starts a new log entry. | 
					
						
							|  |  |  | func New() Entry { | 
					
						
							|  |  |  | 	return Entry{} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func WithContext(ctx context.Context) Entry { | 
					
						
							|  |  |  | 	return Entry{ctx: ctx} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | func WithField(key string, value interface{}) Entry { | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 	return New().WithField(key, value) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func WithFields(fields ...kv.Field) Entry { | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 	return New().WithFields(fields...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Trace(ctx context.Context, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.TRACE, nil, args(len(a)), a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Tracef(ctx context.Context, s string, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.TRACE, nil, s, a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Debug(ctx context.Context, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.DEBUG, nil, args(len(a)), a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Debugf(ctx context.Context, s string, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.DEBUG, nil, s, a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Info(ctx context.Context, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.INFO, nil, args(len(a)), a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Infof(ctx context.Context, s string, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.INFO, nil, s, a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Warn(ctx context.Context, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.WARN, nil, args(len(a)), a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Warnf(ctx context.Context, s string, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.WARN, nil, s, a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Error(ctx context.Context, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.ERROR, nil, args(len(a)), a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Errorf(ctx context.Context, s string, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, level.ERROR, nil, s, a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Fatal(ctx context.Context, a ...interface{}) { | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	defer syscall.Exit(1) | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 	logf(ctx, 3, level.FATAL, nil, args(len(a)), a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Fatalf(ctx context.Context, s string, a ...interface{}) { | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	defer syscall.Exit(1) | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 	logf(ctx, 3, level.FATAL, nil, s, a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Panic(ctx context.Context, a ...interface{}) { | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	defer panic(fmt.Sprint(a...)) | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 	logf(ctx, 3, level.PANIC, nil, args(len(a)), a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Panicf(ctx context.Context, s string, a ...interface{}) { | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	defer panic(fmt.Sprintf(s, a...)) | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 	logf(ctx, 3, level.PANIC, nil, s, a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Log will log formatted args as 'msg' field to the log at given level. | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Log(ctx context.Context, lvl level.LEVEL, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, lvl, nil, args(len(a)), a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Logf will log format string as 'msg' field to the log at given level. | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func Logf(ctx context.Context, lvl level.LEVEL, s string, a ...interface{}) { | 
					
						
							|  |  |  | 	logf(ctx, 3, lvl, nil, s, a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Print will log formatted args to the stdout log output. | 
					
						
							|  |  |  | func Print(a ...interface{}) { | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	printf(3, nil, args(len(a)), a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Print will log format string to the stdout log output. | 
					
						
							|  |  |  | func Printf(s string, a ...interface{}) { | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	printf(3, nil, s, a...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | func printf(depth int, fields []kv.Field, s string, a ...interface{}) { | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	// Acquire buffer | 
					
						
							|  |  |  | 	buf := getBuf() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:07:55 +02:00
										 |  |  | 	// Append formatted timestamp according to `timefmt` | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	buf.B = time.Now().AppendFormat(buf.B, timefmt) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Append formatted caller func | 
					
						
							|  |  |  | 	buf.B = append(buf.B, `func=`...) | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	buf.B = append(buf.B, Caller(depth+1)...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	buf.B = append(buf.B, ' ') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if len(fields) > 0 { | 
					
						
							|  |  |  | 		// Append formatted fields | 
					
						
							|  |  |  | 		kv.Fields(fields).AppendFormat(buf, false) | 
					
						
							|  |  |  | 		buf.B = append(buf.B, ' ') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Append formatted args | 
					
						
							|  |  |  | 	fmt.Fprintf(buf, s, a...) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	if buf.B[len(buf.B)-1] != '\n' { | 
					
						
							|  |  |  | 		// Append a final newline | 
					
						
							|  |  |  | 		buf.B = append(buf.B, '\n') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if sysout != nil { | 
					
						
							|  |  |  | 		// Write log entry to syslog | 
					
						
							|  |  |  | 		logsys(level.INFO, buf.String()) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Write to log and release | 
					
						
							| 
									
										
										
										
											2022-11-20 16:40:15 +00:00
										 |  |  | 	_, _ = os.Stdout.Write(buf.B) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	putBuf(buf) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | func logf(ctx context.Context, depth int, lvl level.LEVEL, fields []kv.Field, s string, a ...interface{}) { | 
					
						
							| 
									
										
										
										
											2022-11-20 16:40:15 +00:00
										 |  |  | 	var out *os.File | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Check if enabled. | 
					
						
							|  |  |  | 	if lvl > Level() { | 
					
						
							|  |  |  | 		return | 
					
						
							| 
									
										
										
										
											2021-12-12 18:00:20 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	// Split errors to stderr, | 
					
						
							|  |  |  | 	// all else goes to stdout. | 
					
						
							|  |  |  | 	if lvl <= level.ERROR { | 
					
						
							| 
									
										
										
										
											2022-11-20 16:40:15 +00:00
										 |  |  | 		out = os.Stderr | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2022-11-20 16:40:15 +00:00
										 |  |  | 		out = os.Stdout | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Acquire buffer | 
					
						
							|  |  |  | 	buf := getBuf() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:07:55 +02:00
										 |  |  | 	// Append formatted timestamp according to `timefmt` | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	buf.B = time.Now().AppendFormat(buf.B, timefmt) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Append formatted caller func | 
					
						
							|  |  |  | 	buf.B = append(buf.B, `func=`...) | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	buf.B = append(buf.B, Caller(depth+1)...) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	buf.B = append(buf.B, ' ') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Append formatted level string | 
					
						
							|  |  |  | 	buf.B = append(buf.B, `level=`...) | 
					
						
							|  |  |  | 	buf.B = append(buf.B, lvlstrs[lvl]...) | 
					
						
							|  |  |  | 	buf.B = append(buf.B, ' ') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-17 12:02:29 +01:00
										 |  |  | 	if ctx != nil { | 
					
						
							|  |  |  | 		// Pass context through hooks. | 
					
						
							|  |  |  | 		for _, hook := range ctxhooks { | 
					
						
							|  |  |  | 			fields = hook(ctx, fields) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	// Append formatted fields with msg | 
					
						
							|  |  |  | 	kv.Fields(append(fields, kv.Field{ | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 		K: "msg", V: fmt.Sprintf(s, a...), | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	})).AppendFormat(buf, false) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	if buf.B[len(buf.B)-1] != '\n' { | 
					
						
							|  |  |  | 		// Append a final newline | 
					
						
							|  |  |  | 		buf.B = append(buf.B, '\n') | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if sysout != nil { | 
					
						
							|  |  |  | 		// Write log entry to syslog | 
					
						
							|  |  |  | 		logsys(lvl, buf.String()) | 
					
						
							| 
									
										
										
										
											2021-12-12 18:00:20 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	// Write to log and release | 
					
						
							|  |  |  | 	_, _ = out.Write(buf.B) | 
					
						
							|  |  |  | 	putBuf(buf) | 
					
						
							| 
									
										
										
										
											2021-03-03 18:12:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | // logsys will log given msg at given severity to the syslog. | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | // Max length: https://www.rfc-editor.org/rfc/rfc5424.html#section-6.1 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | func logsys(lvl level.LEVEL, msg string) { | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	if max := 2048; len(msg) > max { | 
					
						
							|  |  |  | 		// Truncate up to max | 
					
						
							|  |  |  | 		msg = msg[:max] | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	switch lvl { | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	case level.TRACE, level.DEBUG: | 
					
						
							|  |  |  | 		_ = sysout.Debug(msg) | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	case level.INFO: | 
					
						
							|  |  |  | 		_ = sysout.Info(msg) | 
					
						
							|  |  |  | 	case level.WARN: | 
					
						
							|  |  |  | 		_ = sysout.Warning(msg) | 
					
						
							|  |  |  | 	case level.ERROR: | 
					
						
							|  |  |  | 		_ = sysout.Err(msg) | 
					
						
							| 
									
										
										
										
											2022-10-01 16:36:08 +01:00
										 |  |  | 	case level.FATAL, level.PANIC: | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 		_ = sysout.Crit(msg) | 
					
						
							| 
									
										
										
										
											2022-05-07 16:46:59 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | // args returns an args format string of format '%v' * count. | 
					
						
							|  |  |  | func args(count int) string { | 
					
						
							|  |  |  | 	const args = `%v%v%v%v%v%v%v%v%v%v` + | 
					
						
							|  |  |  | 		`%v%v%v%v%v%v%v%v%v%v` + | 
					
						
							|  |  |  | 		`%v%v%v%v%v%v%v%v%v%v` + | 
					
						
							|  |  |  | 		`%v%v%v%v%v%v%v%v%v%v` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Use predetermined args str | 
					
						
							|  |  |  | 	if count < len(args) { | 
					
						
							|  |  |  | 		return args[:count*2] | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-03-03 18:12:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	// Allocate buffer of needed len | 
					
						
							|  |  |  | 	var buf strings.Builder | 
					
						
							|  |  |  | 	buf.Grow(count * 2) | 
					
						
							| 
									
										
										
										
											2022-05-07 16:46:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 	// Manually build an args str | 
					
						
							|  |  |  | 	for i := 0; i < count; i++ { | 
					
						
							|  |  |  | 		buf.WriteString(`%v`) | 
					
						
							| 
									
										
										
										
											2021-03-03 18:12:02 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-07-19 09:47:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return buf.String() | 
					
						
							| 
									
										
										
										
											2021-03-03 18:12:02 +01:00
										 |  |  | } |