Apakah ada yang setara dengan perintah "log" Layar GNU di tmux?

35

Saya banyak menggunakan perintah "log" layar untuk mencatat output sesi ke file, ketika saya membuat perubahan di lingkungan tertentu. Saya mencari melalui halaman manual tmux, tetapi tidak dapat menemukan yang setara. Adakah yang mengetahui fitur serupa di tmux, atau apakah saya harus menulis skrip pembungkus saya sendiri untuk melakukan ini?

EDIT: Saya mengetahui 'skrip' dan utilitas lain yang memungkinkan saya mencatat sesi. Alasan fungsionalitas layar sangat berguna adalah kemampuan untuk mendefinisikan variabel logfile yang menggunakan string lolos untuk mengidentifikasi secara unik setiap sesi.

misalnya saya memiliki fungsi shell yang, diberi nama host, akan SSH ke host itu di jendela layar baru dan mengatur judul jendela ke nama host. Ketika saya memulai log sesi itu, diawali dengan judul jendela.

Jika fungsi ini tidak ada di tmux, saya harus membuat serangkaian fungsi shell baru untuk mengatur 'skrip' sesi yang ingin saya log. Ini tidak terlalu sulit, tetapi mungkin tidak sepadan dengan usaha yang diberikan layar yang sudah tepat seperti yang saya butuhkan.

Murali Suriar
sumber

Jawaban:

39

Biarkan saya melihat apakah saya telah menguraikan konfigurasi layar Anda dengan benar:

  • Anda menggunakan sesuatu seperti logfile "%t-screen.log"(mungkin dalam .screenrcfile) untuk mengkonfigurasi nama file log yang akan dimulai nanti.
  • Anda menggunakan perintah layartitle <hostname> (Ca A) untuk mengatur judul jendela baru, atau Anda lakukan untuk memulai sesi layar baru.
    screen -t <hostname> ssh0 <hostname>
  • Anda menggunakan perintah layar Ca H (Ca: log) untuk beralih logging ke file yang dikonfigurasi.

Jika demikian, maka hampir setara (memerlukan tmux 1.3+ untuk mendukung #W dalam pipe-paneperintah shell; pipe-panetersedia di tmux 1.0+):

  • Dalam file konfigurasi (mis. .tmux.conf):

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • Gunakan tmux rename-window <hostname>(Cb,) untuk mengubah nama jendela yang ada, atau
    gunakan tmux new-window -n <hostname> 'ssh <hostname>'untuk memulai jendela tmux baru , atau
    gunakan tmux new-session -n <hostname> 'ssh <hostname>'untuk memulai sesi tmux baru .
  • Gunakan Cb H untuk mengaktifkan logging.

Tidak ada pemberitahuan bahwa log telah diaktifkan, tetapi Anda dapat menambahkannya jika Anda mau:

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

Catatan: Baris di atas ditampilkan seolah-olah berada di file konfigurasi (salah .tmux.confsatu atau Anda source). tmux perlu melihat garis miring terbalik dan titik koma; jika Anda ingin mengonfigurasi ini dari shell (mis. tmux bind-key …), maka Anda harus melarikan diri atau mengutip kedua karakter dengan tepat sehingga mereka dikirim ke tmux utuh. Tampaknya tidak ada cara yang mudah untuk menampilkan pesan yang berbeda untuk mengaktifkan / menonaktifkan ketika hanya menggunakan pengikatan tunggal (Anda mungkin dapat memperbaiki sesuatu dengan if-shell, tetapi mungkin akan jelek). Jika dua binding dapat diterima, maka coba ini:

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
sumber
Bagus! Itu terlihat melakukan persis apa yang saya butuhkan.
Murali Suriar
Hrrm. Jadi berusaha melakukan ini dari shell menghasilkan beberapa masalah. Ada saran tentang bagaimana mengelola melewati seluruh baris ke tmux utuh? "
Murali Suriar
2
@KamilDziedzic: Anda dapat mencoba memasukkan tmux pipe-pane …perintah di default-command(misalnya sebelum memulai shell); tentu saja itu hanya akan berfungsi untuk panel "default" (tidak ada yang dimulai dengan perintah eksplisit, misalnya new-window sqlite3). Ada petunjuk bahwa dukungan "hook" mungkin masuk dalam beberapa versi tmux di masa depan ; ini mungkin membiarkan Anda mengkonfigurasi perintah (misalnya pipe-pane …) secara otomatis dijalankan setelah beberapa perintah lainnya new-session, new-windowatau split-pane).
Chris Johnsen
1
@sebelk: Jika Anda menganggap satu baris sebagai "entri" maka Anda dapat menggunakan shell readdan dateuntuk mengaturnya. Misalnyabind-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, ... itu bisa menjadi jauh lebih efisien jika kita tahu bash 4.1 atau lebih baru - menelurkan subkulit untuk menjalankan salinan baru dateuntuk setiap baris output akan menjadi hit kinerja yang serius! Jauh lebih baik untuk printf '%(%Y%m%dT%H%M%S)T: %s\n' "$line"(melarikan diri seperlunya untuk dimasukkan dalam file konfigurasi tmux, sehingga mungkin menggandakan %sdan melarikan diri dari "s).
Charles Duffy
5

Berikut adalah plugin tmux yang memungkinkan logging tanpa mengacaukan binding utama di .tmux.conf:

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

Fitur:

  • prefix + Pmatikan pane logging. Output dihapus dari karakter ANSI yang tidak diinginkan!
  • prefix + Alt + P menyimpan riwayat panel lengkap ke file

sumber
4

Setelah melihat dokumentasi untuk tmux, saya tidak dapat menemukan yang setara dengan pencatatan jendela layar. Sepertinya Anda harus menggunakan fungsi shell Anda untuk melakukan apa yang Anda suka, atau cukup gunakan layar. Anda dapat mengaktifkan debugging, yang mencatat baik sisi server dan klien, tetapi juga mencakup banyak log terkait tmux yang tidak berhubungan juga, sehingga tidak persis seperti yang Anda minta.

Anda mungkin dapat menggunakan clipboard tmux untuk secara otomatis menyimpan buffer ke sesi lain, yang akan diatur untuk menerima konten clipboard dan menyimpan ke file. Ini sepertinya jenis peretasan.

jsbillings
sumber
1
Itu juga kesimpulan saya. Saya telah memutuskan untuk tetap menggunakan layar untuk saat ini, yang memalukan, karena selain pengawasan ini, tmux tampaknya cukup bagus.
Murali Suriar
1

saya melakukannya menggunakan skrip, ini dari file tmux.conf saya

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
sumber
1
Pengganti yang buruk untuk logperintah layar , yang memungkinkan logging on the fly. Tetapi kemudian jika Anda berada di tmux dan ingin menggunakan logging layar, Anda harus tetap memulai shell baru.
Arcege