decten / k-shield_log

log 분석 도구 개발
0 stars 0 forks source link

코드 병합 전 상황 및 현재 코드 공유 #1

Open decten opened 3 years ago

decten commented 3 years ago

1. 상황

아이피 저장 완료 화면 출력 + 파일 저장 수정 중

2. 코드

import re
import json
from tkinter import *

# 같은 아이피+다른 날짜(시간) 조합 처리
def get_log_data():
    log_dict = dict()

    # 임의의 파일을 열고 닫도록 수정해야 함
    with open('data.log', encoding='cp949') as f:
        for line in f:
            # 날짜 시간 / IP(""로 따로 저장 됨 -> 한 번에 추출할 수 있도록 수정해야 하는디..)
            m = re.search('[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{3}', line)
            n = re.search('[0-9]+(?:\.[0-9]+){3}', line)

            if (m):
                log_date, log_time= m.group().split()
                log_ip = n
                if (log_ip not in log_dict):
                    log_dict[log_ip] = {'count': 1, 'date': [log_date]}
                else:
                    log_dict[log_ip]['count'] += 1
                    # 기존에 없는 날짜만 리스트에 추가
                    if (log_date not in log_dict[log_ip]['date']):
                        log_dict[log_ip]['date'].append(log_date)
    return log_dict

def show_log(log_dict):
    for k, v in log_dict.items():
        log_message = '{:12} {:12} {:>14}'.format(k, v['count'], v['date'][0])
        log_list_box.insert(END, log_message)

        # 같은 아이피에 2개 이상의 날짜
        for date in v['date'][1:]:
            log_message = '{:12} {:12} {:>14}'.format(' ', ' ', date)
            log_list_box.insert(END, log_message)

def save_json(log_dict):
    with open('data.log.json', 'w', encoding='utf-8') as f:
        f.write(json.dumps(log_dict))

root = Tk()
root.title('결과창')

log_dict = get_log_data()

Label(root, text=' IP ', width=5, relief='groove', padx=5).grid(row=0, column=0, sticky='wens')
Label(root, text=' IP 횟수 ', width=5, relief='groove', padx=5).grid(row=0, column=1, sticky='wens')
Label(root, text=' IP 날짜 ', width=5, relief='groove', padx=5).grid(row=0, column=2, sticky='wens')

frame = Frame(root)
scrollbar = Scrollbar(frame)
scrollbar.pack(side='right', fill='y')
log_list_box = Listbox(frame, yscrollcommand=scrollbar.set, font='TkFixedFont', height=20, width=40)
log_list_box.pack(fill='both')
scrollbar['command'] = log_list_box.yview
frame.grid(row=1, column=0, columnspan=3, sticky='we')

show_log(log_dict)
save_json(log_dict)

root.mainloop()

3. 계획

decten commented 3 years ago
                                                   🔨 완성 코드입니다 🔨

추가 기능

  1. 선택 파일 열기
  2. 원하는 이름으로 파일 저장

수정한 요소

  1. ""별로 데이터 입력 받아서 저장 -> ""을 공백으로 바꿔서 라인 별로 저장
  2. 결과 화면 출력할 때 tkinter의 Listbox 사용 -> Treeview 사용
  3. 날짜가 같은 경우 모든 항목 출력 -> 시간만 출력

코드

import json
from tkinter import *
from tkinter.ttk import *
from tkinter import filedialog

def get_log_file():
    root.filename = filedialog.askopenfilename(parent = root, initialdir = './', title = 'Open Log files',
                                               filetypes = (('log files', '*.log'), ('all files', '*.*')))
    if (root.filename != ''):
        root.log_dict = get_log_data()
        show_log(root.log_dict)

def get_log_data():
    log_dict = dict()

    with open('data.log', encoding='cp949') as f:
        for line in f:
            # ""별로 추출헤서 날짜&시간이랑 ip를 따로 받아야 함 -> 걍 통째로 받아서 date, time, ip만 가져옴
            _, _, _, log_date, log_time, log_ip, *dummy = line.replace('"', '').split()

            if (log_ip not in log_dict):
                    log_dict[log_ip] = {'count': 1, 'date': [log_date], 'time' : [log_time]}
            else:
                log_dict[log_ip]['count'] += 1

                log_dict[log_ip]['date'].append(log_date)
                log_dict[log_ip]['time'].append(log_time)

    return log_dict

def show_log(log_dict):
    for k, v in log_dict.items():
        log_treeview.insert('', 'end', text = k, values = (v['count'], v['date'][0], v['time'][0]))

        # 날짜가 둘 이상인 경우
        for i in range(1, len(v['date'])):
            if v['date'][i - 1] == v['date'][i]:
                date = ' '
            else:
                date = v['date'][i]

            if v['time'][i - 1] == v['time'][i]:
                time = ' '
            else:
                time = v['time'][i]
                # 시간이 같지 않는 경우(중복 날짜에 대해서 시간만 출력)
                if (time != ' '):
                    log_treeview.insert('', 'end', text='', values=(' ', date, time))

def save_json(log_dict):
    filename = filedialog.asksaveasfilename(parent=root, defaultextension='.json', filetypes=[('json files', '*.json')])
    if (filename != '' and root.log_dict):
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(json.dumps(root.log_dict))

root = Tk()
root.title('결과창')

root.filename = ''
root.log_dict = None

frame = Frame(root)
scrollbar = Scrollbar(frame)
scrollbar.pack(side = 'right', fill = 'y')
log_treeview = Treeview(frame, columns = ['1', '2', '3'], displaycolumns = ['1', '2', '3'])
log_treeview.pack(fill = 'both')
scrollbar['command'] = log_treeview.yview
frame.grid(row = 0, column = 0, columnspan = 4, sticky = 'we')

log_treeview.configure(yscrollcommand=scrollbar.set)
log_treeview.column('#0', width = 120, anchor = 'center')
log_treeview.heading('#0', text='IP')
log_treeview.column('1', width = 100, anchor = 'e')
log_treeview.heading('1', text = 'IP 횟수')
log_treeview.column('2', width = 100, anchor = 'center')
log_treeview.heading('2', text = 'IP 날짜')
log_treeview.column('3', width = 100, anchor = 'center')
log_treeview.heading('3', text = 'IP 시간')

Button(root, text = '결과 저장...', command = save_json).grid(row = 1, column = 1, padx = 5, pady = 5)
Button(root, text = '파일 선택...', command = get_log_file).grid(row = 1, column = 2, padx = 5, pady = 5)

root.mainloop()