Pārlūkot izejas kodu

Add --log_format flag for structured JSON console logging

Introduces a --log_format=json flag (default: text) that switches the
system-wide logger's console output from plain text to newline-delimited
JSON entries with time, level, title, and message fields.

https://claude.ai/code/session_01TvkmdBDMMeaz3qu5FGDapg
Claude 2 nedēļas atpakaļ
vecāks
revīzija
8a2de3698b
4 mainītis faili ar 32 papildinājumiem un 1 dzēšanām
  1. 1 0
      src/main.flags.go
  2. 1 0
      src/main.go
  3. 29 1
      src/mod/info/logger/logger.go
  4. 1 0
      src/startup.go

+ 1 - 0
src/main.flags.go

@@ -98,6 +98,7 @@ var enable_buffering = flag.Bool("enable_buffpool", true, "Enable buffer pool fo
 var enable_beta_scanning_support = flag.Bool("beta_scan", false, "Allow compatibility to ArOZ Online Beta Clusters")
 var enable_console = flag.Bool("console", false, "Enable the debugging console.")
 var enable_logging = flag.Bool("logging", true, "Enable logging to file for debug purpose")
+var log_format = flag.String("log_format", "text", "Console log output format: text or json")
 
 // Flags related to running on Cloud Environment or public domain
 var allow_public_registry = flag.Bool("public_reg", false, "Enable public register interface for account creation")

+ 1 - 0
src/main.go

@@ -92,6 +92,7 @@ func main() {
 	// Initialize a temporary stdout-only logger so calls before RunStartup are safe.
 	// RunStartup will replace this with a file-backed logger.
 	systemWideLogger, _ = logger.NewTmpLogger()
+	systemWideLogger.PrintJSON = (*log_format == "json")
 
 	//Print copyRight information
 	systemWideLogger.PrintAndLog("System", "ArozOS(C) "+strconv.Itoa(time.Now().Year())+" "+deviceVendor+".", nil)

+ 29 - 1
src/mod/info/logger/logger.go

@@ -1,6 +1,7 @@
 package logger
 
 import (
+	"encoding/json"
 	"fmt"
 	"log"
 	"os"
@@ -18,12 +19,20 @@ import (
 
 type Logger struct {
 	LogToFile      bool     //Set enable write to file
+	PrintJSON      bool     //Print console output as JSON lines instead of plain text
 	Prefix         string   //Prefix for log files
 	LogFolder      string   //Folder to store the log  file
 	CurrentLogFile string   //Current writing filename
 	file           *os.File //File, empty if LogToFile is false
 }
 
+type jsonLogEntry struct {
+	Time    string `json:"time"`
+	Level   string `json:"level"`
+	Title   string `json:"title"`
+	Message string `json:"message"`
+}
+
 // Create a default logger
 func NewLogger(logFilePrefix string, logFolder string, logToFile bool) (*Logger, error) {
 	if logToFile {
@@ -67,7 +76,26 @@ func (l *Logger) PrintAndLog(title string, message string, originalError error)
 	go func() {
 		l.Log(title, message, originalError)
 	}()
-	log.Println("[" + title + "] " + message)
+	if l.PrintJSON {
+		level := "info"
+		if originalError != nil {
+			level = "error"
+		}
+		entry := jsonLogEntry{
+			Time:    time.Now().Format("2006-01-02T15:04:05.000000Z07:00"),
+			Level:   level,
+			Title:   title,
+			Message: message,
+		}
+		b, err := json.Marshal(entry)
+		if err != nil {
+			log.Println("[" + title + "] " + message)
+			return
+		}
+		fmt.Println(string(b))
+	} else {
+		log.Println("[" + title + "] " + message)
+	}
 }
 
 func (l *Logger) Log(title string, errorMessage string, originalError error) {

+ 1 - 0
src/startup.go

@@ -17,6 +17,7 @@ import (
 
 func RunStartup() {
 	systemWideLogger, _ = logger.NewLogger("system", "system/logs/system/", true)
+	systemWideLogger.PrintJSON = (*log_format == "json")
 	//1. Initiate the main system database
 
 	//Check if system or web both not exists and web.tar.gz exists. Unzip it for the user