Python/Python__works

서버의 로그를 파이썬으로 읽어서 slack으로 전달하기

말하는감자 2020. 9. 24. 15:09

from datetime import datetime
import inspect, subprocess, socket
from slacker import Slacker

'''
크론탭 로그 예제
Sep 01 00:00:00 서버이름 CROND[12345]: (실행하신분) CMD (실행 내용)
Sep 01 00:00:00 서버이름 CROND[12345]: (실행하신분) CMD (실행 내용)
Sep 01 00:00:00 서버이름 CROND[12345]: (실행하신분) CMD (실행 내용)

구현 내용
1. 매일매일 크론탭의 로그를 체크한다.
2. 예전 로그는 볼 필요가 없다.
3. 크론탭 로그에서 필요한 내용만 뽑아서 slack으로 전달한다.
'''

# Sep 형식으로 월을 구해야 합니다.
# 월을 영어로 구한 후에 앞의 3글자만 사용합니다. 
month_in_english = datetime.now().strftime("%B")[:3]

# number 형식으로 일을 구합니다. 리턴 타입은 스트링입니다.
day = datetime.now().strftime("%d")

# 원하는 내용을 끌어올 명령어를 정리합니다. 띄워쓰기에 주의합니다. Sep띄어쓰기01띄어쓰기
cat = "cat /로그파일경로 | grep '{} {} '".format(month_in_english, day)

# subprocess를 이용해서 명령어를 shell에 날려줍니다.
# 이때 결과값은 줄 별로 분리되지 않고 붙어있는채로(?) 들어오기 때문에 
# \\n으로 split 해서 리스트 형태로 바꿔줍니다.
result = str(subprocess.check_output(cat, shell=True)).split("\\n")

log = ""
for r in result:
    log += r
    log += "\n" #예쁘게 붙여주기 위해서 로그 라인별로 줄바꿈을 해줍니다.

# 슬래커 생성
slack = Slacker("슬랙키")
slack_message [{
    "color": "원하는색상코드",
    "title": "원하는 타이틀",
    "text": log
}]
# 전송
# 크론탭을 사용하는 서버가 여러개인 경우 text를 socket.gethostname()으로 서버 이름을 표시해줍니다.
slack.chat.post_message("채널이름", text="{}".format(socket.gethostname()), 
attachments=slack_message)

 

그리고 이 소스를 crontab에 등록해주면 일정시간마다 로그를 전달받을 수 있겠죠

 

'Python > Python__works' 카테고리의 다른 글

dictionary  (0) 2020.10.12
mysqlclient  (0) 2020.09.28
datetime 활용하기  (0) 2020.09.24
실행 중인 메서드이름, 파일 이름  (0) 2020.09.24
fetchone() 분실 사건  (0) 2020.09.22