我有一个简单的问题,但并没有真正找到答案,因为大多数时候他们重定向到文件日志而不是函数:/
我只是想将所有STDIN和STDOUT重定向到一个函数中,该函数将把所有内容插入到cloudwatch中。
function insert_logs_into_cloud_watch {
errorMessage=$1
echo ${errorMessage}
}
{
// block of lot of code
} 2>&1 | insert_logs_into_cloud_watch
在我使用插入日志文件之前
{
// block of lot of code
} 2>&1 | tee my_log_file.log
但是,对于函数,我该怎么做呢?
谢谢你们的帮助。
如何做到这一点取决于您是否希望将每一行输出作为单独的日志事件发送,其内容如下:
function insert_logs_into_cloud_watch {
while IFS= read -r errorMessage; do
TIMESTAMP=$(command to get timestamp in appropriate format)
aws logs put-log-events --log-group-name "$CW_GROUP_NAME" --log-stream-name "$CW_LOG_STREAM_NAME" --log-events timestamp=$TIMESTAMP,message="$errorMessage" --sequence-token $TOKEN
done
}
{
// block of lot of code
} 2>&1 | insert_logs_into_cloud_watch
说明:read
每次从标准输入(通过管道从代码块(中获取一行,然后您需要获取当前时间戳并将该行作为日志消息提交。
或者,如果你想把整个输出作为一条消息发送,你可以这样做:
errorMessage=$(
exec 2>&1
// block of lot of code
)
TIMESTAMP=$(command to get timestamp in appropriate format)
aws logs put-log-events --log-group-name "$CW_GROUP_NAME" --log-stream-name "$CW_LOG_STREAM_NAME" --log-events timestamp=$TIMESTAMP,message="$errorMessage" --sequence-token $TOKEN
说明:exec
命令将标准错误合并为标准输出;$( )
捕获该输出,以便将其放入变量中。
顺便说一句,这里有一点警告:在两个版本中,代码块都在子shell中执行(第一个版本是因为管道,第二个版本是由于$( )
(,这意味着对变量或类似内容的任何更改都是块的本地更改(即,当块完成时,它们将丢失(。有一些方法可以避免这种情况,但它们使整个事情变得更加复杂。