Wie kann ich das Schreiben in Protokolldateien reduzieren?

9

Eine häufige Sorge von Raspberry Pi-Benutzern ist die Abnutzung und Zerstörung ihrer SD-Karte (die begrenzte Schreibzyklen aufweist) durch zu viele Schreibvorgänge. Die von den Benutzern gemeldeten Erfahrungen stützen diese Annahme.

Die Protokollierung ist eine Quelle für häufigen Schreibzugriff.

Es stellt sich also die Frage, wie dies bei Raspbian reduziert werden kann.

Frank Breitling
quelle
2
Sie können den Speicherort der Protokolldateien auf ein externes Laufwerk oder Flash-Laufwerk verschieben, aber IMO sind diese Bedenken übertrieben.
Steve Robillard
3
"Die von den Benutzern gemeldeten Erfahrungen stützen diese Annahme." -> Nur wenn sie keinen Grund haben. Das Internet ist voll von hysterischen Berichten hysterischer Menschen. Bigfoot! UFOs! Die Protokollierung hat meine SD-Karte zerstört! Bitte sehen Sie unix.stackexchange.com/a/84905/25985
Goldlöckchen
3
Für mich als jemanden, der oft am Stecker zieht, ist es wichtiger zu wissen, dass nichts auf die SD-Karte schreibt, wenn ich am Kabel ziehe.
Joan
3
@SteveRobillard @goldilocks Mehr als zu viele Schreibvorgänge ist der unerwartete Stromausfall. Dies ist möglicherweise nicht die Ursache shutdown nowfür SD- Schäden, aber für den Fall, dass ich immer eine und keine SD-Beschädigungen mehr mache .
fcm
2
Ich bin damit einverstanden, dass es hyperbolisch ist - aber ich denke, das ist explizit. Dieser Estrich ist ein Antitoxin. Der Punkt ist, dass sich die überwiegende Mehrheit der Benutzer darüber keine Sorgen machen muss. Leute sollten es nicht für gut und normal halten, mit einem vollständig gefüllten Root-Dateisystem auf einem Pi, ihrem Laptop, einem Inet-Server usw. zu arbeiten. Standardmäßig sind ext fs 5% für die Root-Verwendung vorgesehen, um dem entgegenzuwirken. Sie sprechen also wirklich von Eckfällen , und das Rindfleisch, das ich hier habe, ist, dass Sie es so präsentiert haben, als ob es von jedem selbstbewussten Bürger als Problem betrachtet werden sollte. Nein, sollte es nicht.
Goldlöckchen

Antworten:

11

Wenn Sie nicht an den Protokollen interessiert sind, können Sie mithilfe einer Protokollkonfigurationseinstellung viel ausschalten.

Bearbeiten Sie die Datei /etc/rsyslog.confund direkt nach dem Start des Abschnitts

###############
#### RULES ####
###############

Fügen Sie die folgende Zeile hinzu.

*.*     ~

Wenn Sie feinkörniger sein möchten, müssen Sie die Dateikommentare lesen.

Vergessen Sie nicht, den rsyslog-Daemon neu zu starten:

sudo service rsyslog restart
joan
quelle
Einfache und saubere Lösung. Ich habe alles kommentiert, was in / var / out schreibt. Es sollte funktionieren.
Fusseldieb
Aber ich interessiere mich für die Protokolle. Sie sind sehr wichtig, um Probleme des Systems zu finden!
Frank Breitling
3
Wenn Sie an Protokollen interessiert sind, gibt es viele Möglichkeiten, diese beizubehalten. Vermeiden Sie jedoch SD-Schreibvorgänge. Senden Sie die Protokolle an / dev / shm (RAM), führen Sie dann alle 300 Sekunden die Protokollierung aus und senden Sie die Protokolle an Amazon S3. Oder Dropbox. Denken Sie daran, dass Protokolle einen BEGRENZTEN Wert haben, der mit der Zeit abnimmt. Sie brauchen oft nur wirklich aktuelle, aktuelle Protokolle ...
Scott Prive
9

Meine Lösung für Raspbian 8.0 (Jessie) basiert auf der Protokollierung im RAM

Hierfür gibt es bereits das Ramlog Debian-Paket und Installationsanweisungen . Dies hat jedoch bei mir nicht funktioniert (Starten von ramlog-tmpfs 2.0.0: Fehler: / var / log wird verwendet ... [fehlgeschlagen]).

Mit habe iotop -bktoqqqich den häufigsten Schreibzugriff herausgefunden. Es stellt sich heraus, dass auch / var / cache / samba / häufig beschrieben wird. Dies muss also zusätzlich zu / var / tmp /, wo sich die neuen Protokolldateien befinden, auch in den Arbeitsspeicher gehen.

1. Erstellen Sie die Ramdisk

Also müssen zuerst diese beiden Einträge hinzugefügt werden zu /etc/fstab:

tmpfs           /var/tmp        tmpfs   size=10M,nodev,nosuid     0       0
tmpfs           /var/cache/samba tmpfs   size=5M,nodev,nosuid     0       0

2. Das log2disk-Skript

Wir müssen dieses Skript speichern, in /usr/local/bin/log2diskdem der Inhalt aller Protokolldateien /var/tmp/log/an die Dateien in angehängt und gelöscht wird /var/log/.

#!/bin/sh

# Author: Frank Breitling <[email protected]>
DESC="Moving contents from /var/tmp/log/ to /var/log/"

if [ $(id -u) -ne 0 ]
then echo "Please run as root"
     exit
fi

echo $DESC

exec >>/var/log/log2disk.log 2>&1

date
cd /var/tmp/

for i in log/*; do
    basename $i
    cat $i >>/var/$i
    >$i
done

und machen es ausführbar sudo chmod +x /usr/local/bin/log2disk.

3. Hinzufügen zu crontab

Wir möchten dieses Skript alle 3 Stunden ausführen und diese Zeile dem System hinzufügen /etc/crontab

10 */3  * * *   root    /usr/local/bin/log2disk

(Vergessen Sie nicht eine letzte Zeile, die von crontab benötigt wird.)

4. Installieren Sie den log2disk.service

Wir müssen einen systemd-Dienst erstellen /lib/systemd/system/log2disk.service, der dieses Skript vor dem Herunterfahren und Neustarten ausführt, damit der Inhalt der Protokolldatei erhalten bleibt:

[Unit]
Description=Write log files to disk
RequiresMountsFor=/
Before=rsyslog.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/bin/log2disk

[Install]
WantedBy=multi-user.target

und installieren Sie es mit sudo systemctl enable log2disk.

5. Auswahl der Protokolldateien für RAM

Jetzt können wir feststellen, /etc/rsyslog.confwelche Protokolldateien im RAM aufbewahrt werden sollen. Diese Dateien sind auth.log, syslog, daemon.log, user.log and messagesund wir ersetzen für jeden ihrer Einträge den log/Pfad tmp/log/wie folgt :

auth,authpriv.*                 /var/tmp/log/auth.log

Erledigt!

Nach einem Neustart protokolliert das System nun die häufigsten Protokolleinträge bei /var/tmp/logund synchronisiert sie alle 3 Stunden und vor dem Herunterfahren wieder.

Wir können iotopwieder verwenden, um eine deutlich reduzierte Schreibaktivität zu finden. Wir sollten uns jedoch keine Sorgen machen, dass die grüne ACT-LED blinkt . Anscheinend ist dies keine gute Anzeige für den Schreibzugriff.

Frank Breitling
quelle
2
"Ich habe die folgende Lösung für Raspbian 8.0 (Jessie) ausgearbeitet, basierend auf der Idee, sich bei RAM anzumelden." -> Da Jessie systembasiert ist, sind es bereits einige optimierte Konfigurationszeilen über journald entfernt. Schauen Sie sich das an man journald.confund notieren Sie es Storage=volatileusw. Dann deaktivieren Sie einfach rsyslog (es wird jetzt sowieso von journald gespeist) und presto, RAM-basierte Protokollierung mit vielen Schnickschnack und Anpassungsoptionen. Ohne viel Aufhebens.
Goldlöckchen
@goldilocks Ich frage mich, wie dies nützlich sein könnte, um einen solchen Protokolldateipuffer zu erstellen, den ich erstellt habe.
Frank Breitling
Ich bin mir nicht sicher was du meinst. TBH Ich bin kein Fan von Journald (hauptsächlich wegen des Binärformats), und der Grund, warum ich so viel darüber weiß, ist, was ich damit mache - deaktiviere die Protokollierung auf der Festplatte (und überlasse das rsyslog) und Geben Sie ihm eine bescheidene Menge an RAM, um ihn als Puffer zu verwenden. Wenn Sie meinen, es regelmäßig auf die Festplatte zu spülen, verstehe ich nicht, warum nicht.
Goldlöckchen
@goldilocks Wie dann?
Frank Breitling
Wenn Sie es noch nie benutzt haben, sollten Sie es sich ansehen man journalctl. Wie ich schon sagte, ich bin ein altmodischer Syslog-Typ, aber ich merke, dass es einen -s --sinceSchalter gibt; Dann müssen Sie es nur noch dazu bringen, es auf eine Weise zu sichern, die für die Umleitung in eine Datei geeignet ist (dies ist möglicherweise nicht standardmäßig der Fall ... wenn Sie ein wenig herumspielen, erhalten Sie das Bild).
Goldlöckchen
2

Um dies zu umgehen, installiere ich mein Stammverzeichnis auf einem USB-Stick anstelle der SD-Karte. Ich benutze die SD-Karte nur zum Booten.

Auf diese Weise muss ich mir keine Gedanken über das Schreiben auf meine SD-Karte machen.

Ich benutze Berryboot, um dies zu erreichen.

CoderX
quelle
0

Um die Schreibvorgänge für Protokolldateien auf dem RPi zu reduzieren, können Sie einen zentralen Protokollserver mit rsyslog einrichten. Wenn Sie die Einträge behalten möchten, senden Sie die Nachrichten einfach an den Remote-Protokollserver, andernfalls an / dev / null.

Fabian
quelle
0

Anstatt die Datei rsyslog.conf zu bearbeiten, können Sie den Dienst einfach beenden, wenn Sie alle Protokolle entfernen möchten.

sudo service rsyslog stop

Dann können Sie es beim Booten deaktivieren:

sudo systemctl disable rsyslog

um es beim Booten wieder zu aktivieren:

sudo systemctl enable rsyslog
Nick Maler
quelle
2
Damit wird jedoch die gesamte Protokollierung gestoppt.
RalfFriedl
1
Sie haben vergessen, den Befehlen ein Präfix voranzustellen sudo. Wenn Sie verwenden systemctl, sollten Sie es auch verwenden, um einen Dienst mit zu stoppen sudo systemctl stop rsyslog.service.
Ingo
Sehr gutes Feedback. Ich habe diese Antwort aktualisiert, um diese beiden Kommentare wiederzugeben.
Nick Painter
Übrigens, wenn Sie die Antwort eines anderen kopieren, ist es normalerweise höflich, darauf zu verweisen. Hier mache ich das für Sie: stackoverflow.com/a/32553762/4453048
RowanPD