Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I make heavy use of screen's "log" command to log the output of a session to a file, when I am making changes in a given environment. I searched through tmux's man page, but couldn't find an equivalent. Is anyone aware of a similar feature in tmux, or do I have to write my own wrapper scripts to do this?

EDIT: I'm aware of 'script' and other utilities that allow me to log a session. The reason that screen's functionality is so useful is the ability to define a logfile variable which uses string escapes to uniquely identify each session.

e.g. I have a shell function which, given a hostname, will SSH to that host in a new screen window and set the window title to the hostname. When I start a log of that session, it is prefixed with the window title.

If this functionality doesn't exist in tmux, I'll have to create a new set of shell functions to set up 'scripts' of sessions I want to log. This isn't hugely difficult, but it may not be worth the effort given that screen does exactly what I need already.

share|improve this question
add comment

3 Answers

up vote 18 down vote accepted

Let me see if I have deciphered your screen configuration correctly:

  • You use something like logfile "%t-screen.log" (probably in a .screenrc file) to configure the name of the log file that will be started later.
  • You use the title <hostname> (C-a A) screen command to set the title of a new window, or
    you do screen -t <hostname> ssh0 <hostname> to start a new screen session.
  • You use the C-a H (C-a :log) screen command to toggle logging to the configured file.

If so, then is nearly equivalent (requires tmux 1.3+ to support #W in the pipe-pane shell command; pipe-pane is available in tmux 1.0+):

  • In a configuration file (e.g. .tmux.conf):

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • Use tmux rename-window <hostname> (C-b ,) to rename an existing window, or
    use tmux new-window -n <hostname> 'ssh <hostname>' to start a new tmux window, or
    use tmux new-session -n <hostname> 'ssh <hostname>' to start a new tmux session.
  • Use C-b H to toggle the logging.

There is no notification that the log has been toggled, but you could add one if you wanted:

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

Note: The above line is shown as if it were in a configuration file (either .tmux.conf or one you source). tmux needs to see both the backslash and the semicolon; if you want to configure this from the a shell (e.g. tmux bind-key …), then you will have to escape or quote both characters appropriately so that they are delivered to tmux intact. There does not seem to be a convenient way to show different messages for toggling on/off when using only a single binding (you might be able to rig something up with if-shell, but it would probably be ugly). If two bindings are acceptable, then try this:

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'
share|improve this answer
    
Nice! That looks to do pretty much exactly what I need. –  Murali Suriar Mar 30 '11 at 19:16
    
Hrrm. So attempting to do this from the shell yields some issues. Any suggestions as to how to manage passing the entire line to tmux intact?" –  Murali Suriar Mar 30 '11 at 22:16
    
Use '\;' instead of \;: tmux bind-key H pipe-pane -o 'cat >>$HOME/#W-tmux.log' '\;' display-message 'Toggled logging to $HOME/#W-tmux.log' (nine shell “words”). –  Chris Johnsen Mar 31 '11 at 2:16
    
Is there a way to make this work for each tmux session without using shortcut? So just starting tmux will log all output to a file or each shell session to a file. –  Kamil Dziedzic Jul 12 '13 at 12:43
1  
@KamilDziedzic: You might try including a tmux pipe-pane … command in your default-command (i.e. before starting a shell); of course that would only work for “default” panes (nothing started with explicit commands, e.g. new-window sqlite3). There have been hints that “hook” support might land in some future version of tmux; this might let you configure a command (e.g. pipe-pane …) to be automatically run after some other command new-session, new-window, or split-pane). –  Chris Johnsen Jul 12 '13 at 22:34
add comment

i do it using script, this is from my tmux.conf file

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"

share|improve this answer
    
A poor replacement to screen's log command, which allows logging on the fly. But then if you are in tmux and want to use screen's logging, you have to start a new shell anyway. –  Arcege Mar 28 '11 at 21:23
add comment

After looking through the documentation for tmux, I can't find any equivalent of screen's window logging. It looks like you'd have to use your shell functions to do what you'd like, or just use screen. You can turn on debugging, which logs both the server and client side, but it also includes a lot of extraneous tmux-related logs as well, so it wouldn't exactly what you're asking for.

You could possibly use tmux's clipboard to automate saving the buffer to another session, which would be set up to accept the contents of the clipboard and save to a file. This seems kind of hackish.

share|improve this answer
    
That was my conclusion as well. I've decided to stick with screen for now, which is a shame, as other than this oversight, tmux seems pretty nice. –  Murali Suriar Jan 21 '11 at 16:30
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.