﻿import os

def szukaj_bledow(sciezka: str):
    """
    Generator pełniący rolę leniwego czytnika logów.
    Analizuje plik tekstowy linia po linii, nie obciążając pamięci RAM
    i zwraca tylko te linie, które zawierają słowo kluczowe 'ERROR'.
    
    Args:
        sciezka (str): Ścieżka do pliku z logami.
        
    Yields:
        str: Sformatowana linia logu zawierająca błąd.
    """
    try:
        # Używamy menedżera kontekstu with open, który dba o poprawne zamknięcie pliku
        with open(sciezka, 'r', encoding='utf-8') as f:
            # Plik (f) jest domyślnie iterowalny linia po linii (buforowanie strumieniowe)
            for line in f:
                if "ERROR" in line:
                    # Zwracamy linię na zewnątrz, usuwając zbędne białe znaki na końcach (np. znak nowej linii \n)
                    yield line.strip()
    except FileNotFoundError:
        print(f"Błąd: Nie znaleziono pliku '{sciezka}'.")

if __name__ == "__main__":
    # Przygotowanie pliku symulującego logi
    log_filename = "serwer.log"
    print(f"Tworzenie pliku testowego '{log_filename}'...")
    with open(log_filename, 'w', encoding='utf-8') as log_file:
        log_file.write("2026-05-16 11:58: INFO - Server started\n")
        log_file.write("2026-05-16 12:00: ERROR - Connection failed\n")
        log_file.write("2026-05-16 12:02: INFO - Retrying connection\n")
        log_file.write("2026-05-16 12:05: ERROR - Disk full\n")
        log_file.write("2026-05-16 12:06: WARNING - High memory usage\n")
        
    print("\nSzukanie błędów za pomocą generatora:")
    # Użycie generatora w pętli for
    for error in szukaj_bledow(log_filename):
        print(error)
        
    # Sprzątanie - usunięcie pliku testowego (opcjonalnie)
    if os.path.exists(log_filename):
        os.remove(log_filename)
        print(f"\nUsunięto plik testowy '{log_filename}'.")
