Existe um equivalente ao comando "log" do GNU Screen no tmux?

35

Faço uso pesado do comando "log" da tela para registrar a saída de uma sessão em um arquivo, quando faço alterações em um determinado ambiente. Eu procurei na página de manual do tmux, mas não consegui encontrar um equivalente. Alguém está ciente de um recurso semelhante no tmux, ou eu tenho que escrever meus próprios scripts de wrapper para fazer isso?

EDIT: Estou ciente de 'script' e outros utilitários que me permitem registrar uma sessão. A razão pela qual a funcionalidade da tela é tão útil é a capacidade de definir uma variável do arquivo de log que usa escapes de string para identificar exclusivamente cada sessão.

por exemplo, eu tenho uma função shell que, com um nome de host, fará o SSH para esse host em uma nova janela da tela e definirá o título da janela para o nome do host. Quando inicio um log dessa sessão, ele é prefixado com o título da janela.

Se essa funcionalidade não existir no tmux, terei que criar um novo conjunto de funções de shell para configurar os 'scripts' das sessões que quero registrar. Isso não é extremamente difícil, mas pode não valer o esforço, pois a tela já faz exatamente o que eu preciso.

Murali Suriar
fonte

Respostas:

39

Deixe-me ver se decifrei sua configuração de tela corretamente:

  • Você usa algo como logfile "%t-screen.log"(provavelmente em um .screenrcarquivo) para configurar o nome do arquivo de log que será iniciado posteriormente.
  • Você usa o title <hostname>(Ca A) tela de comando para definir o título de uma nova janela, ou
    você faz screen -t <hostname> ssh0 <hostname>para iniciar uma nova sessão de tela.
  • Você usa o comando de tela Ca H (Ca: log) para alternar o log para o arquivo configurado.

Nesse caso, é quase equivalente (requer o tmux 1.3+ para suportar #W no pipe-panecomando shell; pipe-paneestá disponível no tmux 1.0+):

  • Em um arquivo de configuração (por exemplo .tmux.conf):

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • Use tmux rename-window <hostname>(Cb,) para renomear uma janela existente, ou
    use tmux new-window -n <hostname> 'ssh <hostname>'para iniciar uma nova janela do tmux ou
    use tmux new-session -n <hostname> 'ssh <hostname>'para iniciar uma nova sessão do tmux .
  • Use Cb H para alternar o log.

Não há notificação de que o log foi alternado, mas você pode adicionar uma se desejar:

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

Nota: A linha acima é mostrada como se estivesse em um arquivo de configuração ( .tmux.confvocê ou um source). O tmux precisa ver a barra invertida e o ponto e vírgula; se você deseja configurar isso a partir do shell a (por exemplo tmux bind-key …), precisará escapar ou citar os dois caracteres adequadamente para que eles sejam entregues ao tmux intactos. Não parece ser uma maneira conveniente de mostrar mensagens diferentes para ativar / desativar ao usar apenas uma ligação (talvez você possa equiparar alguma coisa if-shell, mas provavelmente seria feia). Se duas ligações forem aceitáveis, tente o seguinte:

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
fonte
Agradável! Parece fazer exatamente o que eu preciso.
Murali Suriar 30/03
Hrrm. Portanto, tentar fazer isso a partir do shell gera alguns problemas. Alguma sugestão sobre como gerenciar a passagem de toda a linha para o tmux intacta? "
Murali Suriar 30/03
2
@KamilDziedzic: Você pode tentar incluir um tmux pipe-pane …comando no seu default-command(ou seja, antes de iniciar um shell); é claro que isso funcionaria apenas para painéis "padrão" (nada começou com comandos explícitos, por exemplo new-window sqlite3). Houve dicas de que o suporte "hook" pode chegar a alguma versão futura do tmux ; isso pode deixá-lo configurar um comando (por exemplo pipe-pane …) a ser executado automaticamente após algum outro comando new-session, new-windowou split-pane).
31813 Chris Johnsen
11
@sebelk: Se você considera uma linha individual como uma “entrada”, pode usar um shell reade dateorganizar isso. Por exemplobind-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
11
@ ChrisJohnsen, ... isso poderia se tornar muito mais eficiente se soubéssemos que o bash era 4.1 ou mais recente - gerar um subshell para executar uma nova cópia de datecada linha de saída será um sério problema de desempenho! Muito melhor printf '%(%Y%m%dT%H%M%S)T: %s\n' "$line"(escapar conforme necessário para inclusão em um arquivo de configuração do tmux, dobrando presumivelmente %se escapando dos ").
Charles Duffy
5

Aqui está um plugin tmux que permite o log sem mexer com as combinações de teclas em .tmux.conf:

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

Recursos:

  • prefix + Palterna o log do painel. A saída é apagada dos caracteres ANSI indesejados!
  • prefix + Alt + P salva o histórico completo do painel em um arquivo

fonte
4

Depois de examinar a documentação do tmux, não consigo encontrar nenhum equivalente ao registro da janela da tela. Parece que você precisaria usar suas funções de shell para fazer o que gostaria ou apenas usar a tela. Você pode ativar a depuração, que registra o lado do servidor e do cliente, mas também inclui muitos logs externos relacionados ao tmux, portanto, não seria exatamente o que você estava pedindo.

Você poderia usar a área de transferência do tmux para automatizar o salvamento do buffer em outra sessão, que seria configurada para aceitar o conteúdo da área de transferência e salvar em um arquivo. Isso parece meio tolo.

jsbillings
fonte
11
Essa foi a minha conclusão também. Eu decidi ficar com a tela por enquanto, o que é uma pena, pois, além dessa supervisão, o tmux parece bem legal.
Murali Suriar
1

eu faço isso usando script, isso é do meu arquivo tmux.conf

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
fonte
11
Uma péssima substituição do logcomando da tela , que permite o log on the fly. Mas se você estiver no tmux e quiser usar o log de tela, precisará iniciar um novo shell de qualquer maneira.
Arcege 28/03