首页 > 解决方案 > Bash to slack 错误日志报告

问题描述

我目前有一个脚本跟踪我们的错误日志并将日志发送到我们的松弛通道。我怎样才能让它发送整个错误而不是逐行发送。这就是我目前所拥有的,一个错误以数百个单行帖子的形式发送。

    #!/bin/bash
tail -f "$1" | while read LINE; do
  (echo "$LINE") && curl -X POST --silent --data-urlencode \
    "payload={\"text\": \"\`\`\`$1  $(echo $LINE | sed "s/\"/'/g")\`\`\`\"}" "$2";
done

有没有办法让 bash 做到这一点?

这是它在松弛时的样子:

```/var/log/php_error_log  Stack trace:```
```/var/log/php_error_log  #0 /opt/library/Zend/Mail/Protocol/Smtp.php(167): Zend_Mail_Protocol_Abstract->_connect('tcp://mail...')```
```/var/log/php_error_log  #1 /opt/library/Zend/Mail/Transport/Smtp.php(199): Zend_Mail_Protocol_Smtp->connect()```
```/var/log/php_error_log  #2 /opt/library/Zend/Mail/Transport/Abstract.php(348): Zend_Mail_Transport_Smtp->_sendMail()```
```/var/log/php_error_log  #3 /opt/library/Zend/Mail.php(1197): Zend_Mail_Transport_Abstract->send(Object(Zend_Mail))```
```/var/log/php_error_log  #4 /opt//cronjobs/automate_ro.php(472): Zend_Mail->send(Object(Zend_Mail_Transport_Smtp))```
```/var/log/php_error_log  #5 {main}```

这就是它的格式

```/var/log/php_error_log  Stack trace:
/var/log/php_error_log  #0 /opt/library/Zend/Mail/Protocol/Smtp.php(167): Zend_Mail_Protocol_Abstract->_connect('tcp://mail.grat...')
/var/log/php_error_log  #1 /opt/library/Zend/Mail/Transport/Smtp.php(199): Zend_Mail_Protocol_Smtp->connect()
/var/log/php_error_log  #2 /opt/library/Zend/Mail/Transport/Abstract.php(348): Zend_Mail_Transport_Smtp->_sendMail()
/var/log/php_error_log  #3 /opt/library/Zend/Mail.php(1197): Zend_Mail_Transport_Abstract->send(Object(Zend_Mail))
/var/log/php_error_log  #4 /opt//cronjobs/automate_ro.php(472): Zend_Mail->send(Object(Zend_Mail_Transport_Smtp))
/var/log/php_error_log  #5 {main}```

标签: bashcurlslacktail

解决方案


用于jq创建有效负载,而不是尝试自己逃避事物。

post_log () {
  log=$1
  url=$2

  json=$( jq --argjson t "$log" '{text: "```\($t)```"}' )

  curl -X POST --silent --data-urlencode "payload=$json" "$url"
}

tail -f "$1" | while read LINE; do
  echo "$LINE"
  post_log "$LINE" "$2"
done

推荐阅读