feat: added new flag to toggle json logging

This commit is contained in:
pommee
2025-05-13 18:39:19 +02:00
parent 62b2872f52
commit 4aec8fae46
4 changed files with 75 additions and 31 deletions
+17 -8
View File
@@ -15,16 +15,25 @@ const (
Magenta = "\033[35m"
)
func AsciiArt(config settings.Config, blockedDomains int, version string, disableAuth bool) {
func AsciiArt(config settings.Config, blockedDomains int, version string, disableAuth bool, ansi bool) {
const versionSpace = 7
versionFormatted := fmt.Sprintf("%-*s%s%s%-*s%s", (versionSpace-len(version))/2, "", Cyan, version, (versionSpace-len(version)+1)/2, "", Reset)
portFormatted := fmt.Sprintf("%s%d%s", Green, config.DNS.Port, Reset)
adminPanelFormatted := fmt.Sprintf("%s%d%s", Red, config.API.Port, Reset)
upstreamFormatted := fmt.Sprintf("%s%s%s", Cyan, config.DNS.PreferredUpstream, Reset)
authFormatted := fmt.Sprintf("%s%v%s", Yellow, disableAuth, Reset)
cacheTTLFormatted := fmt.Sprintf("%s%d%s", Blue, config.DNS.CacheTTL, Reset)
blockedDomainsFormatted := fmt.Sprintf("%s%d%s", Magenta, blockedDomains, Reset)
colorize := func(color, text string) string {
if !ansi {
return text
}
return color + text + Reset
}
versionFormatted := fmt.Sprintf("%-*s%s%-*s", (versionSpace-len(version))/2, "",
colorize(Cyan, version), (versionSpace-len(version)+1)/2, "")
portFormatted := colorize(Green, fmt.Sprintf("%d", config.DNS.Port))
adminPanelFormatted := colorize(Red, fmt.Sprintf("%d", config.API.Port))
upstreamFormatted := colorize(Cyan, config.DNS.PreferredUpstream)
authFormatted := colorize(Yellow, fmt.Sprintf("%v", disableAuth))
cacheTTLFormatted := colorize(Blue, fmt.Sprintf("%d", config.DNS.CacheTTL))
blockedDomainsFormatted := colorize(Magenta, fmt.Sprintf("%d", blockedDomains))
fmt.Printf(`
__ _ ___ __ ___ ____ _ _ _ DNS port: %s
+41 -19
View File
@@ -3,6 +3,7 @@ package logging
import (
"fmt"
"log"
"log/slog"
"os"
"sync"
)
@@ -25,10 +26,12 @@ const (
)
type Logger struct {
logLevel LogLevel
LoggingEnabled bool
Ansi bool
logger *log.Logger
logLevel LogLevel
LoggingEnabled bool
Ansi bool
logger *log.Logger
JSON bool
JSONLoggerInstance *slog.Logger
}
var (
@@ -39,9 +42,11 @@ var (
func GetLogger() *Logger {
once.Do(func() {
instance = &Logger{
logLevel: INFO,
LoggingEnabled: true,
logger: log.New(os.Stdout, "", log.LstdFlags),
logLevel: INFO,
LoggingEnabled: true,
logger: log.New(os.Stdout, "", log.LstdFlags),
JSON: false,
JSONLoggerInstance: slog.New(slog.NewJSONHandler(os.Stdout, nil)),
}
})
return instance
@@ -60,11 +65,28 @@ func (l *Logger) SetLevel(level LogLevel) {
}
}
func (l *Logger) log(level string, color string, message string) {
if l.Ansi {
l.logger.Printf("%s%s%s%s", color, level, message, ColorReset)
func (l *Logger) SetFormat(JSONFormat bool) {
l.JSON = JSONFormat
}
func (l *Logger) log(level string, color string, message string, msgLevel LogLevel) {
if !l.JSON {
if l.Ansi {
l.logger.Printf("%s%s%s%s", color, level, message, ColorReset)
} else {
l.logger.Printf("%s%s", level, message)
}
} else {
l.logger.Printf("%s%s", level, message)
switch msgLevel {
case DEBUG:
l.JSONLoggerInstance.Debug(message)
case INFO:
l.JSONLoggerInstance.Info(message)
case WARNING:
l.JSONLoggerInstance.Warn(message)
case ERROR:
l.JSONLoggerInstance.Error(message)
}
}
}
@@ -78,9 +100,9 @@ func (l *Logger) Debug(format string, args ...interface{}) {
}
if len(args) > 0 {
message := fmt.Sprintf(format, args...)
l.log("[DEBUG] ", ColorGray, message)
l.log("[DEBUG] ", ColorGray, message, DEBUG)
} else {
l.log("[DEBUG] ", ColorGray, format)
l.log("[DEBUG] ", ColorGray, format, DEBUG)
}
}
@@ -90,9 +112,9 @@ func (l *Logger) Info(format string, args ...interface{}) {
}
if len(args) > 0 {
message := fmt.Sprintf(format, args...)
l.log("[INFO] ", ColorWhite, message)
l.log("[INFO] ", ColorWhite, message, INFO)
} else {
l.log("[INFO] ", ColorWhite, format)
l.log("[INFO] ", ColorWhite, format, INFO)
}
}
@@ -102,9 +124,9 @@ func (l *Logger) Warning(format string, args ...interface{}) {
}
if len(args) > 0 {
message := fmt.Sprintf(format, args...)
l.log("[WARN] ", ColorYellow, message)
l.log("[WARN] ", ColorYellow, message, WARNING)
} else {
l.log("[WARN] ", ColorYellow, format)
l.log("[WARN] ", ColorYellow, format, WARNING)
}
}
@@ -114,9 +136,9 @@ func (l *Logger) Error(format string, args ...interface{}) {
}
if len(args) > 0 {
message := fmt.Sprintf(format, args...)
l.log("[ERROR] ", ColorRed, message)
l.log("[ERROR] ", ColorRed, message, ERROR)
} else {
l.log("[ERROR] ", ColorRed, format)
l.log("[ERROR] ", ColorRed, format, ERROR)
}
}
+12
View File
@@ -1,6 +1,7 @@
package setup
import (
"fmt"
"goaway/backend/logging"
"goaway/backend/settings"
"os"
@@ -19,9 +20,19 @@ type Flags struct {
Authentication bool
DevMode bool
Ansi bool
JSON bool
}
func UpdateConfig(config *settings.Config, flags *Flags) {
if flags.JSON {
flags.Ansi = false
}
if flags.LogLevel > 3 || flags.LogLevel < 0 {
fmt.Println("Flag --log-level can't be greater than 3 or below 0.")
os.Exit(1)
}
config.DNS.Port = flags.DnsPort
config.API.Port = flags.WebserverPort
config.StatisticsRetention = flags.StatisticsRetention
@@ -30,6 +41,7 @@ func UpdateConfig(config *settings.Config, flags *Flags) {
config.LoggingEnabled = flags.LoggingEnabled
config.LogLevel = logging.LogLevel(flags.LogLevel)
log.JSON = flags.JSON
log.Ansi = flags.Ansi
log.SetLevel(logging.LogLevel(flags.LogLevel))
log.ToggleLogging(config.LoggingEnabled)
+5 -4
View File
@@ -44,7 +44,7 @@ func createRootCommand() *cobra.Command {
Use: "goaway",
Short: "GoAway is a DNS sinkhole with a web interface",
Run: func(cmd *cobra.Command, args []string) {
startServer(setup.InitializeSettings(&flags))
startServer(setup.InitializeSettings(&flags), flags.Ansi)
},
}
@@ -55,12 +55,13 @@ func createRootCommand() *cobra.Command {
cmd.Flags().BoolVar(&flags.LoggingEnabled, "logging", true, "Toggle logging")
cmd.Flags().BoolVar(&flags.Authentication, "auth", true, "Toggle authentication for admin dashboard")
cmd.Flags().BoolVar(&flags.DevMode, "dev", false, "Only used while developing goaway")
cmd.Flags().BoolVar(&flags.Ansi, "ansi", true, "Toggle colorized logs")
cmd.Flags().BoolVar(&flags.Ansi, "ansi", true, "Toggle colorized logs. Only available in non-json formatted logs")
cmd.Flags().BoolVar(&flags.JSON, "json", false, "Toggle JSON formatted logs")
return cmd
}
func startServer(config settings.Config) {
func startServer(config settings.Config, ansi bool) {
if os.Getenv("GOAWAY_PROFILE") == "true" {
log.Warning("GOAWAY_PROFILE was set, starting profiler...")
go func() {
@@ -81,7 +82,7 @@ func startServer(config settings.Config) {
blockedDomains, serverInstance := dnsServer.Init()
currentVersion := setup.GetVersionOrDefault(version)
asciiart.AsciiArt(config, blockedDomains, currentVersion.Original(), config.API.Authentication)
asciiart.AsciiArt(config, blockedDomains, currentVersion.Original(), config.API.Authentication, ansi)
startServices(dnsServer, serverInstance, config)
}