Zápis do log súboru php. Prihlasovanie v PHP. Výpis skriptu na zapisovanie údajov do súboru denníka

  • 03.11.2019

V každom skutočnom PHP aplikácie sa z času na čas vyskytnú chyby a výnimky, vyskakujú varovania, správy. Ak tieto informácie (log) nezaznamenáme, potom v určitom okamihu nebude možné pochopiť, v ktorej časti aplikácie sa tieto chyby a výnimky vyskytujú, a preto ich nebudeme môcť vyriešiť. Okrem toho existujú situácie, kedy je logovanie udalostí a akcií jednoducho nevyhnutné, ako napríklad v prípade prihlásenia a odhlásenia užívateľa do systému.

IN PHP už má potrebné protokolovacie zariadenia: funkcia error_log()– na odoslanie správy do systémového denníka, funkcia set_error_handler() na zachytenie upozornení a chýb. Tieto funkcie možno použiť na vlastnú správu chýb, čo vývojárovi kódu poskytne kontrolu nad logikou spracovania chýb a filtrovania.

Tento nízkoúrovňový prístup však má za následok časté duplikovanie kódu a čo je dôležitejšie, takýto kód je náchylnejší na chyby. Na pomoc programátorovi preto prichádzajú hotové komponenty, dobre otestované a overené v „bojových“ podmienkach.

Tieto komponenty zahŕňajú komponent zend-log od framework Zend. Komponent zend log možno použiť ako viacúčelový ťažobný komponent, akýsi jack-of-all-traves. Podporuje mnoho formátov protokolových správ a typov protokolovacích databáz (súbory, databázy), plus má dobre vyvinutý systém filtrovania správ a mnohé ďalšie. Tiež zend log kompatibilné s PSR-3ťažobný štandard. Nainštalované takto:

Skladateľ vyžaduje zendframework/zend-log

Používa sa nasledovne (napríklad sa používa súbor index.php v koreňovom adresári projektu):

Vyžadovať "vendor/autoload.php";

Použite Zend\Log\Logger;
použite Zend\Log\Writer\Stream;

$logger = nový Logger;

// odosielanie chýb do konzoly
$writer = new Stream("php://ouput");

$logger -> addWriter($writer);
$logger -> log(Logger::INFO,"Niektoré informácie");

Výsledok spustenia vyššie uvedeného kódu:

2017-09-26T10:40:34+03:00 INFO(6): Niektoré informácie

Výsledný reťazec obsahuje čas udalosti, prioritu a správu. Formát výstupnej správy je možné v prípade potreby pomocou metódy určite zmeniť setFormatter(). Štandardne je riadok denníka opísaný nasledujúcim vzorom:

%timestamp% %priorityName% (%priority%): %správa% %extra%

  1. %timestamp% je časová pečiatka
  2. %priorityName% - textový štítok priority
  3. %priority% - číselné označenie priority
  4. %message% - správa
  5. %extra% - voliteľná hodnota pre dodatočné informácie

Ak chcete zmeniť formát správy, postupujte takto:

$formatter = new Zend\Log\Formatter\Simple("správa %správa%" . PHP_EOL);
$writer -> setFormatter($formatter);

Komponent zend log možno použiť aj na zaznamenávanie chýb a výnimiek zo samotného interpreta PHP. Na tento účel existujú dve statické metódy v triede Logger: Logger::registerErrorHandler($logger)- zachytiť chyby a Logger::registerExceptionHandler($logger)- chytať výnimky.

Použite Zend\Log\Logger;
použite Zend\Log\Writer;

$logger = nový Logger;
$writer = nový Writer\Stream(__DIR__ . "/test.log");
$logger->addWriter($writer);

// Zaznamenať chyby
Logger::registerErrorHandler($logger);

// Zaznamenať výnimky
Logger::registerExceptionHandler($logger);

Ako už bolo spomenuté, zend log nám poskytuje možnosť filtrovania správ pre logovanie, t.j. pred napísaním správy do logu môžeme zistiť, či spĺňa naše kritériá a ak áno, zapíšeme si ju.

Tu je príklad:

$filter = new Zend\Log\Filter\Priority(Logger::CRIT);

// metóda addFilter rozhrania Writer
$writer->addFilter($filter);

V tomto príklade zaznamenáme iba tie správy, ktorých priorita je menšia alebo rovná kritickej ( Logger::CRIT).

Úplný zoznam priorít definovaných v triede Zend\Log\Logger:

Const EMERG = 0; // Zlyhanie: systém je nepoužiteľný
const ALERT = 1; // Upozornenie: Je potrebné urýchlene konať
const CRIT = 2; // Kritická situácia
constERR = 3; // Omyl
const WARN = 4; // Varovanie
const OZNÁMENIE = 5; // Pozor
const INFO = 6; // Informácie
constDEBUG=7; // Ladiť, ladiť

Správy môžeme filtrovať aj na základe regulárnych výrazov, časových pečiatok atď. Touto cestou, prihlásenie do PHP- to je dôležitá a niekedy potrebná vec vo vývoji webových aplikácií.

Na serióznych stránkach je zvláštne vidieť, keď sa používateľovi v prehliadači zobrazia chyby na najneočakávanejších miestach. Prečo sa objavujú, je samostatný rozhovor. Ale prečo sa ukazujú? Koniec koncov, text chýb je informácia na ladenie a je určená pre vývojára a nie pre klienta.

Okrem toho sú to práve tieto servisné informácie, ktoré zvyčajne pomáhajú zlým hackerom zlomiť stránku. Klasickým príkladom by bolo vytlačenie dotazu na chybu: "máte chybu v dotaze blízko WHERE id= " ... Ďakujem veľmi pekne. Za "WHERE id=..." nahradíme reťazec "0 OR 1>0" a dotaz sa vykoná pre celú tabuľku. Ak žiadosť o vymazanie, tak ... chápete, je to zábava =). Preto premenné v dotazoch vždy uzatváram do úvodzoviek. Keby niečo...

Ale nechal som sa uniesť. Dnes to nie je o tom. Dnes si povieme, ako sa vyhnúť zobrazovaniu chýb klientovi a zároveň uložiť všetky správy správcovi webu na pamiatku.

Začnime krátkym prehľadom typov chýb v PHP.

Tabuľka 1. Popisy chýb v PHP4(pôvodný zoznam)
Numerický
význam
Neustále Popis Chytený / nie
1 E_ERROR fatálne chyby. Napríklad chyba pri prístupe do pamäte. Vykonávanie skriptu sa potom preruší. nie
2 E_UPOZORNENIE Varovania (nezávažné chyby). Vykonávanie skriptu nie je prerušené. Áno
4 E_PARSE Chyby pri analýze syntaxe. generované syntaktickým analyzátorom. nie
8 E_NOTICE Poznámky (menej závažné chyby ako upozornenia). Označuje situáciu, ktorá môže spôsobiť závažnejšiu chybu, ale môže sa vyskytnúť aj počas bežnej činnosti skriptu. Áno
16 E_CORE_ERROR Chyby pri načítavaní PHP. Analóg E_ERROR, generovaný jadrom PHP. nie
32 E_CORE_WARNING Varovania pred zaťažením PHP Podobné ako E_WARNING, generované jadrom PHP. nie
64 E_COMPILE_ERROR Závažné chyby počas kompilácie kódu. Analóg E_ERROR generovaný motorom Zend. nie
128 E_COMPILE_WARNING Varovania počas kompilácie kódu. Analóg E_WARNING, generovaný motorom Zend. nie
256 E_USER_ERROR Chyba používateľa. Áno
512 E_USER_WARNING Vlastné upozornenie. Áno
1024 E_USER_NOTICE Poznámka používateľa Áno

Zaujímajú nás tie chyby, ktoré dokážeme zachytiť. Patria sem: E_WARNING, E_NOTICE a E_USER_*. Iné typy chýb nie je možné zachytiť, či už preto, že sa vyskytnú ešte pred dokončením načítania samotného PHP jadra, alebo sa vyskytnú vo fáze parsovania a kompilácie PHP kódu, takže ich výstup bude musieť byť jednoducho vypnutý :

ini_set("zobraziť_chyby",0);

Ale predpokladám, že naše skripty sú dostatočne odladené na to, aby nemali elementárne syntaktické chyby, takže by sme o nič nemali prísť.

Predvolená chybovosť PHP je E_ALL & ~E_NOTICE (alebo 2039 v číselnej forme), čo znamená, že ignorujeme upozornenia, ale hlásime všetky ostatné chyby.

Preto zmeňte úroveň výstupu chyby na E_ALL:

error_reporting(E_ALL);

Teraz predefinujme obslužný program chýb a namiesto neho nahraďte našu funkciu, ktorá sa teraz bude zaoberať riešením chýb:

set_error_handler("log používateľa");

Pozrime sa na túto funkciu podrobnejšie. Prechádza 5 parametrami:

  • kód chyby
  • text chyby
  • názov súboru, v ktorom sa vyskytla chyba
  • riadok v súbore
  • variabilné pole

Táto funkcia nie je povinná nič vrátiť. Keďže si chybový protokol budeme prezerať neskôr, musíme si protokol zapísať napríklad do súboru, aby sa nám s ním neskôr pohodlne pracovalo.

( LOG_ROTATE===true ) ( $i=1; //prečítajte si staré protokoly v adresári, kým (is_file(LOG_FILE_NAME.".".$i)) ( $i++; ) $i--; //zvýšiť číslo o 1 pre každú z nich postupne, zatiaľ čo ($i>0) ( premenovať(LOG_FILE_NAME."..."..$i,LOG_FILE_NAME. "." .(1+$i--)); ) premenovať (LOG_FILE_NAME,LOG_FILE_NAME ".1"); dotknite sa (LOG_FILE_NAME); ) elseif(is_file(LOG_FILE_NAME)) ( //ak píšeme protokoly zhora, potom odstráňte //a znova vytvorte prázdny súbor unlink(LOG_FILE_NAME); dotknite sa (LOG_FILE_NAME) ;) ) /* skontrolujte, či taký súbor existuje, ak nie - môžeme ho vytvoriť, ak existuje - môžeme doň zapisovať */ if(!is_file(LOG_FILE_NAME)) ( if (!touch(LOG_FILE_NAME)) ( návrat "nedá sa vytvoriť súbor denníka"; ) ) elseif( !is_writable(LOG_FILE_NAME)) ( return "nie je možné zapisovať do súboru denníka"; ) //všimnite si funkciu , do ktorého zapíšeme log. error_log($err_str, 3, LOG_FILE_NAME); ) ?>

Dalo by sa, samozrejme, na takéto účely použiť aj logickejšie úložisko – databázu, ale koniec koncov, chyby sa väčšinou vyskytujú práve pri práci s databázou, takže by som sa na to nespoliehal.

Vlastne, to je všetko. Zvyšok, myslím, pre vás nebude ťažký, najmä ak použijete súbor (); &explode(); . A ak áno, môžete použiť [tu je tento kód].

Očakávajúc otázku „prečo som nepoužil CSV, ktorý by sa v tejto situácii zdalo logické?“, odpovedám: chybové hlásenia môžu obsahovať neznámy počet servisných znakov (aka čiarky a bodkočiarky), čo by zjavne sťažovalo analyzovať CSV. A nebudem si prezerať denník v Exceli.

Ďalšie myšlienky na túto tému:

  • keď je protokol gz neaktuálny, "uložte súbor a vložte ho do archívu;
  • to isté, ale s balíkom poštou;
  • ak sa vyskytnú kritické chyby, pošlite e-mail (pozri príklad z manuálu funkcie

Prihlásenie do PHP znamená, aké typy chýb vám bude vaša webová aplikácia / stránka / php skript hlásiť a ako.

Existujú 2 (3) hlavné spôsoby, ako získať chyby z aplikácie:

  1. Výstup týchto chýb priamo na obrazovku
  2. Zaznamenanie týchto chýb do špeciálneho súboru denníka
  3. alebo obe možnosti naraz: zobrazenie týchto chýb na obrazovke a ich zápis do špeciálneho súboru denníka

Spravidla sa praktizuje, že pri vývoji (na lokálnom prostredí) sa všetky chyby zobrazujú priamo na obrazovke, aby sa dali ľahšie a rýchlejšie zachytiť a opraviť a v produkčnom prostredí (na produkcii) sú chyby sa vôbec nezobrazujú (pretože pre používateľa sú to zbytočné informácie) a všetky informácie o nich sa zapisujú do log súboru, ktorý si vývojár pravidelne prezerá.

Chyba nastavení protokolovania

  1. chybové hlásenie je najdôležitejším parametrom. Je zodpovedný za to, aké typy chybových hlásení sa budú zobrazovať/zapisovať do log súboru. Domnievam sa, že tu je možné použiť len 2 možnosti:
    • -1 (alebo E_ALL) - hlásia sa všetky typy chýb;
    • 0 - nie sú hlásené žiadne typy chýb

    Odporúčam používať výhradne -1 (alebo E_ALL).
    Pretože aplikácia by v zásade nemala mať žiadne chyby. Túto možnosť je možné nastaviť cez konfiguračný súbor v php.ini alebo priamo v php skripte zavolaním funkcie chybové hlásenie:

    chybové hlásenie(-1); error_reporting(E_ALL);

    Mimochodom, toto je jediná možnosť dostupná v PHP ako funkcia. Všetky ostatné možnosti je možné nastaviť len úpravou konfiguračného súboru php.ini alebo volaním funkcie ini_set() odovzdanie mu potrebného parametra a hodnoty.

  2. display_errors- tento parameter je zodpovedný za priame zobrazenie chýb na obrazovke potom, čo sa skutočne vyskytli. Tento parameter je možné nastaviť na 0 alebo 1 alebo Zap./Vyp. Tie. buď zobrazuje chyby na obrazovke alebo nie.
  3. display_startup_errors- táto možnosť je zodpovedná za zobrazenie chýb, ktoré sa vyskytli po spustení PHP. Ak sa napríklad v konfiguračnom súbore vyskytne chyba syntaxe, zobrazia sa informácie o nej. Tento parameter je možné nastaviť na 0 alebo 1 alebo Zap./Vyp.
  4. log_errors- táto direktíva je zodpovedná za zapisovanie chybových hlásení do log súboru. Tento parameter je možné nastaviť na 0 alebo 1 alebo Zap./Vyp. Tie. zapisovať chyby do denníka alebo nie.
  5. error_log- toto nastavenie je zodpovedné za cestu k súboru (súboru protokolu), v ktorom budú zaznamenané všetky chyby aplikácie, ktoré sa vyskytli
  6. html_errors- rovnaká možnosť je zodpovedná za formát zobrazenia chýb aplikácie. Ak je nastavená na 1 alebo On, potom sa chyba zobrazí pomocou HTML, t.j. tam bude stopa pôvodu chyby a všetko bude dosť informatívne a farebné. Ak je toto nastavenie nastavené na 0 alebo Off, chyby sa zobrazia ako obyčajný text na malom počte riadkov.

1. Nastavenia zobrazovania chýb na obrazovke




ini_set("html_errors", 1);
ini_set("log_errors", 0);

2. Nastavenia pre zápis chýb do súboru denníka

chybové hlásenie(-1); // ini_set("hlásenie_chyby", -1);
ini_set("display_errors", 0);
ini_set("display_startup_errors", 0);
ini_set("log_errors", 1);

3. Nastavenia pre súčasné zobrazovanie chýb a ich zaznamenávanie do log súboru

chybové hlásenie(-1); // ini_set("hlásenie_chyby", -1);
ini_set("zobraziť_chyby", 1);
ini_set("display_startup_errors", 1);
ini_set("log_errors", 1);
ini_set("html_errors", 1);
ini_set("error_log", "/var/log/php/error.log");

Tieto možnosti je možné nastaviť aj v konfiguračnom súbore php.ini alebo vo vašom súbore virtuálneho hostiteľa.

Väčšina otázok na stránke začína „Pomoc, nejde to, nespustí sa...“. Všetky odpovede sa týkajú tipov a rád, ale neviem, prečo ma nenapadlo napísať článok o tom, ako a kde hľadať chyby alebo o používaní logov skôr. Preto vypĺňame medzeru a každému odporúčam prečítať si tento článok.

Log (protokoly) - (Angličtina) log, možno ste už videli súbory *.log) spravidla textový súbor, v ktorom sa v chronologickom poradí nachádza zoznam udalostí, denník udalostí, denník, záznam, protokol atď. Protokoly vytvárajú rôzne programy, služby, operačné systémy. Každý program môže mať svoj vlastný protokol (textový súbor).

Pri vývoji stránky sú denníky vytvorené:
1. protokoly na úrovni operačného systému:
- Tento počítač - Ovládací panel - Nástroje na správu - Zobrazovač udalostí
- Tento počítač - Spustiť - "eventvwr.msc"


To zahŕňa záznamy všetkých udalostí v operačnom systéme Windows. Vrátane, tu, na kartách:
- Vlastné zobrazenia / administratívne udalosti
- Denníky/systém Windows

Môžete nájsť protokoly súvisiace so službou Apache (ak webový server Apache beží ako služba) a ďalšie chyby spôsobené napríklad rozšíreniami php. Celkovo sú tu zaznamenané všetky chyby systému Windows. Apache je ako služba považovaná za súčasť Windowsu, takže ak sa pri spúšťaní služby Apache vyskytne nejaká chyba, musíte tu hľadať dešifrovanie tejto chyby. Ďalej, ak dešifrovanie chyby v protokoloch neumožňuje pochopiť, v čom je problém, skopírujte hlavné časti protokolu na google a vyhľadajte podobné problémy. S najväčšou pravdepodobnosťou nájdete odpovede, ktoré vám pomôžu. Keď spustíte akúkoľvek hru, program, službu, keď sa vyskytne chyba, v protokoloch sa objaví nový záznam s podrobnejším popisom chyby. Na základe toho vždy nájdete odpoveď na internete.

2. Protokoly úrovne Apache:
okrem denníkov Windows si Apache sám vytvára vlastný denník vo forme textového súboru. Pri inštalácii a konfigurácii webového servera Apache v súbore httpd.conf je tam riadok: ErrorLog "C:/apache/error.log", kde "C:/apache/error.log" je cesta k súboru denníka webového servera Apache. Nastavte si cestu alebo si len pamätajte, že v prípade chýb pri spúšťaní Apache musíte tento súbor otvoriť a nájsť najnovšie záznamy, ktoré budú odrážať dôvody chýb. Okrem toho vám webový server Apache umožňuje vytvárať protokoly samostatne pre každého virtuálneho hostiteľa. Príklad virtuálnych hostiteľov v súbore conf/extra/httpd-vhosts.conf:


DocumentRoot "C:/apache/symfony/www/web"
Symfónia názov servera
ServerAlias ​​www.symfony
ErrorLog "C:/apache/symfony/error.log"
CustomLog "C:/apache/symfony/access.log" bežné


DocumentRoot "C:/apache/phpmyadmin"
ServerName phpmyadmin
ServerAlias ​​www.phpmyadmin
ErrorLog "C:/apache/phpmyadmin/error.log"
CustomLog "C:/apache/phpmyadmin/access.log" bežné

3. protokoly úrovne php:
pri nastavovaní php config v súbore php.ini, na konfiguráciu zobrazenia protokolov nájdeme nasledujúce riadky:

error_reporting = E_ALL & ˜E_NOTICE & ˜E_STRICT //druhy a typy zaznamenaných zobrazených chýb
log_errors = Zapnuté // povoliť protokolovanie
log_errors_max_len = 1024 //určenie maximálnej veľkosti súboru denníka (1024 bajtov)
error_log = php_errors.log //zadajte názov súboru, do ktorého sa budú protokoly ukladať, tieto súbory sa vytvoria v koreňovom adresári vášho virtuálneho hostiteľa. Každý hostiteľ bude mať svoj vlastný súbor.

Okrem toho, že sa do súboru zapíšu všetky chyby php, môžete aj počas vykonávania php skriptu vytvárať protokoly pomocou funkcie error_log. To môže byť užitočné, ak aktívne používate try ... catch in your code, v takom prípade sa skripty v prípade kritických chýb neukončia a všetky neočakávané chyby budú vždy zaznamenané v protokoloch.

skús (
$r = 5/0;
) catch (Exception $exc) (
error_log($exc->getMessage());
}

Na základe výsledkov vykonania tohto kódu v súbore denníka php_errors.log vloží sa riadok podobný tomuto:

Upozornenie PHP: Delenie nulou v C:\apache\test\www\index.php v riadku 5

To je všetko, používajte protokoly všade, kde je to možné, a rýchlo nájdete chyby v kóde a dôvody nesprávneho spracovania údajov.

483