linux - 如何在“exec &”生成的输出之前加上 linux bash 脚本中的时间/日期?
问题描述
我有以下脚本文件,可将文件从本地文件系统写入 s3:
#!/bin/bash
CURR_DIR=`dirname $0`
SCRIPT_NAME="$(basename $0)"
LOG_FILE=$(echo $SCRIPT_NAME | cut -f 1 -d '.')
TODAY=$(date '+%Y-%m-%d')
NOW=$(date -d "$(date +%Y-%m-%d)" +%Y"-"%m"-"%d)
LOG_PATH="$CURR_DIR"/logs/"$LOG_FILE"-$TODAY.log
LOG="[$(date '+%Y-%m-%d %H:%M:%S,%3N')] INFO {$LOG_FILE} -"
ERROR_LOG="[$(date '+%Y-%m-%d %H:%M:%S,%3N')] ERROR {$LOG_FILE} -"
BUCKET="s3.bucket.example"
OUT_FOLDER="path/to/folderA"
S3_PUSH="s3://$BUCKET/$OUT_FOLDER"
exec &>> $LOG_PATH
echo "$LOG Copying files to local out folder..." >> $LOG_PATH
cp /path/to/folderA/*.* /path/to/folderB
echo "$LOG Command returned code:" $?
if [ "$(ls -A path/to/folderA/)" ]; then
FILES="$(ls path/to/folderA/*)"
for file in $FILES ; do
echo "$LOG File $file found for sync" >> $LOG_PATH
echo "$LOG Pushing $file to S3 /Folder..." >> $LOG_PATH
echo -n "$LOG " ; s3cmd put -c /home/config/.s3cfg "$file" "$S3_PUSH"/
echo "$LOG Command returned code:" $?
echo "$LOG Copying $file to local backup..." >> $LOG_PATH
mv "$file" /path/to/folderA/backup/
echo "$LOG Command returned code:" $? >> $LOG_PATH
RCC=$?
if [ $? -eq 0 ]
then
echo "$LOG Command returned code:" $?
else
echo "$ERROR_LOG Command returned code:" $?
fi
done
else
echo "$LOG No files found for sync." >> $LOG_PATH
fi
并且输出以特定的 grok 模式出现,我需要将此输出作为日志解析到 Elastic Search 中,但是第 27 行输出如下:
[2021-09-02 08:15:25,629] INFO {TestGrokScriptPattern} - upload: '/path/to/folderA/File.txt' -> 's3://s3.bucket.example/Path/To/Bucket/File.txt' [1 of 1]
0 of 0 0% in 0s 0.00 B/s done
上传和 0 of 0 0%... 行是由在第 16 行执行的 exec & 命令创建的。
如果没有日期、时间和脚本名称,我怎样才能让该输出不转到下一行,以免破坏我试图创建的日志模式?
解决方案
您可以将脚本主体包装在一个块中,然后在一个地方处理整个块的输出,而不是在每一行上重定向输出。然后,您可以使用流编辑器处理该输出sed
。例如:
if true; then # Always true. Just simplifies redirection.
echo "Doing something..."
command_with_output
command_with_more_output
echo "Done."
fi | sed "s/^/${LOG}/" > ${LOG_PATH} 2>&1
该sed
表达式的意思是:将每行的开头 (^) 替换为LOG
变量的内容。
最后使用2>&1
也消除了对exec &>> $LOG_PATH
命令的需要。
推荐阅读
- api - 如何使用硒和黄瓜测试航班预订动态定价系统的自动化
- php - PHP 邮件功能在 Plesk ionos 主机上不起作用
- ios - 不同维度的 TableView 部分索引标题大小
- powershell - 在 Powershell 中安装后无法直接运行 chololately
- c# - FCM 令牌在更新应用程序后刷新。为什么?
- python - 如何使用 mpl_toolkits.axes_grid1.inset_locator.mark_inset 控制 zorder 和裁剪?
- selenium-webdriver - DOM 定位器在 Selenium 中的应用
- netlogo - NetLogo:根据网络上的邻居设置海龟的变量
- websocket - 连接中断时,Websocket 在丢失 pong 时不会关闭
- reactjs - 如何在 React 映射组件上进行独立样式更改