Bash中如何实现错误日志同时输出到控制台和日志文件
问题原因
你当前的重定向规则仅对stdout做了分流处理,stderr被直接重定向到了指向日志文件的stdout,没有配置到控制台的输出通路,因此错误信息只会写入日志不会打印到控制台。
解决方案
场景1:保留「部分输出仅写入日志、不打印控制台」的原有逻辑
修改后的脚本如下:
#!/bin/bash LOG_FILE='./test1.log' # 保存原控制台到文件描述符3,stdout默认追加到日志,stderr同时输出到日志和控制台 exec 3>&1 1>>${LOG_FILE} 2> >(tee -a ${LOG_FILE} >&3) # 需要同时输出到控制台和日志的内容,通过tee转发到fd3(控制台) echo "log to console and log file" | tee /dev/fd/3 # 仅输出到日志的内容,直接echo即可 echo "only to log file" # 所有错误会自动同时输出到日志和控制台 chmm 777 ${LOG_FILE}
场景2:所有stdout/stderr默认同时输出到两边,仅少数内容单独写日志
如果不需要严格区分输出通路,用全局重定向配置更简单:
#!/bin/bash LOG_FILE='./test1.log' # 全局配置:stdout和stderr默认同时输出到控制台和日志文件 exec > >(tee -a ${LOG_FILE}) 2> >(tee -a ${LOG_FILE} >&2) # 默认输出同时到两边 echo "log to console and log file" # 需要仅写入日志的内容,单独重定向即可 echo "only to log file" >> ${LOG_FILE} chmm 777 ${LOG_FILE}
修改后运行脚本,你期望的错误信息./log_to_console_and_file.sh: line 6: chmm: command not found就会同时出现在控制台和日志文件中。
内容的提问来源于stack exchange,提问作者Rob Wilkinson
相关产品推荐
相关产品推荐

