Wie kann ich mich anmelden, um eine bestimmte Datei in linux mit logger-Befehl?
Ich werde führen Sie das folgende Skript:
#!/bin/bash
./myprogram
#get exit code
exitvalue=$?
#log exit code value to /var/log/messages
logger -s "exit code of my program is " $exitvalue
Aber ich will nicht die log-Nachricht geschrieben werden, in /var/log/messages
weil ich nicht über root-Rechte verfügen. Stattdessen will ich es in eine Datei geschrieben werden in meinem home-Verzeichnis: /home/myuser/mylog
Wie sollte ich ändern logger
Befehl oben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass Sie wirklich brauchen (oder wollen) beinhalten
logger
/syslog
für diese. Ersetzen Sie einfach die Letzte Zeile des Skripts mit:syslog
(odersyslog-ng
oderrsyslog
, was version seiner distribution verwendet), die er nicht tun kann ohne root-Privilegien, Rollen Ihre eigenen, möglicherweise mit Hilfe von bestimmten Python/Java/whatever-Bibliotheken verfügbar sind, ist so ziemlich der einzige Weg, um die Protokolle in eine Datei, die du kontrollierst,...Ich denke, dass Ihr die bessere Wahl wäre, um die
date
Befehl dann eherlogger
in Fällen, in denen Sie nicht möchten, schreiben Sie an den syslog-Dateien (und nicht privs zu tun).Siehe "timestamp, bevor ein echo" für details zur Verwendung
date
Präfix eine Nachricht mit einem Datum und Schreibe es in eine Datei.Erstellen Sie ein bash-Funktion, die wie folgt aussieht, ist eine Anpassung der
date
format-string zu bekommen, was Sie wollen:In deinem bash-Skript, das Sie verwenden würden:
Denen die folgenden in Ihrem
${LOGFILE}
Datei:Kurze "offizielle" Antwort ist, dass Sie leider nicht.
Jedoch in den meisten Fällen (z.B. bei vielen Linux-Distributionen) kann man einfach nur Glück haben ein
logger
Implementierung, unterstützt sowohl die--no-act
option, und implementiert auch einige Nachricht, die Formatierung auf Ihre eigenen (siehe unten), in dem Fall können Sie einen (mäßig hässlich) - Befehl wie diesen zu setzen, a) eine ordnungsgemäß formatierte Nachricht, b) in einer Datei, c) nicht verschmutzen das system meldet:(Shout out an @BasileStarynkevitch, und @Kieveli, die beiden genannten Teile davon vor, nur eben nicht die ganze Geschichte.)
Hinweise:
1) passend Zu den üblichen log-Datei-format, musste ich "sed-off" der
<PRIVAL>
Feld (PRIVAL
=FACILITY
* 8 +PRIORITY
), hat vorangestellt, um die Ausgabe auf meinen Debian-Kisten. Ihre Laufleistung kann variieren.2) POSIX selbst hat nicht definieren, wie genau die
logger
Befehl behandeln sollen, (alle) seine Optionen. E. g. die GNU-logger nicht unterstützen--no-act
überhaupt.Auch, wenn die Buchung der ursprünglichen version dieser Antwort vor 2 Jahren,
-s
auf meinem system habe nicht tun, keine Formatierung der gedruckten Ausgabe, es ist nur ein echo des "raw message" - allein, dass es völlig nutzlos. (Ich habe nicht verwenden Systemd in dieser Zeit, die möglicherweise erklären, den Unterschied, sehen verschiedene bedingte Systemd-bezogene Aufrufe in der logger-source-code, aber das ist nur vage Vermutungen.)3) Der wahrscheinlichste Grund, warum die
logger
Befehl wurde so "historisch unfreundlich" für diese triviale use-case ist, dass es nur ein ziemlich einfaches frontend für den system-logger. Dies bedeutet, dass alles, was Sie zu füttern, um die es im Grunde geht rechts durch, umsyslogd
(odersystemd-journald
etc.), die wiederum macht alle möglichen anderen Weiterverarbeitung, und Versand (an verschiedenen Verkaufsstellen: Dateien, sockets, etc., sowohl lokale als auch remote), sowie die überbrückung von Berechtigungsstufen (also in deinem Beispiel könnte man sich dennoch anmelden, umsyslog
oderuser.log
, zum Beispiel, obwohl Sie möglicherweise keine Berechtigung zum schreiben in diese Dateien direkt).Für
logger
um in der Lage sein, ordnungsgemäß zu melden, um eine Datei direkt, wäre es entweder zu (re -) implementieren Sie einige von den Aufgaben des system-logger und diesyslog()
std. Bibliothek-Funktion, oder wäre es nicht viel mehr fähig als ein triviales echo one-liner (weniger Komplex, vielleicht sogar als die obenlogger
Aufruf! 😉 ). So oder so, das scheint wie eine schlechte Idee.Eine bessere Lösung sein könnte, wenn die POSIX-Schnittstelle (logger, syslog()) war in einer Weise anzugeben, die eine ad-hoc-outlet/facility parameter (wie z.B. ein Dateiname) zusammen mit der Nachricht, also könnte man sich anmelden, um benutzerdefinierte Dateien ohne Neukonfiguration des Systems (die normalen Benutzer verfügen nicht über die Berechtigung ohnehin tun).
Jedoch für den Mangel an etwas besser, die "kanonische" Linux
logger
Umsetzung tatsächlich scheint sich zu duplizieren einige der syslog-Funktionalität, so können die meisten von uns genießen Sie einfach diesen Luxus kostenlos. 😉Werden Sie brauchen, um Ihre syslog-Konfiguration, wenn Sie möchten, es zu melden, die Dinge an andere Orte. Sie konnte eine gewisse Anlage mit einer output-Datei in Ihrem home-Verzeichnis, zum Beispiel. Würden Sie müssen root sein, um das zu tun, obwohl.
Wenn Sie verwenden möchten
logger
so dass die Meldung erscheint im system protokolliert und in einer Datei von Ihnen, die Sie tun könnten,da die
-s
optionlogger
auch Ausgänge auf stderr, die umgeleitet wird, um die Datei mit2>
2>&1
leitet stderr nach stdout. Es wird nicht in eine Datei schreiben, es sei denn, Sie umleiten von stdout auf diese Datei zu. Leiten Sie beide mit> the_file 2>&1
oder, wenn Sie nicht möchten, zu speichern stdout, die Sie tun können2> the_file
. Ich werde Bearbeiten Sie die Antwort mit der letzteren.