Przejdź do głównej zawartości

Logowanie i monitoring w aplikacji webowej

Co przekazesz słuchaczom?

Po tej prezentacji słuchacze będą w stanie:

  • Zrozumiec różnicę miedzy logowaniem a monitoringiem
  • Wiedzieć co i jak logowac w aplikacji webowej
  • Unikac typowych błędów w logowaniu (np. logowanie haseł)
  • Stosowac odpowiednie poziomy logow
  • Zrozumiec wartość logow w diagnostyce i bezpieczenstwie
  1. Wprowadzenie (2 min)

    • Dlaczego logowanie jest ważne
    • Różnica miedzy logami a monitoringiem
    • “U mnie działa” - problem diagnostyki
  2. Podstawy logowania (3 min)

    • Poziomy logow (DEBUG, INFO, WARN, ERROR)
    • Struktura dobrego logu
    • Logi aplikacji vs logi serwera
  3. Co logowac, czego nie logowac (3 min)

    • Zdarzenia warte logowania
    • Dane wrażliwe - czego unikac
    • Przykłady dobrych i złych logow
  4. Monitoring i alertowanie (2 min)

    • Od logow do metryk
    • Alerty i powiadomienia
    • Narzedzia monitoringu
  5. Podsumowanie (2 min)

    • Checklista logowania
    • Pytania i dyskusja

Logowanie to zapisywanie zdarzen w aplikacji w formie tekstu.

  • Szczegółowe informacje o zdarzeniach
  • Używane do debugowania i analizy
  • Przechowywane w plikach lub systemach logow
  • Retrospektywne - analizujemy po fakcie

Hierarchia poziomow logow

PoziomKiedy używaćPrzykład
DEBUGSzczegóły do debugowania”Query: SELECT * FROM users WHERE id=123”
INFONormalne zdarzenia”User 123 logged in successfully”
WARNPotencjalne problemy”API response słów: 2500ms”
ERRORBłędy wymagajace uwagi”Database connection failed”
FATALKrytyczne błędy”Application cannot start”

Zasada: Na produkcji zazwyczaj INFO i wyzej, DEBUG tylko przy debugowaniu.

[2024-01-15 10:30:45] [INFO] [auth-service] User login successful
- user_id: 123
- ip: 192.168.1.100
- method: password
  1. Timestamp - kiedy zdarzenie wystąpiło
  2. Poziom - INFO, WARN, ERROR, etc.
  3. Źródło - który moduł/serwis
  4. Wiadomość - co się stalo
  5. Kontekst - dodatkowe dane (ID, IP, etc.)

Loguj

  • Logowania i wylogowania
  • Nieudane proby logowania
  • Zmiany uprawnien
  • Operacje CRUD na ważnych danych
  • Błędy i wyjatki
  • Wolne zapytania
  • Zdarzenia biznesowe

NIE loguj

  • Haseł (nawet zahashowanych)
  • Tokenow sesji
  • Numerow kart kredytowych
  • Danych osobowych (PESEL, RODO)
  • Kluczy API i sekretow
  • Pełnych danych formularzy
+-------------+ +-------------+ +-------------+
| Aplikacja | --> | Logi | --> | Analiza |
| (zdarzenia) | | (pliki/db) | | (narzedzia) |
+-------------+ +-------------+ +-------------+
| | |
v v v
[Kod PHP] [error.log] [Kibana/Grafana]
FATAL [###] Aplikacja nie działa
|
ERROR [###] Cos poszło nie tak
|
WARN [###] Może być problem
|
INFO [###] Normalne działanie
|
DEBUG [###] Szczegóły techniczne
ZLE:
"Error occurred"
"User logged in"
"Password: secret123"
DOBRZE:
"[2024-01-15 10:30:45] [ERROR] [payment] Payment failed - user_id: 123,
reason: insufficient_funds, amount: 99.99"
"[2024-01-15 10:30:45] [INFO] [auth] Login successful - user_id: 123,
ip: 192.168.1.100"
<?php
// Podstawowe logowanie do pliku
function logMessage($level, $message, $context = []) {
$timestamp = date('Y-m-d H:i:s');
$contextStr = !empty($context) ? json_encode($context) : '';
$logLine = "[$timestamp] [$level] $message $contextStr\n";
error_log($logLine, 3, '/var/log/app/application.log');
}
// Użycie
logMessage('INFO', 'User logged in', ['user_id' => 123, 'ip' => $_SERVER['REMOTE_ADDR']]);
logMessage('ERROR', 'Database connection failed', ['error' => $e->getMessage()]);
<?php
class Logger {
const DEBUG = 0;
const INFO = 1;
const WARN = 2;
const ERROR = 3;
private $minLevel = self::INFO;
public function debug($message, $context = []) {
$this->log(self::DEBUG, 'DEBUG', $message, $context);
}
public function info($message, $context = []) {
$this->log(self::INFO, 'INFO', $message, $context);
}
public function warn($message, $context = []) {
$this->log(self::WARN, 'WARN', $message, $context);
}
public function error($message, $context = []) {
$this->log(self::ERROR, 'ERROR', $message, $context);
}
private function log($level, $levelName, $message, $context) {
if ($level >= $this->minLevel) {
$timestamp = date('Y-m-d H:i:s');
$contextJson = json_encode($context);
echo "[$timestamp] [$levelName] $message $contextJson\n";
}
}
}
<?php
// Logowanie proby logowania
function logLoginAttempt($username, $success, $ip) {
$status = $success ? 'SUCCESS' : 'FAILED';
$level = $success ? 'INFO' : 'WARN';
logMessage($level, "Login attempt $status", [
'username' => $username, // OK - nazwa użytkownika
'ip' => $ip,
'user_agent' => $_SERVER['HTTP_USER_AGENT']
// NIE logujemy hasła!
]);
}
// Logowanie podejrzanej aktywnosci
function logSuspiciousActivity($userId, $reason) {
logMessage('WARN', 'Suspicious activity detected', [
'user_id' => $userId,
'reason' => $reason,
'ip' => $_SERVER['REMOTE_ADDR'],
'timestamp' => time()
]);
}
<?php
function logJson($level, $event, $data = []) {
$log = [
'timestamp' => date('c'), // ISO 8601
'level' => $level,
'event' => $event,
'service' => 'web-app',
'data' => $data,
'request_id' => $_SERVER['HTTP_X_REQUEST_ID'] ?? uniqid()
];
file_put_contents(
'/var/log/app/app.json.log',
json_encode($log) . "\n",
FILE_APPEND
);
}
// Wynik:
// {"timestamp":"2024-01-15T10:30:45+00:00","level":"INFO",
// "event":"user.login","service":"web-app",
// "data":{"user_id":123},"request_id":"abc123"}

Wymagania minimalne:

  • Wyjaśnienie po co sa logi
  • Podanie 3 przykładów co logowac
  • Pokazanie 1 przykładu formatu logu
  • Omowienie różnic: logi aplikacji vs logi serwera
Ocena: 3.0 (minimum)

Co sprawdzić w logowaniu?

  1. Czy logujesz nieudane proby logowania?
  2. Czy logujesz ważne operacje biznesowe?
  3. Czy NIE logujesz haseł i danych wrazliwych?
  4. Czy logi maja timestamp i poziom?
  5. Czy dodajesz kontekst (user_id, request_id)?
  6. Czy masz rotacje logow (żeby nie zapełnić dysku)?
  7. Czy logi sa w spojnym formacie?
  8. Czy możesz łatwo przeszukiwac logi?

Pytanie 1

Dlaczego nigdy nie powinno się logowac haseł, nawet zahashowanych?

Pytanie 2

Jak logi pomagaja w wykrywaniu atakow (brute force)?

Pytanie 3

Kiedy używać poziomu DEBUG, a kiedy INFO?

Pytanie 4

Jak długo przechowywac logi? Jakie sa wymagania prawne?

Podstawy monitoringu

Metryki do sledzenia:

  • Czas odpowiedzi (response time)
  • Liczba requestow na sekunde (RPS)
  • Użycie CPU i pamieci
  • Liczba błędów (error rate)
  • Aktywni użytkownicy

Narzedzia:

  • Grafana - dashboardy
  • Prometheus - zbieranie metryk
  • ELK Stack - analiza logow
  • Sentry - sledzenie błędów