如何让Bash脚本的日志同时输出到终端和日志文件?
实现Bash日志函数同时输出到终端和文件
你只需要修改logmessage函数,借助tee命令就能实现日志消息同时输出到终端(保持原有的stderr输出)和写入指定文件。以下是修改后的完整脚本:
# Use the first argument as the path PATH_INPUT="$1" # 确保日志文件所在目录存在,避免写入失败 mkdir -p "$PATH_INPUT" # To put the logfile in the run folder LOGFILE="$PATH_INPUT/logfile.log" logmessage(){ # 生成带时间戳的日志内容 message="$1" log_entry="$(date)\t$message" # 同时追加到日志文件并输出到stderr(终端显示) echo -e "$log_entry" | tee -a "$LOGFILE" >&2 } logmessage "-------------- Analysis starts ------------" # Print the PATH_INPUT at the beginning of the log file logmessage "------------ ${PATH_INPUT} --------------"
关键逻辑说明
tee -a "$LOGFILE":接收管道输入的日志内容,将其追加到指定的日志文件中,同时把内容输出到stdout。>&2:将tee输出的stdout内容重定向到stderr,保持原函数输出到标准错误流的行为,确保终端能正常显示日志。mkdir -p "$PATH_INPUT":提前创建目标目录(如果不存在),避免因为目录缺失导致日志文件无法写入。
替代实现方式
如果你不想用管道,也可以通过两次输出实现(逻辑更直观,但效率略低):
logmessage(){ message="$1" log_entry="$(date)\t$message" # 输出到终端(stderr) echo -e "$log_entry" >&2 # 追加到日志文件 echo -e "$log_entry" >> "$LOGFILE" }
注意事项
- 确保对
$PATH_INPUT目录有写入权限,否则日志文件无法创建或写入。 - 如果需要更统一的时间戳格式,可以修改
date命令的参数,比如用date +"%Y-%m-%d %H:%M:%S"生成更规范的时间格式。
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

