kurmann / videoschnitt

Teilautomatisierung und Verwaltung für privaten Videoschnitt – das Kraftwerk für Familienfilme
Apache License 2.0
0 stars 0 forks source link

Log Rotation causes .NET application not starting at all #423

Closed kurmann closed 3 months ago

kurmann commented 3 months ago

image

kurmann commented 3 months ago

Lieber ChatGPT. Die Log-Rotation hat immer noch das Problem, das meine .NET-Anwendung einfach nicht mehr startet sobald die erste Rotation stattgefunden hat. Kann ich nicht auf andere Weise dafür sorgen, dass meine Logs nicht zu gross werden? Von mir aus gesehen, kann man die Logs jede Nacht leeren

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>com.swiss.kurmann.videoschnitt-FinalCutPro</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/patrickkurmann/bin/Kurmann/VideoschnittConsole/Kurmann.Videoschnitt.ConsoleApp</string>
      <string>--workflow</string>
      <string>FinalCutPro</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>StartOnMount</key>
    <false/>
    <key>WatchPaths</key>
    <array>
      <string>/Users/patrickkurmann/Movies/Final Cut Export/4K60</string>
      <string>/Users/patrickkurmann/Movies/Final Cut Export/4K30</string>
      <string>/Users/patrickkurmann/Movies/Zur Mediathek</string>
    </array>
    <key>StandardOutPath</key>
    <string>/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.FinalCutPro.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.FinalCutPro.error.log</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>ASPNETCORE_ENVIRONMENT</key>
      <string>Production</string>
      <key>MediaSetOrganizer__InputDirectory</key>
      <string>/Users/patrickkurmann/Movies/Zur Mediathek</string>
      <key>MediaSetOrganizer__FinalCutExportDirectory</key>
      <string>/Users/patrickkurmann/Movies/Final Cut Export</string>
      <key>MediaSetOrganizer__MediaSetPathLocal</key>
      <string>/Users/patrickkurmann/Movies/Mediensets</string>
    </dict>
  </dict>
</plist>

Um zu verhindern, dass die Logs zu groß werden, ohne die Log-Dateien zu rotieren und ohne deine .NET-Anwendung neu zu starten, kannst du ein einfaches Skript verwenden, das die Log-Dateien jede Nacht leert. Dabei bleibt die Anwendung aktiv und die Logs werden auf eine kontrollierte Weise verwaltet.

Hier ist ein Schritt-für-Schritt-Ansatz:

  1. Erstelle ein Shell-Skript, um die Log-Dateien zu leeren:

    Erstelle ein Skript namens clear_logs.sh im gewünschten Verzeichnis. Zum Beispiel im Home-Verzeichnis:

    nano ~/clear_logs.sh
  2. Füge den folgenden Inhalt in das Skript ein:

    #!/bin/bash
    
    # Liste der Log-Dateien
    log_files=(
       "/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.FinalCutPro.log"
       "/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.FinalCutPro.error.log"
       "/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.InfuseMediaLibrary.log"
       "/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.InfuseMediaLibrary.error.log"
       "/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.MediaSetIndex.log"
       "/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.MediaSetIndex.error.log"
       "/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.MetadataXml.log"
       "/Users/patrickkurmann/Library/Logs/kurmann-videoschnitt.MetadataXml.error.log"
    )
    
    # Leere jede Log-Datei
    for log_file in "${log_files[@]}"
    do
       : > "$log_file"
    done
    
    echo "Log-Dateien wurden geleert."
  3. Speichere das Skript und mache es ausführbar:

    Speichere die Datei in nano mit Ctrl + O und schließe sie mit Ctrl + X. Mache das Skript dann ausführbar:

    chmod +x ~/clear_logs.sh
  4. Erstelle eine LaunchAgent plist-Datei, um das Skript jede Nacht auszuführen:

    Erstelle eine neue plist-Datei im Verzeichnis ~/Library/LaunchAgents. Zum Beispiel:

    nano ~/Library/LaunchAgents/com.swiss.kurmann.clearlogs.plist
  5. Füge den folgenden Inhalt in die plist-Datei ein:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
     <dict>
       <key>Label</key>
       <string>com.swiss.kurmann.clearlogs</string>
       <key>ProgramArguments</key>
       <array>
         <string>/Users/patrickkurmann/clear_logs.sh</string>
       </array>
       <key>StartCalendarInterval</key>
       <dict>
         <key>Hour</key>
         <integer>0</integer>
         <key>Minute</key>
         <integer>0</integer>
       </dict>
       <key>RunAtLoad</key>
       <true/>
     </dict>
    </plist>
  6. Lade den LaunchAgent neu:

    Lade den neuen LaunchAgent:

    launchctl load ~/Library/LaunchAgents/com.swiss.kurmann.clearlogs.plist

    Um sicherzustellen, dass der LaunchAgent bei jedem Start des Systems geladen wird, kannst du dies mit dem folgenden Befehl überprüfen:

    launchctl list | grep com.swiss.kurmann.clearlogs
  7. Testen des Skripts:

    Teste das Skript manuell, um sicherzustellen, dass es wie erwartet funktioniert:

    ~/clear_logs.sh

Dieser Ansatz stellt sicher, dass die Log-Dateien jede Nacht geleert werden, ohne dass deine .NET-Anwendung neu gestartet oder unterbrochen wird. Die Logs werden einfach auf eine kontrollierte Weise verwaltet, und du musst dir keine Sorgen machen, dass sie zu groß werden.

kurmann commented 3 months ago

(...)

Die Fehlermeldungen Permission denied weisen darauf hin, dass das Skript nicht die erforderlichen Berechtigungen hat, um die Log-Dateien zu ändern. Um diese Berechtigungen zu erhalten, kannst du das Skript mit sudo ausführen oder die Berechtigungen der Log-Dateien so ändern, dass dein Benutzer darauf zugreifen kann.

Hier sind die Schritte, um das Skript mit sudo auszuführen:

  1. Aktualisiere das Skript, um mit sudo ausgeführt zu werden:

    Da du das Skript manuell oder über einen LaunchAgent ausführen wirst, kannst du sicherstellen, dass es mit den erforderlichen Berechtigungen ausgeführt wird.

  2. Das Skript ausführen:

    Führe das Skript manuell mit sudo aus:

    sudo ~/clear_logs.sh
  3. LaunchAgent mit sudo einrichten:

    Passe den LaunchAgent an, um das Skript mit sudo auszuführen. Dies ist jedoch nicht direkt möglich, da sudo in diesem Kontext nicht funktioniert. Stattdessen kannst du einen Wrapper verwenden, der das Skript mit sudo ausführt.

    Erstelle einen neuen Wrapper für das Skript:

    nano ~/clear_logs_wrapper.sh

    Füge den folgenden Inhalt in den Wrapper ein:

    #!/bin/bash
    sudo /Users/patrickkurmann/clear_logs.sh

    Speichere die Datei und mache sie ausführbar:

    chmod +x ~/clear_logs_wrapper.sh

    Passe den LaunchAgent an, um den Wrapper auszuführen:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
     <dict>
       <key>Label</key>
       <string>com.swiss.kurmann.clearlogs</string>
       <key>ProgramArguments</key>
       <array>
         <string>/Users/patrickkurmann/clear_logs_wrapper.sh</string>
       </array>
       <key>StartCalendarInterval</key>
       <dict>
         <key>Hour</key>
         <integer>0</integer>
         <key>Minute</key>
         <integer>0</integer>
       </dict>
       <key>RunAtLoad</key>
       <true/>
     </dict>
    </plist>
  4. Lade den LaunchAgent neu:

    Lade den neuen LaunchAgent:

    launchctl load ~/Library/LaunchAgents/com.swiss.kurmann.clearlogs.plist

Hinweis: Die Verwendung von sudo in einem Skript, das regelmäßig ausgeführt wird, kann ein Sicherheitsrisiko darstellen. Eine alternative Lösung besteht darin, die Berechtigungen der Log-Dateien so zu ändern, dass der Benutzer darauf zugreifen kann.

Alternative Lösung: Berechtigungen ändern

  1. Ändere die Berechtigungen der Log-Dateien:

    sudo chmod 644 /Users/patrickkurmann/Library/Logs/kurmann-videoschnitt*.log

    Dies gibt deinem Benutzer Lese- und Schreibrechte für die Log-Dateien.

  2. Führe das Skript erneut aus:

    ~/clear_logs.sh

Damit sollte dein Skript in der Lage sein, die Log-Dateien zu leeren, ohne auf Berechtigungsprobleme zu stoßen.


Jetzt ist es mir zu komplex. Das kann doch nicht sein ein anständiges Log hinzukriegen. Ich ändere die Strategie und lasse die Log-Datei von .NET erstellen