From c42c103ddb66028a085fb452102f73f8b27dcdcb Mon Sep 17 00:00:00 2001 From: Jeff Halter <868228+jhalter@users.noreply.github.com> Date: Mon, 1 Jun 2026 09:26:50 -0700 Subject: Improve startup logging and logging consistency Startup log: - Add interface, port, and fileTransferPort fields to the "Hotline server started" line so operators can see what the server bound to. - Resolve an empty -interface flag to 0.0.0.0 for display. Levels: - Demote the two Redis startup messages (ban management, cleared online users) from Info to Debug. Consistency: - Standardize the error field key to "err" (was "Err" in a few account handlers) and lowercase "Account" -> "account". - Standardize the remote-address key to "remoteAddr" (was "RemoteAddr"). - Replace fmt.Sprintf in the tracker-registration message and string concatenation in the config-dir-init and ban-disconnect messages with structured fields; use the standard "err" key. - Give the two bare rLogger.Error(err.Error()) file-transfer calls a descriptive message and an "err" field. logger.go: - Only attach the rotating lumberjack file writer when --log-file is set. An empty Filename made lumberjack write to a temp file by default. --- internal/mobius/api.go | 2 +- internal/mobius/logger.go | 19 +++++++++++++------ internal/mobius/transaction_handlers.go | 12 ++++++------ 3 files changed, 20 insertions(+), 13 deletions(-) (limited to 'internal') diff --git a/internal/mobius/api.go b/internal/mobius/api.go index adc9072..a574bf8 100644 --- a/internal/mobius/api.go +++ b/internal/mobius/api.go @@ -85,7 +85,7 @@ func NewAPIServer(hlServer *hotline.Server, reloadFunc func(), logger *slog.Logg if err := hlServer.Redis.Del(context.Background(), hotline.RedisKeyOnline).Err(); err != nil { srv.logger.Warn("Failed to clear online users in Redis", "err", err) } else { - srv.logger.Info("Cleared online users in Redis on startup") + srv.logger.Debug("Cleared online users in Redis on startup") } } diff --git a/internal/mobius/logger.go b/internal/mobius/logger.go index 60d4f0d..2f67a71 100644 --- a/internal/mobius/logger.go +++ b/internal/mobius/logger.go @@ -22,14 +22,21 @@ var logLevels = map[string]slog.Level{ } func NewLogger(logLevel, logFile *string) *slog.Logger { + // Always log to stdout. Only add the rotating file writer when a log file path + // is configured; an empty Filename makes lumberjack write to a temp file. + var out io.Writer = os.Stdout + if *logFile != "" { + out = io.MultiWriter(os.Stdout, &lumberjack.Logger{ + Filename: *logFile, + MaxSize: logMaxSize, + MaxBackups: logMaxBackups, + MaxAge: logMaxAge, + }) + } + return slog.New( slog.NewTextHandler( - io.MultiWriter(os.Stdout, &lumberjack.Logger{ - Filename: *logFile, - MaxSize: logMaxSize, - MaxBackups: logMaxBackups, - MaxAge: logMaxAge, - }), + out, &slog.HandlerOptions{ Level: logLevels[*logLevel], ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { diff --git a/internal/mobius/transaction_handlers.go b/internal/mobius/transaction_handlers.go index b629be8..96b4f69 100644 --- a/internal/mobius/transaction_handlers.go +++ b/internal/mobius/transaction_handlers.go @@ -685,7 +685,7 @@ func HandleSetUser(cc *hotline.ClientConn, t *hotline.Transaction) (res []hotlin err := cc.Server.AccountManager.Update(*account, account.Login) if err != nil { - cc.Logger.Error("Error updating account", "Err", err) + cc.Logger.Error("Error updating account", "err", err) return cc.NewErrReply(t, ErrMsgUpdateAccount) } @@ -760,7 +760,7 @@ func HandleListUsers(cc *hotline.ClientConn, t *hotline.Transaction) (res []hotl for _, acc := range cc.Server.AccountManager.List() { b, err := io.ReadAll(&acc) if err != nil { - cc.Logger.Error("Error reading account", "Account", acc.Login, "Err", err) + cc.Logger.Error("Error reading account", "account", acc.Login, "err", err) continue } @@ -831,7 +831,7 @@ func HandleUpdateUser(cc *hotline.ClientConn, t *hotline.Transaction) (res []hot cc.Logger.Info("DeleteUser", "login", login) if err := cc.Server.AccountManager.Delete(login); err != nil { - cc.Logger.Error("Error deleting account", "Err", err) + cc.Logger.Error("Error deleting account", "err", err) return cc.NewErrReply(t, ErrMsgDeleteAccount) } @@ -1005,7 +1005,7 @@ func HandleDeleteUser(cc *hotline.ClientConn, t *hotline.Transaction) (res []hot login := t.GetField(hotline.FieldUserLogin).DecodeObfuscatedString() if err := cc.Server.AccountManager.Delete(login); err != nil { - cc.Logger.Error("Error deleting account", "Err", err) + cc.Logger.Error("Error deleting account", "err", err) return cc.NewErrReply(t, ErrMsgDeleteAccount) } @@ -1269,7 +1269,7 @@ func HandleDisconnectUser(cc *hotline.ClientConn, t *hotline.Transaction) (res [ switch options[1] { case 1: // send message: "You are temporarily banned on this server" - cc.Logger.Info("Disconnect & temporarily ban " + string(clientConn.UserName)) + cc.Logger.Info("Disconnect & temporarily ban user", "username", string(clientConn.UserName)) res = append(res, hotline.NewTransaction( hotline.TranServerMsg, @@ -1288,7 +1288,7 @@ func HandleDisconnectUser(cc *hotline.ClientConn, t *hotline.Transaction) (res [ } case 2: // send message: "You are permanently banned on this server" - cc.Logger.Info("Disconnect & ban " + string(clientConn.UserName)) + cc.Logger.Info("Disconnect & ban user", "username", string(clientConn.UserName)) res = append(res, hotline.NewTransaction( hotline.TranServerMsg, -- cgit