Elegante Logging-Lösung gesucht

Hi Leute,

auf meinem PG-Server laufen mehrere PG-Instanzen in unterschiedlichen Versionen.
Die Log-Files habe ich so konfiguriert, dass diese nach /var/log/pgsql/postgres-$VERSION.log geschrieben werden.
Logrotate übernimmt dann täglich die Rotierung und komprimiert die alten Logs.

Klappt hervorragend.

Jetzt wollte ich mir mit Hilfe des pgAdmins den Server-Status anzeigen lassen, meckert dieses blöde Programm rum, dass der Logdatei-Name nicht dem Standard-Format entspricht. Irgendetwas mit postgresql-%Y-%m-%d. Dieses Format kann ich Logrotate nur nicht beibringen.
Jetzt unterstützt zwar PostgreSQL seinerseits auch eine Logrotierung, jedoch werden die rotierten Logs dabei nicht komprimiert und erst recht nicht nach einem Zeitraum x gelöscht.

Habt ihr eine elegante Lösung, wie ich einerseits das AdminPack zum Laufen bekomme und andererseits die rotierten Logs komprimiert für x Tage aufgehoben werden, oder muss ich das Logroate-Rad nochmal erfinden?

VG

Hallo,

zuerst einmal ist die Limitierung leider nicht von pgadmin, sondern von Postgresql selbst. PgAdmin ruft hier die Funktion pg_logdir_ls auf. Kannst du in deiner DB via psql testen;

# SELECT pg_logdir_ls();
ERROR:  the log_filename parameter must equal 'postgresql-%Y-%m-%d_%H%M%S.log'

Wenn du also pgAdmin nutzen möchtest, kommst du hier nicht drumherum das Format zu ändern.
Hier gibt es auch keine ganz so einfache Lösung. Ich hab grad keine Zeit hier groß zu ergründen, ob man das mit Logrotate direkt abbilden kann.

Mein Vorschlag wäre hier eventuell ein Cronjob, welcher z.B. Dateien älter 1 Tag packt und älter 5 Tage löscht.
Der Einfachheit halber solltest du das aber in ein “ph_log_cleanup”-Skript packen und das dann via Cron aufrufen.

Zusatz in Postgresql.conf:

# das aktuelle Logfile darf maximal 1 Tag alt sein, dann wird ein neues angelegt
log_rotation_age=1440

Das du hier pro Instanz einen eigenen LogOrdner anlegen müsstet, versteht sich ja von selbst.
Das ist zumindest meine erste Idee. Wenn mir noch was besseres einfällt geb ich dir nochmal Bescheid, aber hier solltest du abwägen, ob ein “less $log” nicht sinnvoller ist, als hier alles umzustellen :slight_smile:

Hey,

dann entschuldige ich mich gleich mal bei den Programmierern von pgAdmin.
Dennoch ist es für mich nicht nachvollziehbar, warum man eine Konfig-Variable zur Verfügung stellt und irgendwo anders im Code hart codiert wird.

Ich habe gerade gesehen, dass Logrotate auch Wildcards unterstützt. Vielleicht bekomme ich das darüber hin.
Ansonsten wirds ein Cron-Job, wie du vorgeschlagen hast. Dürfte auch nicht großartig kompliziert sein, ich wollte halt nur auf etablierte Tools zurückgreifen. Würde die Dokumentation ja auch vereinfachen.

Vielen Dank für deine schnelle Hilfe :slight_smile:

VG

Hallo,

ja, logrotate unterstützt auch wildcards, allerdings weiss ich nicht, inwiefern dir das hier weiterhilft, Wenn du hier eine Lösung findest, wäre es nett, wenn du das hier mal posten könntest.
Das Cronskript ist hier tatsächlich nicht allzu schwierig. könnte ähnlich aussehen wie folgt:

#!/bin/bash

logdir=/var/lib/pgsql/blabla/log
keep_days=14

# Packe alle logdateien unterhalb dieses Ordners (inkl. Unterordner für die Instanzen) und packe alle, die älter als 24h sind
find ${logdir} -type f -name "*.log" -mtime +0 -exec gzip {}\;

# Lösche alle Dateien älter als $keep_days
find ${logdir} -type f -mtime +${keepdays} -delete

Das kannst in die /etc/cron.daily oder wo auch immer eintragen, dann könnte das eigentlich passen. Natürlich ohne Gewähr, das ist jetzt mal so aus dem Kopf schnell dahingeschrieben :wink:

Ich löse es über ein eigenes Bash-Skript, welches dann täglich einfach ausgeführt wird.

Danke für den find-Parameter “-delete”, ich hatte das bisher immer mit “-exec rm {} ;” gelöst. So ist das natürlich eleganter.

Die Wildcards in Logrotate bringen mir, wie bereits von dir vermutet, gar nichts. Das würde dann ja auch die aktuelle Logdatei treffen, weil es keine Option “nur Datei älter als x Tage” gibt.