+4
README.md
+4
README.md
···
115
115
* If `SENTRY_DSN` environment variable is set, panics are reported to Sentry.
116
116
* If `SENTRY_DSN` and `SENTRY_LOGS=1` environment variables are set, logs are uploaded to Sentry.
117
117
* If `SENTRY_DSN` and `SENTRY_TRACING=1` environment variables are set, traces are uploaded to Sentry.
118
+
* Optional syslog integration allows transmitting application logs to a syslog daemon. When present, the `SYSLOG_ADDR` environment variable enables the integration, and the variable's value is used to configure the absolute path to a Unix socket (usually located at `/dev/log` on Unix systems) or a network address of one of the following formats:
119
+
* for TLS over TCP: `tcp+tls://host:port`;
120
+
* for plain TCP: `tcp://host:post`;
121
+
* for UDP: `udp://host:port`.
118
122
119
123
120
124
Architecture (v2)
+2
go.mod
+2
go.mod
···
4
4
5
5
require (
6
6
codeberg.org/git-pages/go-headers v1.1.0
7
+
codeberg.org/git-pages/go-slog-syslog v0.0.0-20251122140925-40467958039d
7
8
github.com/KimMachineGun/automemlimit v0.7.5
8
9
github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500
9
10
github.com/creasty/defaults v1.8.0
···
39
40
github.com/kevinburke/ssh_config v1.4.0 // indirect
40
41
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
41
42
github.com/klauspost/crc32 v1.3.0 // indirect
43
+
github.com/leodido/go-syslog/v4 v4.3.0 // indirect
42
44
github.com/minio/crc64nvme v1.1.0 // indirect
43
45
github.com/minio/md5-simd v1.1.2 // indirect
44
46
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+6
go.sum
+6
go.sum
···
1
1
codeberg.org/git-pages/go-headers v1.1.0 h1:rk7/SOSsn+XuL7PUQZFYUaWKHEaj6K8mXmUV9rF2VxE=
2
2
codeberg.org/git-pages/go-headers v1.1.0/go.mod h1:N4gwH0U3YPwmuyxqH7xBA8j44fTPX+vOEP7ejJVBPts=
3
+
codeberg.org/git-pages/go-slog-syslog v0.0.0-20251122140501-cef0168bba20 h1:gwBA9NToHbaExklHIdOvjc4gzVJkDeffHxlsPY64NrM=
4
+
codeberg.org/git-pages/go-slog-syslog v0.0.0-20251122140501-cef0168bba20/go.mod h1:8NPSXbYcVb71qqNM5cIgn1/uQgMisLbu2dVD1BNxsUw=
5
+
codeberg.org/git-pages/go-slog-syslog v0.0.0-20251122140925-40467958039d h1:+U2YyXy2QX8oe1e5+UFR1PXfgIK79QWgAgM9l9FQG5o=
6
+
codeberg.org/git-pages/go-slog-syslog v0.0.0-20251122140925-40467958039d/go.mod h1:8NPSXbYcVb71qqNM5cIgn1/uQgMisLbu2dVD1BNxsUw=
3
7
github.com/KimMachineGun/automemlimit v0.7.5 h1:RkbaC0MwhjL1ZuBKunGDjE/ggwAX43DwZrJqVwyveTk=
4
8
github.com/KimMachineGun/automemlimit v0.7.5/go.mod h1:QZxpHaGOQoYvFhv/r4u3U0JTC2ZcOwbSr11UZF46UBM=
5
9
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
···
73
77
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
74
78
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
75
79
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
80
+
github.com/leodido/go-syslog/v4 v4.3.0 h1:bbSpI/41bYK9iSdlYzcwvlxuLOE8yi4VTFmedtnghdA=
81
+
github.com/leodido/go-syslog/v4 v4.3.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98=
76
82
github.com/maypok86/otter/v2 v2.2.1 h1:hnGssisMFkdisYcvQ8L019zpYQcdtPse+g0ps2i7cfI=
77
83
github.com/maypok86/otter/v2 v2.2.1/go.mod h1:1NKY9bY+kB5jwCXBJfE59u+zAwOt6C7ni1FTlFFMqVs=
78
84
github.com/minio/crc64nvme v1.1.0 h1:e/tAguZ+4cw32D+IO/8GSf5UVr9y+3eJcxZI2WOO/7Q=
+25
-1
src/observe.go
+25
-1
src/observe.go
···
13
13
"runtime/debug"
14
14
"strconv"
15
15
"strings"
16
+
"sync"
16
17
"time"
17
18
18
19
slogmulti "github.com/samber/slog-multi"
20
+
21
+
syslog "codeberg.org/git-pages/go-slog-syslog"
19
22
20
23
"github.com/prometheus/client_golang/prometheus"
21
24
"github.com/prometheus/client_golang/prometheus/promauto"
···
41
44
NativeHistogramMinResetDuration: 10 * time.Minute,
42
45
}, []string{"method"})
43
46
)
47
+
48
+
var syslogHandler syslog.Handler
44
49
45
50
func hasSentry() bool {
46
51
return os.Getenv("SENTRY_DSN") != ""
···
83
88
log.Println("unknown log format", config.LogFormat)
84
89
}
85
90
91
+
if syslogAddr := os.Getenv("SYSLOG_ADDR"); syslogAddr != "" {
92
+
var err error
93
+
syslogHandler, err = syslog.NewHandler(&syslog.HandlerOptions{
94
+
Address: syslogAddr,
95
+
AppName: "git-pages",
96
+
StructuredDataID: "git-pages",
97
+
})
98
+
if err != nil {
99
+
log.Fatalf("syslog: %v", err)
100
+
}
101
+
logHandlers = append(logHandlers, syslogHandler)
102
+
}
103
+
86
104
if hasSentry() {
87
105
enableLogs := false
88
106
if value, err := strconv.ParseBool(os.Getenv("SENTRY_LOGS")); err == nil {
···
154
172
}
155
173
156
174
func FiniObservability() {
175
+
var wg sync.WaitGroup
176
+
timeout := 2 * time.Second
177
+
if syslogHandler != nil {
178
+
wg.Go(func() { syslogHandler.Flush(timeout) })
179
+
}
157
180
if hasSentry() {
158
-
sentry.Flush(2 * time.Second)
181
+
wg.Go(func() { sentry.Flush(timeout) })
159
182
}
183
+
wg.Wait()
160
184
}
161
185
162
186
func ObserveError(err error) {