Log Analyzer v Python GUI je intuitívna aplikácia pre Windows, ktorá vám umožní efektívne prehliadať, triediť a analyzovať systémové udalosti priamo z logov systému. Program je postavený na modernej platforme Python s elegantným grafickým rozhraním ttkbootstrap.
Kľúčové funkcie aplikácie:
- Prehľad systémových logov
- Zobrazí záznamy z hlavných kategórií logov: Application, System a Security.
- Informácie sú rozdelené podľa času, úrovne závažnosti, zdroja a detailného popisu.
- Interaktívne rozhranie
- Možnosť triedenia záznamov kliknutím na názvy stĺpcov.
- Filtrovanie záznamov podľa kľúčových slov.
- Scrollovanie umožňuje jednoduchý pohyb v dlhých zoznamoch udalostí.
- Detailný náhľad na udalosti
- Dvojklikom na konkrétny záznam sa otvorí nové okno s podrobnými informáciami o udalosti.
- Rýchlosť a stabilita
- Použitie viacvláknového spracovania zaručuje, že aplikácia nezamrzne ani pri načítavaní veľkých objemov dát.
Ako to funguje?
- Výber kategórie logov
- Z rozbaľovacej ponuky zvoľte kategóriu logov (Application, System, Security).
- Načítanie záznamov
- Kliknite na tlačidlo „Načítať logy“ a aplikácia začne postupne zobrazovať udalosti v tabuľke.
- Podrobnosti o udalostiach
- Pre viac informácií o konkrétnej udalosti stačí na ňu dvakrát kliknúť.
- Filtrovanie a triedenie
- Vyhľadávajte udalosti podľa kľúčových slov alebo usporiadajte záznamy podľa času, závažnosti či zdroja.
Pre koho je určený?
- IT administrátori: Efektívny nástroj na riešenie problémov v systéme Windows.
- Bezpečnostní analytici: Rýchla identifikácia udalostí súvisiacich s bezpečnosťou.
- Bežní používatelia: Jednoduchý prehľad o stave systému bez potreby hlbokých technických znalostí.
Technické detaily:
- Programovací jazyk: Python
- Použité knižnice:
win32evtlog,ttkbootstrap - Dizajn: Moderné a intuitívne rozhranie v tmavej téme „darkly“.
Táto aplikácia prináša jednoduché a praktické riešenie na správu systémových logov. Ak máte nápady na ďalšie funkcie alebo vylepšenia, rád ich zapracujem! ?
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
import os import threading import subprocess import sys from tkinter import Tk, Label, Button, Entry, Toplevel, messagebox, ttk import win32evtlog import ttkbootstrap as tb class LogAnalyzer: def __init__(self, root): self.root = root self.root.title("Log Analyzátor") self.root.geometry("900x600") # Nadpis aplikácie self.title_label = Label(root, text="Log Analyzátor", font=("Segoe UI", 16, "bold")) self.title_label.pack(pady=10) # Combobox na výber kategórie logov self.log_category_label = Label(root, text="Vyberte kategóriu logov:", font=("Segoe UI", 10)) self.log_category_label.pack(pady=5) self.log_category_combobox = ttk.Combobox(root, values=["Application", "System", "Security"], state="readonly") self.log_category_combobox.pack(pady=5) self.log_category_combobox.current(0) # Tlačidlo na načítanie logov self.load_button = tb.Button(root, text="Načítať logy", bootstyle="primary", command=self.load_logs_thread) self.load_button.pack(pady=10) # Filter podľa kľúčového slova self.filter_label = Label(root, text="Filtrovať podľa kľúčového slova:", font=("Segoe UI", 10)) self.filter_label.pack(pady=5) self.filter_entry = Entry(root, width=50) self.filter_entry.pack(pady=5) # Tlačidlo na filtrovanie self.filter_button = tb.Button(root, text="Použiť filter", bootstyle="info", command=self.apply_filter) self.filter_button.pack(pady=10) # Stromová štruktúra na zobrazenie logov self.tree = ttk.Treeview(root, columns=("Time", "Severity", "Source", "Message"), show="headings", height=20) self.tree.heading("Time", text="Čas", command=lambda: self.sort_tree("Time", False)) self.tree.heading("Severity", text="Úroveň", command=lambda: self.sort_tree("Severity", False)) self.tree.heading("Source", text="Zdroj", command=lambda: self.sort_tree("Source", False)) self.tree.heading("Message", text="Správa", command=lambda: self.sort_tree("Message", False)) self.tree.column("Time", width=150, anchor="center") self.tree.column("Severity", width=100, anchor="center") self.tree.column("Source", width=200, anchor="center") self.tree.column("Message", width=400) self.tree.pack(side="left", pady=10, fill="both", expand=True) # Scrollbar pre stromovú štruktúru self.scrollbar = ttk.Scrollbar(root, orient="vertical", command=self.tree.yview) self.tree.configure(yscrollcommand=self.scrollbar.set) self.scrollbar.pack(side="right", fill="y") # Kliknutie na riadok pre zobrazenie podrobností self.tree.bind("<Double-1>", self.show_details) def load_logs_thread(self): threading.Thread(target=self.load_logs, daemon=True).start() def load_logs(self): self.tree.delete(*self.tree.get_children()) category = self.log_category_combobox.get() try: server = None # Lokálny počítač log_type = category handle = win32evtlog.OpenEventLog(server, log_type) flags = win32evtlog.EVENTLOG_BACKWARDS_READ | win32evtlog.EVENTLOG_SEQUENTIAL_READ while True: events = win32evtlog.ReadEventLog(handle, flags, 0) if not events: break for event in events: time_generated = event.TimeGenerated.Format() source = event.SourceName severity = self.get_severity(event.EventType) description = ''.join(event.StringInserts) if event.StringInserts else "" self.tree.insert("", "end", values=(time_generated, severity, source, description)) self.root.update_idletasks() except Exception as e: messagebox.showerror("Chyba", f"Nepodarilo sa načítať logy: {e}") def get_severity(self, event_type): severity_map = { win32evtlog.EVENTLOG_ERROR_TYPE: "Error", win32evtlog.EVENTLOG_WARNING_TYPE: "Warning", win32evtlog.EVENTLOG_INFORMATION_TYPE: "Information", } return severity_map.get(event_type, "Unknown") def apply_filter(self): keyword = self.filter_entry.get().strip() if not keyword: messagebox.showwarning("Upozornenie", "Zadajte kľúčové slovo na filtrovanie.") return for item in self.tree.get_children(): values = self.tree.item(item, "values") if keyword.lower() not in ' '.join(values).lower(): self.tree.delete(item) def show_details(self, event): selected_item = self.tree.focus() if not selected_item: return values = self.tree.item(selected_item, "values") detail_window = Toplevel(self.root) detail_window.title("Podrobnosti logu") detail_window.geometry("600x400") Label(detail_window, text="Čas:", font=("Segoe UI", 10, "bold")).pack(anchor="w", pady=5) Label(detail_window, text=values[0], wraplength=580, justify="left").pack(anchor="w", pady=5) Label(detail_window, text="Úroveň:", font=("Segoe UI", 10, "bold")).pack(anchor="w", pady=5) Label(detail_window, text=values[1], wraplength=580, justify="left").pack(anchor="w", pady=5) Label(detail_window, text="Zdroj:", font=("Segoe UI", 10, "bold")).pack(anchor="w", pady=5) Label(detail_window, text=values[2], wraplength=580, justify="left").pack(anchor="w", pady=5) Label(detail_window, text="Správa:", font=("Segoe UI", 10, "bold")).pack(anchor="w", pady=5) Label(detail_window, text=values[3], wraplength=580, justify="left").pack(anchor="w", pady=5) def sort_tree(self, col, descending): data = [(self.tree.set(child, col), child) for child in self.tree.get_children()] data.sort(reverse=descending) for index, (_, child) in enumerate(data): self.tree.move(child, "", index) self.tree.heading(col, command=lambda: self.sort_tree(col, not descending)) if __name__ == "__main__": app = tb.Window(themename="darkly") # Moderný bootstrap štýl analyzer = LogAnalyzer(app) app.mainloop() |





