package archiver import ( "encoding/json" "log" "log/syslog" "ma/config" ) var syslogWriter *syslog.Writer func InitSyslog() { if config.Config.Syslog.Enable == "true" { // Parse facility facility := parseFacility(config.Config.Syslog.Facility) // Parse severity severity := parseSeverity(config.Config.Syslog.Severity) // Combine to priority priority := facility | severity var err error // Connect to remote syslog server syslogWriter, err = syslog.Dial( config.Config.Syslog.Network, config.Config.Syslog.Server, priority, config.Config.Syslog.Tag, ) if err != nil { log.Fatalf("Failed to connect to syslog server: %v", err) } log.Printf("Syslog connection established: %s://%s", config.Config.Syslog.Network, config.Config.Syslog.Server) } } func WriteSyslog(message Message) { if syslogWriter != nil { jsonData, err := json.Marshal(message) if err != nil { log.Printf("Failed to marshal message to JSON: %v", err) return } // Send to syslog based on configured severity switch config.Config.Syslog.Severity { case "emerg": syslogWriter.Emerg(string(jsonData)) case "alert": syslogWriter.Alert(string(jsonData)) case "crit": syslogWriter.Crit(string(jsonData)) case "err": syslogWriter.Err(string(jsonData)) case "warning": syslogWriter.Warning(string(jsonData)) case "notice": syslogWriter.Notice(string(jsonData)) case "info": syslogWriter.Info(string(jsonData)) case "debug": syslogWriter.Debug(string(jsonData)) default: syslogWriter.Info(string(jsonData)) } } } func parseFacility(facility string) syslog.Priority { facilities := map[string]syslog.Priority{ "kern": syslog.LOG_KERN, "user": syslog.LOG_USER, "mail": syslog.LOG_MAIL, "daemon": syslog.LOG_DAEMON, "auth": syslog.LOG_AUTH, "syslog": syslog.LOG_SYSLOG, "lpr": syslog.LOG_LPR, "news": syslog.LOG_NEWS, "uucp": syslog.LOG_UUCP, "cron": syslog.LOG_CRON, "authpriv": syslog.LOG_AUTHPRIV, "ftp": syslog.LOG_FTP, "local0": syslog.LOG_LOCAL0, "local1": syslog.LOG_LOCAL1, "local2": syslog.LOG_LOCAL2, "local3": syslog.LOG_LOCAL3, "local4": syslog.LOG_LOCAL4, "local5": syslog.LOG_LOCAL5, "local6": syslog.LOG_LOCAL6, "local7": syslog.LOG_LOCAL7, } if f, ok := facilities[facility]; ok { return f } return syslog.LOG_LOCAL0 // Default } func parseSeverity(severity string) syslog.Priority { severities := map[string]syslog.Priority{ "emerg": syslog.LOG_EMERG, "alert": syslog.LOG_ALERT, "crit": syslog.LOG_CRIT, "err": syslog.LOG_ERR, "warning": syslog.LOG_WARNING, "notice": syslog.LOG_NOTICE, "info": syslog.LOG_INFO, "debug": syslog.LOG_DEBUG, } if s, ok := severities[severity]; ok { return s } return syslog.LOG_INFO // Default }