Python

파이썬-실습(12) HTML로 파일 log내용 확인하기

지나가는 지식들을 모아두기 2022. 1. 12. 21:00
728x90
300x250

저만의 사이드 프로젝트를 하고 있는 상태입니다

 

현재 crontab으로 돌아가는 파일의 log를 bot.log파일로 저장하고 있는데

오류가 날 때마다 컴퓨터를 켜고 EC2에 접속해서 log파일을 열어서

일일이 확인하는 것이 너무 불편하다고 생각했습니다.

 

그래서 현재 돌아가고 있는 EC2안 Flask 웹 서버에서 log를 확인할 수 있게 만들려고 합니다.

이렇게 되면 모바일이든 PC든 EC2 IP주소로 언제 어디서든지 log를 확인할 수 있습니다.

 

먼저 bot.py 파일이 실행되고 그 log들을 bot.log에 저장하고 있습니다.

0 * * * * python3 /home/ec2-user/bot/bot.py >> /home/ec2-user/bot/bot.log 2>&1

이런식으로 log를 저장할 수 있습니다.

 

여기서 이 log파일을 어떻게 읽고 어떻게 Flask에 출력할지 고민했는데

엉성하지만 제일 간단한 방법으로 가고자 마음먹었습니다.

 

1. 저장되어 있는 bot.log를 bot.py가 실행될 때마다 MongoDB에 삽입하기로 했습니다.

def read_log():
    log = open('bot.log', 'rt') # bot.log 파일을 읽기모드로 연다음
    line_log = []
    loglines = log.readlines()
    loglines = loglines[-100:] # log전체는 필요없으니 100줄만 읽어오도록 합니다.
    for line in loglines:
        line_log.append(line) # 1줄씩 리스트에 넣습니다.
    log.close()
    func.delete_item_many(mongo, {}, "alarm", "log") # log를 업데이트하기 위해 그 전 log를 전부 지웁니다.
    for i in line_log:
        func.insert_item_one(mongo, {'log':str(i)}, 'alarm', 'log') # log를 한 줄씩 MongoDB에 넣습니다
    print('readed log') # read를 마쳤다는 메시지를 표시합니다.
    
    
# func안 함수
def delete_item_many(mongo, condition=None, db_name=None, collection_name=None):
    result = mongo[db_name][collection_name].delete_many(condition)
    return result
    
def insert_item_one(mongo, data, db_name=None, collection_name=None):
    result = mongo[db_name][collection_name].insert_one(data).inserted_id
    return result

 

2. 그런 다음 Flask에서 log페이지를 따로 설정하여 만들어줍니다.

@app.route('/log', methods = ['GET', 'POST']) # 사용할데가 있을까봐 methods를 넣어놨습니다.
def render_log():
    log_list = []
    log_all = func.find_item(mongo, None, "alarm", "log")
    for i in log_all:
        log_list.append(i['log']) # 리스트안에 리스트 형식으로 1줄씩 넣어줍니다.
    print(log_list)
    return render_template('log.html', log = log_list) # 이 log 리스트를 바탕으로 log.html을 엽니다.

 

3. 그 후 html에서 한 줄씩 출력되게 코딩합니다.

<body>
		<br><br><br><br>
		<center>
            <div style="font-size: 1.2em; color: rgb(238, 231, 231);">
            {% for n in log %} # 이 부분에서 log를 한 줄씩 출력시킵니다.
            {{n}}<br>
            {% endfor %}
            </div>
            <br><br><br>
		</center>
	</body>

 

4. 그 후 웹서버에서 로그를 보면

 

이런식으로 출력되게 됩니다.

 

아직은 좀 엉성하고 미숙한 부분이 많지만 차차 조금씩 수정해가면서 고쳐보겠습니다.

728x90
300x250