package main import ( "crypto/rand" "encoding/hex" "fmt" "log" "os" "path/filepath" "time" ) var certLogger *log.Logger var certLogFile *os.File // initCertLogger initialisiert das Logging-System für Zertifikatsanfragen func initCertLogger() error { logDir := "logs" if err := os.MkdirAll(logDir, 0755); err != nil { return fmt.Errorf("fehler beim Erstellen des Log-Verzeichnisses: %v", err) } logFile := filepath.Join(logDir, fmt.Sprintf("cert-requests-%s.log", time.Now().Format("2006-01-02"))) file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { return fmt.Errorf("fehler beim Öffnen der Log-Datei: %v", err) } certLogFile = file certLogger = log.New(file, "", log.LstdFlags) return nil } // generateTraceID generiert eine eindeutige TraceID für einen Vorgang func generateTraceID() string { bytes := make([]byte, 8) rand.Read(bytes) return hex.EncodeToString(bytes) } // logCertStatus schreibt einen Status-Eintrag in die Log-Datei // traceID: Eindeutige ID für den Vorgang // step: Name des Schritts (z.B. "DNS_PRÜFUNG", "REGISTER_AUFRUF", "ACCOUNT_ERSTELLUNG", "ORDER_ERSTELLUNG", "CHALLENGE_VALIDIERUNG", "ZERTIFIKAT_ERSTELLT") // status: "OK" oder "FAILED" // message: Fehlermeldung bei FAILED, leer bei OK func logCertStatus(traceID, fqdnID, step, status, message string) { if certLogger == nil { return } timestamp := time.Now().Format("2006-01-02 15:04:05") if status == "OK" { certLogger.Printf("[%s] TRACE_ID=%s FQDN_ID=%s VORGANG=%s STATUS=OK", timestamp, traceID, fqdnID, step) } else { certLogger.Printf("[%s] TRACE_ID=%s FQDN_ID=%s VORGANG=%s STATUS=FAILED ERROR=%s", timestamp, traceID, fqdnID, step, message) } } // closeCertLogger schließt die Log-Datei func closeCertLogger() { if certLogFile != nil { certLogFile.Close() } }