Diferență între revizuiri ale paginii „Tipuri de loguri”

De la dexonline wiki
Sari la navigare Sari la căutare
m (Înlocuire de text - 'lexemId' în 'lexemeId')
Linia 18: Linia 18:
0 ms: [SHOW COLUMNS FROM `Source`]
0 ms: [SHOW COLUMNS FROM `Source`]
1 ms: [select * from Source WHERE 1 order by isOfficial desc, displayOrder]
1 ms: [select * from Source WHERE 1 order by isOfficial desc, displayOrder]
3 ms: [select distinct L.* from InflectedForm I, Lexem L where I.lexemId = L.id and I.formNoAccent = 'remuladă' order by L.formNoAccent]
3 ms: [select distinct L.* from InflectedForm I, Lexem L where I.lexemeId = L.id and I.formNoAccent = 'remuladă' order by L.formNoAccent]
72 ms: [SHOW COLUMNS FROM `Lexem`]
72 ms: [SHOW COLUMNS FROM `Lexem`]
</pre>
</pre>

Versiunea de la data 24 ianuarie 2018 17:07

Dexonline folosește mai multe sisteme de logare. Nu este o situație ideală și am ajuns la ea prin mulți ani de peticire a sistemului, :-) dar cel puțin încercăm să documentăm tipurile de informație care se loghează și unde.

phplib/debugInfo.php și debugUser

Biblioteca phplib/debugInfo.php oferă un mecanism pentru colectarea timpilor de rulare ai oricărei operații:

  • Funcția debug_init() este apelată automat din phplib/util.php.
  • Funcția debug_resetClock() trebuie apelată la începutul operației pe care doriți să o cronometrați.
  • Funcția debug_stopClock($message) trebuie apelată la sfârșitul operației. Ea adaugă mesajul dorit și timpul de rulare la un vector cu informații
  • Funcția debug_getDebugInfoAsHtml() întoarce un șir HTML, gata de a fi tipărit pe ecran, cu informațiile colectate.

În final, informațiile colectate arată astfel:

Pagină generată în 163 ms.
24 ms: [SHOW COLUMNS FROM `User`]
2 ms: [select * from User WHERE id = 1]
0 ms: [SHOW COLUMNS FROM `Source`]
1 ms: [select * from Source WHERE 1 order by isOfficial desc, displayOrder]
3 ms: [select distinct L.* from InflectedForm I, Lexem L where I.lexemeId = L.id and I.formNoAccent = 'remuladă' order by L.formNoAccent]
72 ms: [SHOW COLUMNS FROM `Lexem`]

Una dintre variabilele definite în dex.conf este debugUser. Când utilizatorul definit de debugUser este conectat, el va primi automat, la sfârșitul fiecărei pagini, informațiile de depanare colectate mai sus. În prezent, colectăm numai informațiile despre timpii de execuție ai căutărilor MySQL.


Idiorm

Idiorm și Paris pot raporta fiecare query SQL pe care îl execută. Această informație poate fi deosebit de utilă în cazul în care aveți o greșeală de sintaxă într-o căutare. În această situație, comportamentul lui Idiorm poate fi misterios.

Informațiile de depanare de la Idiorm sunt implicit dezactivate. Pentru a le activa, decomentați, la începutul fișierului phplib/db.php, linia ORM::configure('logging', true);. Apoi, puteți executa comenzi ca:

var_dump(ORM::get_query_log());
var_dump(ORM::get_last_query());

Query log

Căutările efectuate sunt logate împreună cu câteva informații de interes. Parametrii acestui log sunt setați în dex.conf:

  • logSearch indică dacă sistemul de logare este activ (0/1)
  • logPath indică numele fișierului log cu calea completă (/var/log/dex-query.log)
  • logResults indică câte rezultate trebuie logate pentru fiecare căutare. Vor fi afișate cel mult logResults ID-uri ale definițiilor întoarse ca rezultat.
  • logSampling indică ce fracțiune din căutări trebuie logate (0.00 - 1.00). Pe serverul principal, valoarea este 0.10. În mediul de dezvoltare, setați variabila la 1.00 pentru a loga toate căutările.

Clasa care se ocupă cu logarea este phplib/modelObjects.php:Log, funcția logData(). Formatul prezent al logului este o listă de valori delimitate prin \t. Acest format nu este perfect și va fi schimbat în viitor, deoarece nu se pretează la modificări.

Informațiile colectate în prezent sunt:

  • Cuvântul cu care am răspuns la căutare: oprobriu.
  • Cuvântul introdus de utilizator, dacă diferă de primul (dacă a avut loc o redirectare): oprobiu.
  • Tipul căutării, conform constantelor SEARCH_* definite în phplib/util.php.
  • Dacă utilizatorul este înregistrat sau anonim.
  • Designul (skinul) folosit: zepu, polar, mobile etc.
  • Preferințele utilizatorului, dacă sunt diferite de cele implicite.
  • Numărul de rezultate. Este vorba despre definiții. Căutările cu expresii regulate și cele aproximative, care întorc o listă de lexeme, vor lista 0 aici.
  • Lista de rezultate (definitionId), în limita parametrului logResults definit mai sus.
  • Dacă a avut loc o redirectare automată, de exemplu oprobiu -> oprobriu (greșeală de tipar) sau munceam -> munci (trimitere la forma de bază).
  • Data căutării.
  • Durata totală a scriptului, în milisecunde.

Rotirea query logului se face prin logrotate, conform parametrilor din /etc/logrotate.d/dexonline, în prezent cu conținutul:

/var/log/dex-query.log {
    weekly
    rotate 400
    missingok
    compress
}


Loguri de sistem

Ca de obicei, MySQL și Apache HTTP loghează informații în locurile obișnuite, în /var/log. Acestea pot fi utile. În special, vă recomandăm să colectați informații despre căutările lente din MySQL. În fișierul de configurare al serverului MySQL (de obicei /etc/mysql/my.cnf) puteți defini variabilele:

[mysqld]
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2

Aceasta va loga toate căutările care durează peste două secunde. Pe un sistem de dezvoltare, fără loadul din producție, acesta este un indiciu bun pentru un query neperformant.

Loguri vechi

Primul sistem de logare al dexonline a fost scris de la zero și nu prea deștept. Vezi phplib/logging.php. El mai este folosit și astăzi.

  • log/userlog loghează conectările / deconectările utilizatorilor și editările de definiții și de lexeme.
  • log/scriptlog loghează activitatea scripturilor din directorul tools/, din care multe rulează noaptea ca cron joburi.
  • log/dictlog loghează căutările efectuate prin protocolul DICT pe portul 2628.

Toate aceste loguri ar trebui unificate și mutate într-un director standard, cum ar fi /var/log/dexonline.