[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% %HOSTNAME% %fromhost-ip% %programname%[%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%] %HOSTNAME%(%fromhost-ip%) <%PRI%>%syslogfacility-text%(%syslogfacility%).%syslogseverity-text%(%syslogseverity%) %programname% %syslogtag% %msg%\"}") # Define a ruleset for ruleset(name="remoteSyslog") { action(type="omfile" dynaFile="RemoteLogFile" template="CustomRemoteLogFormat") if ($fromhost-ip != "58.54.160.102" and $fromhost-ip != "58.54.160.103" and $fromhost-ip != "58.54.160.104" and $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_output.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