Save “screen” (program) output to a file

那年仲夏 提交于 2019-11-27 10:28:43

There is a command line option for logging. The output is saved to screenlog.n file, where n is a number of the screen. From man pages of screen:

‘-L’ Tell screen to turn on automatic output logging for the windows.

You can also use Control-a + H to save loggings into screenlog.n file. One more Control-a + H to turn off.

C-a H: Begins/ends logging of the current window to the file "screenlog.n".

The selected answer doesn't work quite well with multiple sessions and doesn't allows to specify a custom log file name.

For multiple screen sessions, this is my formula:

1) create a config file for each process:

logfile test.log
logfile flush 1
log on
logtstamp after 1
logtstamp string "[ %t: %Y-%m-%d %c:%s ]\012"
logtstamp on

If you want to do it "on the fly", you can change logfile automatically. \012 means "new line", as using \n will print it on the log file: source.

2) Start your command with the "-c" and "-L" flags:

screen -c ./test.conf -dmSL 'Test' ./test.pl

That's it. You will see "test.log" after the first flush:

...
6 Something is happening...
[ test.pl: 2016-06-01 13:02:53 ]
7 Something else...
[ test.pl: 2016-06-01 13:02:54 ]
8 Nothing here
[ test.pl: 2016-06-01 13:02:55 ]
9 Something is happening...
[ test.pl: 2016-06-01 13:02:56 ]
10 Something else...
[ test.pl: 2016-06-01 13:02:57 ]
11 Nothing here
[ test.pl: 2016-06-01 13:02:58 ]
...

I found that "-L" is still required even when "log on" is on the config file.

I couldn't find a list of the time format variables (like %m) used by screen. If you have a link of those formats, please post it bellow.

** EXTRA **

In case you want to do it "on the fly", you can use this script:

#!/bin/bash
if [[ $2 == "" ]]; then
    echo "Usage: $0 name command";
    exit 1;
fi
name=$1
command=$2
path="/var/log";
config="logfile ${path}/${name}.log
logfile flush 1
log on
logtstamp after 1
logtstamp string \"[ %t: %Y-%m-%d %c:%s ]\012\"
logtstamp on";
echo "$config" > /tmp/log.conf
screen -c /tmp/log.conf -dmSL "$name" $command
rm /tmp/log.conf

To use it, save it (screen.sh) and set +x permissions:

./screen.sh TEST ./test.pl

... and will execute ./test.pl and create a log file in /var/log/TEST.log

ryan

for mac terminal:

script -a -t 0 out.txt screen /dev/ttyUSB0 115200 

details

  • script built in app to "make a typescript of terminal session"
  • -a append to output file
  • -t 0 time between writing to output file is 0 seconds, so out.txt is updated for every new char
  • out.txt is just the output file name
  • screen /dev/ttyUSB0 115200 - command from question for connecting to external device

you can then use tail to see that the file is updating

tail -100 out.txt

The following command works for screen version 4.06.02

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

From man page of the screen:

-Logfile file : By default logfile name is "screenlog.0". 
                You can set new logfile name with the "-Logfile" option.

You can check the existing version of screen using screen -version. You can download and install latest screen version from https://www.gnu.org/software/screen/.

jaggedsoft

Ctrl+A then Shift+H works for me. You can view the file screenlog.0 while the program is still running.

The 'script' command under Unix should do the trick. Just run it at the start of your new console and you should be good.

The following might be useful (Tested on: Linux/Ubuntu 12.04):

cat /dev/ttyUSB0

Using the above, you can then do all the re-directions that you need. For example, to dump output to your console whilst saving to your file, you'd do:

cat /dev/ttyUSB0 | tee console.log

Here's a trick: wrap it in sh -c!

screen sh -c './some-script 2>&1 | tee mylog.log'

Where 2>&1 redirects stderr to stdout so tee can catch and log error messages.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!