Gibt es in tmux ein Äquivalent zu GNU Screens "log" -Befehl?

35

Ich verwende den Befehl "log" des Bildschirms in großem Umfang, um die Ausgabe einer Sitzung in einer Datei zu protokollieren, wenn ich Änderungen in einer bestimmten Umgebung vornehme. Ich habe die Manpage von tmux durchsucht, aber keine Entsprechung gefunden. Kennt jemand eine ähnliche Funktion in tmux oder muss ich dafür eigene Wrapper-Skripte schreiben?

BEARBEITEN: Mir sind Skripte und andere Hilfsprogramme bekannt, mit denen ich eine Sitzung protokollieren kann. Der Grund, warum die Funktionalität des Bildschirms so nützlich ist, ist die Möglichkeit, eine Protokolldateivariable zu definieren, die Zeichenfolgen-Escape-Zeichen verwendet, um jede Sitzung eindeutig zu identifizieren.

ZB habe ich eine Shell-Funktion, die unter Angabe eines Hostnamens in einem neuen Bildschirmfenster SSH für diesen Host ausführt und den Fenstertitel auf den Hostnamen setzt. Wenn ich ein Protokoll dieser Sitzung starte, wird der Fenstertitel vorangestellt.

Wenn diese Funktion in tmux nicht vorhanden ist, muss ein neuer Satz von Shell-Funktionen erstellt werden, um "Skripte" für Sitzungen einzurichten, die ich protokollieren möchte. Dies ist nicht sehr schwierig, aber es lohnt sich möglicherweise nicht, da der Bildschirm genau das tut, was ich bereits brauche.

Murali Suriar
quelle

Antworten:

39

Lassen Sie mich sehen, ob ich Ihre Bildschirmkonfiguration richtig entschlüsselt habe :

  • Sie verwenden so etwas wie logfile "%t-screen.log"(wahrscheinlich in einer .screenrcDatei), um den Namen der Protokolldatei zu konfigurieren, die später gestartet wird.
  • Sie verwenden den title <hostname>(Ca A) Bildschirm Befehl , um den Titel ein neuen Fenster zu setzen, oder
    Sie tun screen -t <hostname> ssh0 <hostname>eine neue Bildschirm - Sitzung zu starten.
  • Mit dem Bildschirmbefehl Ca H (Ca: log) können Sie die Protokollierung auf die konfigurierte Datei umschalten.

Wenn ja, dann ist es fast gleichwertig (setzt voraus, dass tmux 1.3+ #W im pipe-paneShell-Befehl unterstützt; pipe-paneist in tmux 1.0+ verfügbar ):

  • In einer Konfigurationsdatei (zB .tmux.conf):

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • Verwendung tmux rename-window <hostname>(Cb,) ein vorhandenes Fenster umbenennen, oder
    verwenden Sie tmux new-window -n <hostname> 'ssh <hostname>'eine neue starten tmux Fenster oder
    Verwendung tmux new-session -n <hostname> 'ssh <hostname>'eine neue starten tmux Sitzung.
  • Verwenden Sie Cb H, um die Protokollierung umzuschalten.

Es wird keine Benachrichtigung angezeigt, dass das Protokoll umgeschaltet wurde. Sie können jedoch ein Protokoll hinzufügen, wenn Sie dies wünschen:

bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'" \; display-message 'Toggled logging to $HOME/#W-tmux.log'

Hinweis: Die obige Zeile wird so angezeigt, als befände sie sich in einer Konfigurationsdatei (entweder Sie .tmux.confoder Sie source). tmux muss sowohl den Backslash als auch das Semikolon sehen. Wenn Sie dies aus einer Shell heraus konfigurieren möchten (z. B. tmux bind-key …), müssen Sie beide Zeichen mit einem Escape-Zeichen versehen oder in Anführungszeichen setzen, damit sie intakt an tmux übergeben werden . Es scheint keine bequeme Möglichkeit zu geben, verschiedene Nachrichten zum Ein- und Ausschalten anzuzeigen, wenn nur eine einzige Bindung verwendet wird (Sie können möglicherweise etwas aufbauen if-shell, aber es wäre wahrscheinlich hässlich). Wenn zwei Bindungen zulässig sind, versuchen Sie Folgendes:

bind-key H pipe-pane "exec cat >>$HOME/'#W-tmux.log'" \; display-message 'Started logging to $HOME/#W-tmux.log'
bind-key h pipe-pane \; display-message 'Ended logging to $HOME/#W-tmux.log'
Chris Johnsen
quelle
Nett! Das scheint ziemlich genau das zu tun, was ich brauche.
Murali Suriar
Hrrm. Wenn Sie versuchen, dies von der Shell aus zu tun, ergeben sich einige Probleme. Irgendwelche Vorschläge, wie man es schafft, die gesamte Leitung intakt an tmux zu übergeben? "
Murali Suriar,
2
@KamilDziedzic: Sie könnten versuchen, einen tmux pipe-pane …Befehl in Ihr Kommando aufzunehmen default-command(dh bevor Sie eine Shell starten). Das würde natürlich nur für "Standard" -Bereiche funktionieren (nichts begann mit expliziten Befehlen, z new-window sqlite3. B. ). Es gab Hinweise darauf, dass "Hook" -Unterstützung in einer zukünftigen Version von tmux landen könnte . Dies kann dazu führen, dass Sie einen Befehl konfigurieren (z. B. pipe-pane …), der nach einem anderen Befehl automatisch ausgeführt new-sessionwird new-window, oder split-pane).
Chris Johnsen
1
@sebelk: Wenn Sie eine einzelne Zeile als „Eintrag“ betrachten, können Sie eine Shell verwenden readund datediese anordnen. ZBbind-key H pipe-pane -o 'exec bash -c "while IFS= read -r line; do echo \"\$(date +%%Y%%m%%dT%%H%%M%%SZ%%z): \$line\"; done" >>$HOME/"#W-tmux.log"'
Chris Johnsen
1
@ChrisJohnsen, ... das könnte weitaus effizienter sein, wenn wir wüssten, dass bash 4.1 oder neuer ist - das Starten einer Subshell, um eine neue Kopie datefür jede Ausgabezeile zu erstellen, wird ein schwerwiegender Leistungseinbruch sein! Viel besser zu printf '%(%Y%m%dT%H%M%S)T: %s\n' "$line"(Escape-Zeichen, wenn dies für die Aufnahme in eine tmux-Konfigurationsdatei erforderlich ist, wodurch %sdas "s vermutlich verdoppelt und escape-Zeichen verwendet werden ).
Charles Duffy
5

Hier ist ein tmux-Plugin, mit dem Sie sich anmelden können, ohne sich mit Tastenkombinationen herumschlagen zu müssen .tmux.conf:

https://github.com/tmux-plugins/tmux-logging

Eigenschaften:

  • prefix + PSchaltet die Fensterprotokollierung um. Die Ausgabe wird von unerwünschten ANSI-Zeichen gelöscht!
  • prefix + Alt + P Speichert den vollständigen Fensterverlauf in einer Datei

quelle
4

Nachdem ich die Dokumentation für tmux durchgesehen habe, kann ich keine Entsprechung der Fensterprotokollierung des Bildschirms finden. Es sieht so aus, als müssten Sie Ihre Shell-Funktionen verwenden, um das zu tun, was Sie möchten, oder einfach nur den Bildschirm verwenden. Sie können das Debuggen aktivieren, bei dem sowohl die Server- als auch die Client-Seite protokolliert werden, es enthält jedoch auch viele externe tmux-bezogene Protokolle, sodass es nicht genau das ist, wonach Sie fragen.

Sie könnten möglicherweise die Zwischenablage von tmux verwenden, um das Speichern des Puffers in einer anderen Sitzung zu automatisieren, die so eingerichtet ist, dass sie den Inhalt der Zwischenablage akzeptiert und in einer Datei speichert. Das scheint irgendwie hackisch.

jsbillings
quelle
1
Das war auch meine Schlussfolgerung. Ich habe mich entschlossen, vorerst beim Bildschirm zu bleiben, was eine Schande ist, da tmux, abgesehen von diesem Versehen, ziemlich nett zu sein scheint.
Murali Suriar
1

Ich mache es mit Skript, das ist aus meiner tmux.conf-Datei

bind ^C new-window "script -f /home/jcosta/mydocs/work/logs/$(date '+%d%m%Y_%H%M%S')_$$.log"
bind c new-window "script -f /home/jcosta/mydocs/work/logs/$( date '+%d%m%Y_%H%M%S')_$$.log"
bind | split-window "script -f /home/jcosta/mydocs/work/logs/$(date '+%d%m%Y_%H%M%S')_$$.log"
0xC0000022L
quelle
1
Ein schlechter Ersatz für den logBefehl des Bildschirms , der die sofortige Protokollierung ermöglicht. Wenn Sie sich jedoch in tmux befinden und die Bildschirmprotokollierung verwenden möchten, müssen Sie trotzdem eine neue Shell starten.
Arcege