[Linux] rsyslog 서버에서 slack으로 메세지 전송하기
이전 글에서 rsyslog 서버를 구축하는 방법을 알아보았는데요, 로그의 severity level이 “3(error)” 이하인 경우 Slack으로 로그 메세지를 전송하는 방법을 알아보겠습니다. 이번 글에서는 RainerScript 형식을 사용하겠습니다.
- slack webhook url을 준비합니다.
(slack api > Your apps > Features > Incoming Webhooks)
Sample curl request to post to a channel을 복사하여 프롬프트에서 실행해 봅니다. “Hello, World!”라는 메세지가 전송됩니다.
※ Slack webhook에 대해 더 많은 것을 알고 싶으신 분은 여기를 방문하세요: https://api.slack.com/messaging/webhooks - rsyslog server의 main config 파일을 아래와 같이 설정합니다.
# vi /etc/rsyslog.confmodule(load="omprog") # send message to slack webhook # Provides UDP syslog reception # for parameters see http://www.rsyslog.com/doc/imudp.html module(load="imudp") # needs to be done just once #input(type="imudp" port="514") # look /etc/rsyslog.d/00-remote.conf
- remote host의 rsyslog를 수집하고 slack webhook으로 전송하기 위한 설정파일을 작성합니다.
# vi /etc/rsyslog.d/00-remote.conf# Define a template for the log file name template(name="RemoteLogFile" type="string" string="/var/log/remote/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log") # Define a template for the log format of log file template(name="CustomRemoteLogFormat" type="string" string="[%timegenerated:::date-rfc3339%] %HOSTNAME%(%fromhost-ip%) %syslogtag% <%PRI%>%syslogfacility-text%(%syslogfacility%).%syslogseverity-text%(%syslogseverity%) %msg%\n") # Define a template for the log format of slack message template(name="jsonFormatTemplate" type="string" string="\n{\"text\":\"[%timegenerated:::date-rfc3339%] %HOSTNAME%(%fromhost-ip%) %syslogtag% <%PRI%>%syslogfacility-text%(%syslogfacility%).%syslogseverity-text%(%syslogseverity%) %msg%\"}") # Define a ruleset for ruleset(name="remoteSyslog") { action(type="omfile" dynaFile="RemoteLogFile" template="CustomRemoteLogFormat") if ($syslogseverity <= 3) then { action(type="omfile" file="/var/log/remote/slack_message.log" template="jsonFormatTemplate") action(type="omprog" binary="/root/send_to_slack_webhook.sh" template="jsonFormatTemplate") } stop } # Provides UDP syslog reception input(type="imudp" port="514" ruleset="remoteSyslog")
- rsyslog 설정 파일이 제대로 설정되었는지 유효성을 검증한 후, rsyslog 데몬을 재시작합니다.
# rsyslogd -N1 # systemctl restart rsyslog
- slack 메세지 전송을 위한 쉘 스크립트 파일을 작성합니다.
# vi /root/send_to_slack_webhook.sh#!/bin/bash WEBHOOK_URL="your_slack_webhook_url" message=$(tail -n 1 /var/log/remote/slack_message.log) if echo "$message" | jq . >/dev/null 2>&1; then echo -e "${message}" >> /var/log/remote/slack_message_sent.log CMD="curl -X POST -H 'Content-type: application/json' --data '${message}' ${WEBHOOK_URL}" eval "$CMD" else echo -e "${message}" >> /var/log/remote/slack_message_error.log fi
- slack으로 메세지가 전송되는지 테스트해 봅니다. remote host 중의 하나에서 logger 명령어를 사용해서 error level의 테스트용 로그를 발생시키면, slack에서 메세지가 표시됩니다.
# logger -p user.err "This is a test error message for omprog module and slack from logger command."
- 마지막으로 “slack_message.log” 파일의 로그 로테이션을 설정합니다. 다른 syslog의 로그 파일들과 함께 설정하면 됩니다.
# vi /etc/logrotate.d/syslog/var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler /var/log/remote/slack_message.log { missingok sharedscripts postrotate /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true endscript }