Skip to content

Commit 621484a

Browse files
committed
refactor: use structured logging
1 parent 3aa9300 commit 621484a

32 files changed

+415
-289
lines changed

block_device.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ type remoteImageBackend struct {
1616

1717
func (r remoteImageBackend) ReadAt(p []byte, off int64) (n int, err error) {
1818
virtualMediaStateMutex.RLock()
19-
logger.Debugf("currentVirtualMediaState is %v", currentVirtualMediaState)
20-
logger.Debugf("read size: %d, off: %d", len(p), off)
19+
logger.Debug().Interface("currentVirtualMediaState", currentVirtualMediaState).Msg("currentVirtualMediaState")
20+
logger.Debug().Int64("read size", int64(len(p))).Int64("off", off).Msg("read size and off")
2121
if currentVirtualMediaState == nil {
2222
return 0, errors.New("image not mounted")
2323
}
@@ -93,7 +93,7 @@ func (d *NBDDevice) Start() error {
9393
// Remove the socket file if it already exists
9494
if _, err := os.Stat(nbdSocketPath); err == nil {
9595
if err := os.Remove(nbdSocketPath); err != nil {
96-
logger.Errorf("Failed to remove existing socket file %s: %v", nbdSocketPath, err)
96+
nativeLogger.Warn().Err(err).Str("socket_path", nbdSocketPath).Msg("Failed to remove existing socket file")
9797
os.Exit(1)
9898
}
9999
}
@@ -134,22 +134,22 @@ func (d *NBDDevice) runServerConn() {
134134
MaximumBlockSize: uint32(16 * 1024),
135135
SupportsMultiConn: false,
136136
})
137-
logger.Infof("nbd server exited: %v", err)
137+
nativeLogger.Info().Err(err).Msg("nbd server exited")
138138
}
139139

140140
func (d *NBDDevice) runClientConn() {
141141
err := client.Connect(d.clientConn, d.dev, &client.Options{
142142
ExportName: "jetkvm",
143143
BlockSize: uint32(4 * 1024),
144144
})
145-
logger.Infof("nbd client exited: %v", err)
145+
nativeLogger.Info().Err(err).Msg("nbd client exited")
146146
}
147147

148148
func (d *NBDDevice) Close() {
149149
if d.dev != nil {
150150
err := client.Disconnect(d.dev)
151151
if err != nil {
152-
logger.Warnf("error disconnecting nbd client: %v", err)
152+
nativeLogger.Warn().Err(err).Msg("error disconnecting nbd client")
153153
}
154154
_ = d.dev.Close()
155155
}

cloud.go

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -253,14 +253,14 @@ func disconnectCloud(reason error) {
253253
defer cloudDisconnectLock.Unlock()
254254

255255
if cloudDisconnectChan == nil {
256-
cloudLogger.Tracef("cloud disconnect channel is not set, no need to disconnect")
256+
cloudLogger.Trace().Msg("cloud disconnect channel is not set, no need to disconnect")
257257
return
258258
}
259259

260260
// just in case the channel is closed, we don't want to panic
261261
defer func() {
262262
if r := recover(); r != nil {
263-
cloudLogger.Infof("cloud disconnect channel is closed, no need to disconnect: %v", r)
263+
cloudLogger.Warn().Interface("reason", r).Msg("cloud disconnect channel is closed, no need to disconnect")
264264
}
265265
}()
266266
cloudDisconnectChan <- reason
@@ -289,11 +289,16 @@ func runWebsocketClient() error {
289289
header.Set("Authorization", "Bearer "+config.CloudToken)
290290
dialCtx, cancelDial := context.WithTimeout(context.Background(), CloudWebSocketConnectTimeout)
291291

292+
scopedLogger := websocketLogger.With().
293+
Str("source", wsURL.String()).
294+
Str("sourceType", "cloud").
295+
Logger()
296+
292297
defer cancelDial()
293298
c, _, err := websocket.Dial(dialCtx, wsURL.String(), &websocket.DialOptions{
294299
HTTPHeader: header,
295300
OnPingReceived: func(ctx context.Context, payload []byte) bool {
296-
websocketLogger.Infof("ping frame received: %v, source: %s, sourceType: cloud", payload, wsURL.Host)
301+
scopedLogger.Info().Bytes("payload", payload).Int("length", len(payload)).Msg("ping frame received")
297302

298303
metricConnectionTotalPingReceivedCount.WithLabelValues("cloud", wsURL.Host).Inc()
299304
metricConnectionLastPingReceivedTimestamp.WithLabelValues("cloud", wsURL.Host).SetToCurrentTime()
@@ -304,19 +309,19 @@ func runWebsocketClient() error {
304309
// if the context is canceled, we don't want to return an error
305310
if err != nil {
306311
if errors.Is(err, context.Canceled) {
307-
cloudLogger.Infof("websocket connection canceled")
312+
cloudLogger.Info().Msg("websocket connection canceled")
308313
return nil
309314
}
310315
return err
311316
}
312317
defer c.CloseNow() //nolint:errcheck
313-
cloudLogger.Infof("websocket connected to %s", wsURL)
318+
cloudLogger.Info().Str("url", wsURL.String()).Msg("websocket connected")
314319

315320
// set the metrics when we successfully connect to the cloud.
316321
wsResetMetrics(true, "cloud", wsURL.Host)
317322

318323
// we don't have a source for the cloud connection
319-
return handleWebRTCSignalWsMessages(c, true, wsURL.Host)
324+
return handleWebRTCSignalWsMessages(c, true, wsURL.Host, &scopedLogger)
320325
}
321326

322327
func authenticateSession(ctx context.Context, c *websocket.Conn, req WebRTCSessionRequest) error {
@@ -327,7 +332,7 @@ func authenticateSession(ctx context.Context, c *websocket.Conn, req WebRTCSessi
327332
_ = wsjson.Write(context.Background(), c, gin.H{
328333
"error": fmt.Sprintf("failed to initialize OIDC provider: %v", err),
329334
})
330-
cloudLogger.Errorf("failed to initialize OIDC provider: %v", err)
335+
cloudLogger.Warn().Err(err).Msg("failed to initialize OIDC provider")
331336
return err
332337
}
333338

@@ -396,8 +401,8 @@ func handleSessionRequest(ctx context.Context, c *websocket.Conn, req WebRTCSess
396401
}()
397402
}
398403

399-
cloudLogger.Info("new session accepted")
400-
cloudLogger.Tracef("new session accepted: %v", session)
404+
cloudLogger.Info().Interface("session", session).Msg("new session accepted")
405+
cloudLogger.Trace().Interface("session", session).Msg("new session accepted")
401406
currentSession = session
402407
_ = wsjson.Write(context.Background(), c, gin.H{"type": "answer", "data": sd})
403408
return nil
@@ -413,21 +418,21 @@ func RunWebsocketClient() {
413418

414419
// If the network is not up, well, we can't connect to the cloud.
415420
if !networkState.Up {
416-
cloudLogger.Warn("waiting for network to be up, will retry in 3 seconds")
421+
cloudLogger.Warn().Msg("waiting for network to be up, will retry in 3 seconds")
417422
time.Sleep(3 * time.Second)
418423
continue
419424
}
420425

421426
// If the system time is not synchronized, the API request will fail anyway because the TLS handshake will fail.
422427
if isTimeSyncNeeded() && !timeSyncSuccess {
423-
cloudLogger.Warn("system time is not synced, will retry in 3 seconds")
428+
cloudLogger.Warn().Msg("system time is not synced, will retry in 3 seconds")
424429
time.Sleep(3 * time.Second)
425430
continue
426431
}
427432

428433
err := runWebsocketClient()
429434
if err != nil {
430-
cloudLogger.Errorf("websocket client error: %v", err)
435+
cloudLogger.Warn().Err(err).Msg("websocket client error")
431436
metricCloudConnectionStatus.Set(0)
432437
metricCloudConnectionFailureCount.Inc()
433438
time.Sleep(5 * time.Second)
@@ -479,7 +484,7 @@ func rpcDeregisterDevice() error {
479484
return fmt.Errorf("failed to save configuration after deregistering: %w", err)
480485
}
481486

482-
cloudLogger.Infof("device deregistered, disconnecting from cloud")
487+
cloudLogger.Info().Msg("device deregistered, disconnecting from cloud")
483488
disconnectCloud(fmt.Errorf("device deregistered"))
484489

485490
return nil

config.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func LoadConfig() {
132132
defer configLock.Unlock()
133133

134134
if config != nil {
135-
logger.Info("config already loaded, skipping")
135+
logger.Info().Msg("config already loaded, skipping")
136136
return
137137
}
138138

@@ -141,15 +141,15 @@ func LoadConfig() {
141141

142142
file, err := os.Open(configPath)
143143
if err != nil {
144-
logger.Debug("default config file doesn't exist, using default")
144+
logger.Debug().Msg("default config file doesn't exist, using default")
145145
return
146146
}
147147
defer file.Close()
148148

149149
// load and merge the default config with the user config
150150
loadedConfig := *defaultConfig
151151
if err := json.NewDecoder(file).Decode(&loadedConfig); err != nil {
152-
logger.Errorf("config file JSON parsing failed, %v", err)
152+
logger.Warn().Err(err).Msg("config file JSON parsing failed")
153153
return
154154
}
155155

display.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const (
2424
func switchToScreen(screen string) {
2525
_, err := CallCtrlAction("lv_scr_load", map[string]interface{}{"obj": screen})
2626
if err != nil {
27-
logger.Warnf("failed to switch to screen %s: %v", screen, err)
27+
displayLogger.Warn().Err(err).Str("screen", screen).Msg("failed to switch to screen")
2828
return
2929
}
3030
currentScreen = screen
@@ -40,7 +40,7 @@ func updateLabelIfChanged(objName string, newText string) {
4040
}
4141

4242
func switchToScreenIfDifferent(screenName string) {
43-
logger.Infof("switching screen from %s to %s", currentScreen, screenName)
43+
displayLogger.Info().Str("from", currentScreen).Str("to", screenName).Msg("switching screen")
4444
if currentScreen != screenName {
4545
switchToScreen(screenName)
4646
}
@@ -74,12 +74,12 @@ var displayInited = false
7474

7575
func requestDisplayUpdate() {
7676
if !displayInited {
77-
logger.Info("display not inited, skipping updates")
77+
displayLogger.Info().Msg("display not inited, skipping updates")
7878
return
7979
}
8080
go func() {
8181
wakeDisplay(false)
82-
logger.Info("display updating")
82+
displayLogger.Info().Msg("display updating")
8383
//TODO: only run once regardless how many pending updates
8484
updateDisplay()
8585
}()
@@ -118,7 +118,7 @@ func setDisplayBrightness(brightness int) error {
118118
return err
119119
}
120120

121-
logger.Infof("display: set brightness to %v", brightness)
121+
displayLogger.Info().Int("brightness", brightness).Msg("set brightness")
122122
return nil
123123
}
124124

@@ -127,7 +127,7 @@ func setDisplayBrightness(brightness int) error {
127127
func tick_displayDim() {
128128
err := setDisplayBrightness(config.DisplayMaxBrightness / 2)
129129
if err != nil {
130-
logger.Warnf("display: failed to dim display: %s", err)
130+
displayLogger.Warn().Err(err).Msg("failed to dim display")
131131
}
132132

133133
dimTicker.Stop()
@@ -140,7 +140,7 @@ func tick_displayDim() {
140140
func tick_displayOff() {
141141
err := setDisplayBrightness(0)
142142
if err != nil {
143-
logger.Warnf("display: failed to turn off display: %s", err)
143+
displayLogger.Warn().Err(err).Msg("failed to turn off display")
144144
}
145145

146146
offTicker.Stop()
@@ -163,7 +163,7 @@ func wakeDisplay(force bool) {
163163

164164
err := setDisplayBrightness(config.DisplayMaxBrightness)
165165
if err != nil {
166-
logger.Warnf("display wake failed, %s", err)
166+
displayLogger.Warn().Err(err).Msg("failed to wake display")
167167
}
168168

169169
if config.DisplayDimAfterSec != 0 {
@@ -183,7 +183,7 @@ func wakeDisplay(force bool) {
183183
func watchTsEvents() {
184184
ts, err := os.OpenFile(touchscreenDevice, os.O_RDONLY, 0666)
185185
if err != nil {
186-
logger.Warnf("display: failed to open touchscreen device: %s", err)
186+
displayLogger.Warn().Err(err).Msg("failed to open touchscreen device")
187187
return
188188
}
189189

@@ -196,7 +196,7 @@ func watchTsEvents() {
196196
for {
197197
_, err := ts.Read(buf)
198198
if err != nil {
199-
logger.Warnf("display: failed to read from touchscreen device: %s", err)
199+
displayLogger.Warn().Err(err).Msg("failed to read from touchscreen device")
200200
return
201201
}
202202

@@ -216,7 +216,7 @@ func startBacklightTickers() {
216216
}
217217

218218
if dimTicker == nil && config.DisplayDimAfterSec != 0 {
219-
logger.Info("display: dim_ticker has started")
219+
displayLogger.Info().Msg("dim_ticker has started")
220220
dimTicker = time.NewTicker(time.Duration(config.DisplayDimAfterSec) * time.Second)
221221
defer dimTicker.Stop()
222222

@@ -231,7 +231,7 @@ func startBacklightTickers() {
231231
}
232232

233233
if offTicker == nil && config.DisplayOffAfterSec != 0 {
234-
logger.Info("display: off_ticker has started")
234+
displayLogger.Info().Msg("off_ticker has started")
235235
offTicker = time.NewTicker(time.Duration(config.DisplayOffAfterSec) * time.Second)
236236
defer offTicker.Stop()
237237

@@ -251,11 +251,11 @@ func init() {
251251

252252
go func() {
253253
waitCtrlClientConnected()
254-
logger.Info("setting initial display contents")
254+
displayLogger.Info().Msg("setting initial display contents")
255255
time.Sleep(500 * time.Millisecond)
256256
updateStaticContents()
257257
displayInited = true
258-
logger.Info("display inited")
258+
displayLogger.Info().Msg("display inited")
259259
startBacklightTickers()
260260
wakeDisplay(true)
261261
requestDisplayUpdate()

fuse.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func RunFuseServer() {
103103
var err error
104104
fuseServer, err = fs.Mount(fuseMountPoint, &FuseRoot{}, opts)
105105
if err != nil {
106-
logger.Warnf("failed to mount fuse: %v", err)
106+
logger.Warn().Err(err).Msg("failed to mount fuse")
107107
}
108108
fuseServer.Wait()
109109
}

hw.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func GetDeviceID() string {
4242
deviceIDOnce.Do(func() {
4343
serial, err := extractSerialNumber()
4444
if err != nil {
45-
logger.Warn("unknown serial number, the program likely not running on RV1106")
45+
logger.Warn().Msg("unknown serial number, the program likely not running on RV1106")
4646
deviceID = "unknown_device_id"
4747
} else {
4848
deviceID = serial
@@ -54,7 +54,7 @@ func GetDeviceID() string {
5454
func runWatchdog() {
5555
file, err := os.OpenFile("/dev/watchdog", os.O_WRONLY, 0)
5656
if err != nil {
57-
logger.Warnf("unable to open /dev/watchdog: %v, skipping watchdog reset", err)
57+
logger.Warn().Err(err).Msg("unable to open /dev/watchdog, skipping watchdog reset")
5858
return
5959
}
6060
defer file.Close()
@@ -65,13 +65,13 @@ func runWatchdog() {
6565
case <-ticker.C:
6666
_, err = file.Write([]byte{0})
6767
if err != nil {
68-
logger.Errorf("error writing to /dev/watchdog, system may reboot: %v", err)
68+
logger.Warn().Err(err).Msg("error writing to /dev/watchdog, system may reboot")
6969
}
7070
case <-appCtx.Done():
7171
//disarm watchdog with magic value
7272
_, err := file.Write([]byte("V"))
7373
if err != nil {
74-
logger.Errorf("failed to disarm watchdog, system may reboot: %v", err)
74+
logger.Warn().Err(err).Msg("failed to disarm watchdog, system may reboot")
7575
}
7676
return
7777
}

internal/pion/logging/logger.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io"
88
"os"
9+
"runtime"
910
"strings"
1011
"sync"
1112
"time"
@@ -16,16 +17,13 @@ import (
1617
var defaultOutput io.Writer = zerolog.ConsoleWriter{
1718
Out: os.Stdout,
1819
TimeFormat: time.RFC3339,
19-
PartsOrder: []string{"time", "level", "scope", "message"},
20-
FieldsExclude: []string{"scope"},
20+
PartsOrder: []string{"time", "level", "scope", "component", "message"},
21+
FieldsExclude: []string{"scope", "component"},
2122
FormatPartValueByName: func(value interface{}, name string) string {
2223
val := fmt.Sprintf("%s", value)
23-
if name == "scope" {
24-
if strings.HasPrefix(val, "jetkvm/") {
25-
return val[7:]
26-
} else {
27-
// scope without prefix, we assume it's from the pion library
28-
return fmt.Sprintf("pion/%s", val)
24+
if name == "component" {
25+
if value == nil {
26+
return "-"
2927
}
3028
}
3129
return val
@@ -182,7 +180,19 @@ func NewDefaultLeveledLoggerForScope(scope string, level LogLevel, writer io.Wri
182180
if writer == nil {
183181
writer = defaultOutput
184182
}
185-
zerologWriter := zerolog.New(writer).With().Timestamp().Str("scope", scope).Logger()
183+
184+
z := zerolog.New(writer).Level(toZerologLevel(level)).With().Timestamp()
185+
186+
// scope will be changed to the component name if it's from the pion library
187+
_, file, _, _ := runtime.Caller(2)
188+
if strings.Contains(file, "github.com/pion/") {
189+
z = z.Str("scope", "pion").Str("component", scope)
190+
} else {
191+
z = z.Str("scope", scope)
192+
}
193+
194+
zerologWriter := z.Logger()
195+
186196
logger := &DefaultLeveledLogger{
187197
writer: &zerologWriter,
188198
level: level,

0 commit comments

Comments
 (0)