gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 188Rust 55Shell 30Markdown 281211 Definiciones

⎇ 534014c3ec69daea789a1d0523e1d00a69c6ed65 tandas/staged-fallidos-go-20260705/syslog-log-format.patch 98 líneas · 2.1 KB Historia crudo

Etapa G (go): triage cola envenenada del VPS — purga 25 (misimports/CGO/embed) + 10 fixes (subdir dolt-atlas-omp, crane ./cmd/crane, trivy GOEXPERIMENT=jsonv2, xq/tea/staticcheck/syft/apko a vía Go auto) 3171dd59f · sergio ·

1Add "syslog" log format.
2
3I didn't contribute this patch to the upstream because I don't wanna
4contribute to any Go projects. However, if you find this patch useful,
5feel free to send it to the upstream under your name.
6
7diff --git a/log/configuration.go b/log/configuration.go
8index a756242b8..cbe4dabcd 100644
9--- a/log/configuration.go
10+++ b/log/configuration.go
11@@ -13,6 +13,7 @@ const (
12 	FormatRunner = "runner"
13 	FormatText   = "text"
14 	FormatJSON   = "json"
15+	FormatSyslog = "syslog"
16 )
17 
18 var (
19@@ -26,7 +27,7 @@ var (
20 		},
21 		cli.StringFlag{
22 			Name:   "log-format",
23-			Usage:  "Choose log format (options: runner, text, json)",
24+			Usage:  "Choose log format (options: runner, text, json, syslog)",
25 			EnvVar: "LOG_FORMAT",
26 		},
27 		cli.StringFlag{
28@@ -44,6 +45,7 @@ var (
29 		FormatJSON: &logrus.JSONFormatter{
30 			TimestampFormat: time.RFC3339Nano,
31 		},
32+		FormatSyslog: new(SyslogFormatter),
33 	}
34 )
35 
36diff --git a/log/syslog_formatter.go b/log/syslog_formatter.go
37new file mode 100644
38index 000000000..fe60e0fc7
39--- /dev/null
40+++ b/log/syslog_formatter.go
41@@ -0,0 +1,57 @@
42+package log
43+
44+import (
45+	"bytes"
46+	"fmt"
47+	"time"
48+
49+	"github.com/sirupsen/logrus"
50+)
51+
52+type SyslogFormatter struct {
53+}
54+
55+func (f *SyslogFormatter) Format(entry *logrus.Entry) ([]byte, error) {
56+	var b *bytes.Buffer
57+	if entry.Buffer != nil {
58+		b = entry.Buffer
59+	} else {
60+		b = &bytes.Buffer{}
61+	}
62+
63+	if entry.Message != "" {
64+		b.WriteString(entry.Message)
65+	}
66+	dataWritten := false
67+	for key, val := range entry.Data {
68+		if key == "now" {
69+			continue
70+		}
71+		var stringVal string
72+
73+		switch val := val.(type) {
74+		case time.Time:
75+			stringVal = val.Format(time.RFC3339)
76+		default:
77+			var ok bool
78+			if stringVal, ok = val.(string); !ok {
79+				stringVal = fmt.Sprint(val)
80+			}
81+		}
82+
83+		// The format is inspired by RFC 5424 STRUCTURED-DATA.
84+		if dataWritten {
85+			b.WriteByte(' ')
86+		} else {
87+			b.WriteString(" [meta ")
88+			dataWritten = true
89+		}
90+		b.WriteString(fmt.Sprintf("%s=%q", key, stringVal))
91+	}
92+	if dataWritten {
93+		b.WriteByte(']')
94+	}
95+	b.WriteByte('\n')
96+
97+	return b.Bytes(), nil
98+}