118 lines
2.8 KiB
Go
118 lines
2.8 KiB
Go
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
|
|
}
|