暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

screen 保留日志

生有可恋 2022-07-21
2578

使用 screen 可以用来保存活动会话,让我们在会话中保留工作环境,从而可以快速恢复手头的工作。


但 screen 的屏幕输出受缓冲区大小的限制没法一直向上翻页,而我们恢复到工作环境后一般需要查看之前执行的命令历史和屏幕输出。因此,让 screen 的屏幕输出保留到日志中是非常有必要的。


为了让screen的日志输出到指定位置,需要在screen的配置文件中加上一行:

    $ tail -1 /etc/screenrc
    logfile var/screenlog/screenlog_%t.log
    复制

    其中 %t 是会话的 title ,即会话的标题,用来区分不同的会话。


    在启动会话时通过额外的参数激活日志功能:

      # demo for screen logging
      screen -L -t clean2019 -S clean2019
      复制

      命令说明:

      • -L 打开日志功能

      • -t titlename 会话的标题(在日志名中会用到)

      • -S sessionname 会话名(重新登录会话会用到)


      为了方便后其定位日志,最好会话名与会话标题保持一致。其中日志是实时输出的,可以使用 tail -f 观察实时日志内容。


      重新登录会话:

        screen -r sessionName
        复制

        需要注意的一点,screen 日志中记录的屏幕输出是带颜色的,直接通过编辑软件打开是带颜色标记的,使用 cat 可以看到带颜色的输出,但通过vim查看,内容和颜色混杂在一起,不容易分辨清楚。



        为了去掉颜色信息,我们可以使用 sed 对屏幕颜色进行去色。去色的命令比较多,我挑一部分试过的列在下面,做不到完全去掉控制字符,具体效果可以测试后使用。

          $ sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" screen.log
          $ sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g" screen.log
          $ sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" screen.log
          $ sed 's/\x1B[@A-Z\\\]^_]\|\x1B\[[0-9:;<=>?]*[-!"#$%&'"'"'()*+,.\/]*[][\\@A-Z^_`a-z{|}~]//g' screen.log
          复制


          除了使用 sed 去色,还有一款使用C编写的去色工具:ansi2txt,使用方法:

            cat color.log | ./ansi2txt
            复制

            工具 github 地址:

            • https://github.com/kilobyte/colorized-logs.git


            代码下载下来后,直接编译单文件即可:

              gcc ansi2txt.c -o ansi2txt
              复制

              代码很短:

                #include <stdio.h>


                int main(void)
                {
                int ch;
                do
                {
                ch=getchar();
                while (ch==13)
                if ((ch=getchar())!=10)
                putchar(13); /* suppress \r only when followed by \n */
                if (ch==27)
                if ((ch=getchar())=='[')
                while ((ch=getchar())==';'||(ch>='0'&&ch<='9')||ch=='?');
                else if (ch==']'&&(ch=getchar())>=0&&ch<='9')
                for (;;)
                {
                if ((ch=getchar())==EOF||ch==7)
                break;
                else if (ch==27)
                {ch=getchar(); break;}
                }
                else if (ch=='%')
                ch=getchar();
                else {}
                else if (ch!=EOF)
                putchar(ch);
                }
                while (ch!=EOF);
                return 0;
                }
                复制


                全文完。


                如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。


                文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论