mirror of
https://github.com/pommee/goaway.git
synced 2026-05-04 15:39:21 -05:00
feat: added new flag to toggle json logging
This commit is contained in:
@@ -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
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user