Skip to content

Příklady použití Loggeru

Tato sekce ukazuje běžné scénáře logování v aplikaci.


Inicializace

Logger se musí inicializovat jednou na začátku aplikace (typicky v app/bootstrap.php nebo během setup fáze).

Nastavení log souboru přes název

Nejjednodušší a doporučený přístup. Logger sám vygeneruje cestu:

use Petrovo\Logger\Logger;

// Nastaví log soubor na: {DIR}/var/log/application.log
Logger::setLog('application');

Nastavení log souboru s celou cestou

Pokud potřebuješ konkrétní cestu mimo standardní var/log/ adresář:

use Petrovo\Logger\Logger;

Logger::setLogFile('/var/log/myapp/errors.log');

Běžné scénáře logování

Chyby aplikace

Pokud dojde k chybě, kterou nelze nijak ošetřit:

use Petrovo\Logger\Logger;

try {
    $result = performRiskyOperation();
} catch (Exception $e) {
    Logger::error('Operation failed', [
        'message'   => $e->getMessage(),
        'code'      => $e->getCode(),
        'file'      => $e->getFile(),
        'line'      => $e->getLine(),
    ]);
}

Kritické chyby (service down)

Když služba nebo komponenta není dostupná:

use Petrovo\Logger\Logger;

$db = connectToDatabase();
if (!$db) {
    Logger::critical('Database connection failed', [
        'host'    => 'localhost',
        'port'    => 3306,
        'database' => 'myapp'
    ]);
}

Bezpečnostní upozornění

Podezřelá aktivita nebo pokusy o neoprávněný přístup:

use Petrovo\Logger\Logger;

if ($failedAttempts >= 5) {
    Logger::warning('Possible brute force attempt', [
        'ip_address' => $_SERVER['REMOTE_ADDR'],
        'username'   => $username,
        'attempts'   => $failedAttempts,
    ]);
}

Informace o důležitých akcích

Záznam o přihlášení, vytvoření nového uživatele, atd.:

use Petrovo\Logger\Logger;

Logger::info('User logged in', [
    'user_id'  => $userId,
    'username' => $username,
    'ip'       => $_SERVER['REMOTE_ADDR'],
]);

Ladící informace

Pro vývoj a debugging – logování mezistavy:

use Petrovo\Logger\Logger;

Logger::debug('Processing order', [
    'order_id' => $orderId,
    'status'   => $order->status,
    'items'    => count($order->items),
]);

Okamžité chyby

Pokud se pokusíš logovat bez nastavení log souboru, dojde k RuntimeException:

use Petrovo\Logger\Logger;

// RuntimeException: Log file not set. Logger::setLogFile() first.
Logger::info('Message');

Řešení: vždy nastav log soubor na začátku aplikace.


Pokročilé scénáře

Logování s komplexními daty

Kontextová pole mohou obsahovat libovolné struktury:

use Petrovo\Logger\Logger;

Logger::error('Payment processing failed', [
    'transaction_id' => 'TXN-2024-001',
    'amount'         => 1500.50,
    'currency'       => 'CZK',
    'customer'       => [
        'id'    => $customerId,
        'name'  => $customerName,
        'email' => $email,
    ],
    'error_code'     => 'INSUFFICIENT_FUNDS',
    'retry_possible' => true,
]);

Výstup v log souboru:

2024-01-15 14:45:22 [error]: Payment processing failed [context]: {"transaction_id":"TXN-2024-001","amount":1500.5,"currency":"CZK","customer":{"id":123,"name":"John Doe","email":"john@example.com"},"error_code":"INSUFFICIENT_FUNDS","retry_possible":true}

Logování databázových chyb

use Petrovo\Logger\Logger;
use DB;

$result = DB::query("UPDATE users SET ... WHERE id = ?", [$userId]);

if (DB::$lastError) {
    Logger::error('Database update failed', [
        'query'   => DB::$lastQuery,
        'error'   => DB::$lastError,
        'user_id' => $userId,
    ]);
}

Logování API volání

use Petrovo\Logger\Logger;

$startTime = microtime(true);
$response = callExternalAPI($endpoint, $data);
$duration = microtime(true) - $startTime;

if ($response['status'] !== 'success') {
    Logger::warning('External API returned error', [
        'endpoint' => $endpoint,
        'status'   => $response['status'],
        'error'    => $response['message'] ?? null,
        'duration' => round($duration * 1000, 2) . 'ms',
    ]);
}

Čtení log souborů

Log soubory jsou prostý text, takže je můžeš číst standardními unix nástroji:

# Zobrazení posledních 100 řádků
tail -n 100 var/log/application.log

# Vyhledání chyb
grep "\[error\]" var/log/application.log

# Počet záznamů podle úrovně
grep -c "\[error\]" var/log/application.log
grep -c "\[warning\]" var/log/application.log

# Sledování v reálném čase
tail -f var/log/application.log

Best Practices

1. Nastav log soubor na začátku

// app/bootstrap.php
Logger::setLog('myapp');

2. Logguj s úrovní, která odpovídá situaci

  • emergency – jen když je systém zcela nefunkční
  • alert – kritická chyba vyžadující okamžitou akcí
  • critical – chyba komponenty, která zabrání některým funkcím
  • error – běžná chyba, kterou lze ošetřit
  • warning – anomálie, která si zaslouží pozornost
  • notice – normální ale významná situace
  • info – informace o důležitých akcích
  • debug – detaily pro vývoj

3. Přidej kontextová data

// ❌ Špatně
Logger::error('User not found');

// ✅ Dobře
Logger::error('User not found', ['user_id' => $userId]);

4. Bezpečnost – nikdy nelog hesla nebo tokeny

// ❌ Nikdy!
Logger::info('Login attempt', ['password' => $password]);

// ✅ Správně
Logger::info('Login attempt', ['username' => $username]);

5. Neloguj příliš mnoho na production

Debug logy se obvykle vypínají na production serveru. Chraň server před přetížením:

// ❌ Příliš mnoho logů
for ($i = 0; $i < 10000; $i++) {
    Logger::debug('Processing item', ['item' => $i]);
}

// ✅ Logguj jen důležité milníky
Logger::debug('Processing started', ['total_items' => 10000]);
// ... zpracování ...
Logger::debug('Processing completed', ['processed' => 10000]);