• Linux脚本:将.sh文件输出映射到日志文件并添加时间戳


    背景

    • 在linux系统中,当调用.sh脚本时,脚本中的标准输出原本是打印到控制台的,我们可以将其打印到某个文件,并添加上时间戳,方便问题溯源。
    • 有时我们运行的脚本是.py脚本,也需要将输出映射到日志文件。

    解决办法

    调用.sh脚本时

    • 假设我的目标脚本名为script.sh脚本,我需要写一个start.sh脚本,在该脚本中启动script.sh脚本,并将script.sh脚本的输出保存到out_log.txt文件中,过程如下:
    • 首先安装moreutils包:
    sudo apt-get update
    sudo apt-get install moreutils
    
    • 编写 start.sh 脚本:这个脚本将启动 script.sh 并处理日志重定向和时间戳添加。
    # 运行 script.sh,并将其输出重定向到 out_log.txt,添加时间戳
    ./script.sh 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' >> out_log.txt
    
    • 如果不安装moreutils包,将start.sh改为如下内容即可:
    # 运行 script.sh,并将其输出重定向到 out_log.txt,添加时间戳,并在后台运行
    (
      while IFS= read -r line
      do
        echo "$(date '+[%Y-%m-%d %H:%M:%S]') $line"
      done < <(./script.sh 2>&1)
    ) >> out_log.txt &
    
    • 假设script.sh脚本中内容如下:
    #!/bin/sh
    
    echo "Script started"
    echo "Doing some work..."
    sleep 2
    echo "Work done"
    echo "Script finished"
    
    • 最终结果我们将看到输出如下:
    [2024-06-06 12:00:00] Script started
    [2024-06-06 12:00:00] Doing some work...
    [2024-06-06 12:00:02] Work done
    [2024-06-06 12:00:02] Script finished
    

    调用.py脚本时

    • 我们新建一个运行目标start.sh的启动脚本如下:
    current_time=$(date +"%Y-%m-%d-%H-%M-%S")
    
    echo "${current_time} start python3:\n" >>output.log
    
    nohup python3 Test1.py &
    
    echo $! > pid_file.txt
    
    • 在start.sh脚本中启动目标的.py文件。在.py脚本中,加入以下命令使能将print打印到日志文件:
    PrintToFile = True
    
    if PrintToFile:
        # 配置日志记录器
        logging.basicConfig(filename='output.log', level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    
        # 定义一个函数用于重定向标准输出到日志文件
        def redirect_stdout_to_log():
            class StdOutLogger(object):
                def write(self, message):
                    # 添加时间信息并写入日志文件
                    logging.info('%s %s', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), message.rstrip())
    
                def flush(self):
                    pass
    
            # 将标准输出重定向到 StdOutLogger 类的实例
            sys.stdout = StdOutLogger()
    
        # 调用函数将标准输出重定向到日志文件
        redirect_stdout_to_log()
    
    • 并将该进程号保存在一个pid_file.txt中。当我们后面想停止该进程时,直接运行以下stop.sh脚本即可:
    pid=$(cat pid_file.txt)
    
    kill $pid
    
  • 相关阅读:
    spingboot按照依赖包除了maven还有Gradle,两者的区别?
    libssl.so.10: cannot open shared object file: No such file or directory
    Mpeg-Mesylate/Metronidazole/Niacin 甲氧基聚乙二醇-甲磺酸酯/甲硝唑/烟酸
    人工智能数学课高等数学线性微积分数学教程笔记(3. 线性代数基础)
    67个团建游戏
    文件字符流说明
    R语言统计—比较定性资料样本频率样本量的计算
    运维-- 统一网关非常必要
    Spring基础篇:面向切面编程
    3D生成式AI模型、应用与工具大全
  • 原文地址:https://blog.csdn.net/wcc243588569/article/details/139497012