Overview
Comment: | Ajout d'une page permettant de lister les logs système |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
07e6f99b20f0bc1f8dae892d44948516 |
User & Date: | bohwaz on 2018-11-09 16:46:31 |
Other Links: | manifest | tags |
Context
2018-11-09
| ||
16:55 | Ajout de constantes de config permettant d'activer l'auto-reporting d'erreur et la page de visualisation des logs système check-in: c081cefd98 user: bohwaz tags: trunk | |
16:46 | Ajout d'une page permettant de lister les logs système check-in: 07e6f99b20 user: bohwaz tags: trunk | |
2018-11-07
| ||
10:56 | Correction typo check-in: f8de9226ce user: bohwaz tags: trunk, stable | |
Changes
Modified src/include/init.php from [bfe2446b5f] to [e2c365beec].
︙ | ︙ | |||
94 95 96 97 98 99 100 | 'CACHE_ROOT' => DATA_ROOT . '/cache', 'DB_FILE' => DATA_ROOT . '/association.sqlite', 'DB_SCHEMA' => ROOT . '/include/data/schema.sql', 'PLUGINS_ROOT' => DATA_ROOT . '/plugins', 'PREFER_HTTPS' => false, 'ALLOW_MODIFIED_IMPORT' => true, 'PLUGINS_SYSTEM' => '', | | | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | 'CACHE_ROOT' => DATA_ROOT . '/cache', 'DB_FILE' => DATA_ROOT . '/association.sqlite', 'DB_SCHEMA' => ROOT . '/include/data/schema.sql', 'PLUGINS_ROOT' => DATA_ROOT . '/plugins', 'PREFER_HTTPS' => false, 'ALLOW_MODIFIED_IMPORT' => true, 'PLUGINS_SYSTEM' => '', 'SHOW_ERRORS' => true, 'MAIL_ERRORS' => false, 'USE_CRON' => false, 'ENABLE_XSENDFILE' => false, 'SMTP_HOST' => false, 'SMTP_USER' => null, 'SMTP_PASSWORD' => null, 'SMTP_PORT' => 587, |
︙ | ︙ | |||
178 179 180 181 182 183 184 | } else { // PSR-0 autoload $filename = str_replace('\\', '/', $classname); $path = ROOT . '/include/lib/' . $filename . '.php'; } | | | 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | } else { // PSR-0 autoload $filename = str_replace('\\', '/', $classname); $path = ROOT . '/include/lib/' . $filename . '.php'; } if (!file_exists($path)) { throw new \Exception('File '.$path.' doesn\'t exists'); } self::$loaded[$classname] = true; |
︙ | ︙ | |||
210 211 212 213 214 215 216 | // activer l'envoi de mails si besoin est if (MAIL_ERRORS) { ErrorManager::setEmail(MAIL_ERRORS); } | | | | > | > > > | | | > > > > > > > > > > > > > > > > > > > > > | 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | // activer l'envoi de mails si besoin est if (MAIL_ERRORS) { ErrorManager::setEmail(MAIL_ERRORS); } ErrorManager::setContext([ 'rootDirectory' => ROOT, 'garradin_data_root' => DATA_ROOT, 'garradin_version' => garradin_version(), ]); ErrorManager::setRemoteReporting('https://garradin.eu/report/', false); ErrorManager::setProductionErrorTemplate('<!DOCTYPE html><html><head><title>Erreur interne</title> <style type="text/css"> body {font-family: sans-serif; } code, p, h1 { max-width: 400px; margin: 1em auto; display: block; } code { text-align: right; color: #666; } a { color: blue; } form { text-align: center; } </style></head><body><h1>Erreur interne</h1><p>Désolé mais le serveur a rencontré une erreur interne et ne peut répondre à votre requête. Merci de ré-essayer plus tard.</p> <p>Si vous suspectez un bug dans Garradin, vous pouvez suivre <a href="http://dev.kd2.org/garradin/Rapporter+un+bug">ces instructions</a> pour le rapporter.</p> <if(sent)><p>Un-e responsable a été notifié-e et cette erreur sera corrigée dès que possible.</p></if> <if(logged)><code>L\'erreur a été enregistrée dans le fichier error.log sous la référence : <b>{$ref}</b></code></if> <p><a href="' . WWW_URL . '">← Retour à la page d\'accueil</a></p> </body></html>'); ErrorManager::setHtmlHeader('<!DOCTYPE html><meta charset="utf-8" /><style type="text/css"> body { font-family: sans-serif; } * { margin: 0; padding: 0; } u, code b, i, h3 { font-style: normal; font-weight: normal; text-decoration: none; } #icn { color: #fff; font-size: 2em; float: right; margin: 1em; padding: 1em; background: #900; border-radius: 50%; } section header { background: #fdd; padding: 1em; } section article { margin: 1em; } section article h3, section article h4 { font-size: 1em; font-family: mono; } code { border: 1px dotted #ccc; display: block; } code b { margin-right: 1em; color: #999; } code u { background: #fcc; display: inline-block; width: 100%; } table { border-collapse: collapse; margin: 1em; } td, th { border: 1px solid #ccc; padding: .2em .5em; text-align: left; vertical-align: top; } input { padding: .3em; margin: .5em; font-size: 1.2em; cursor: pointer; } </style> <pre id="icn"> \__/<br /> (xx)<br />//||\\\\</pre> <section> <article> <h1>Une erreur s\'est produite</h1> <if(report)><form method="post" action="{$report_url}"><p><input type="hidden" name="report" value="{$report_json}" /><input type="submit" value="Rapporter l\'erreur aux développeur⋅euses de Garradin →" /></p></form></if> </article> </section> '); function user_error($e) { if (PHP_SAPI == 'cli') { echo $e->getMessage(); } |
︙ | ︙ |
Modified src/include/lib/Garradin/Template.php from [1f698e9c13] to [808469b185].
︙ | ︙ | |||
64 65 66 67 68 69 70 71 72 73 74 75 76 | $this->register_function('format_droits', [$this, 'formatDroits']); $this->register_function('csrf_field', function ($params) { return Form::tokenHTML($params['key']); }); $this->register_modifier('strlen', 'strlen'); $this->register_modifier('get_country_name', ['Garradin\Utils', 'getCountryName']); $this->register_modifier('format_sqlite_date_to_french', ['Garradin\Utils', 'sqliteDateToFrench']); $this->register_modifier('format_bytes', ['Garradin\Utils', 'format_bytes']); $this->register_modifier('format_tel', [$this, 'formatPhoneNumber']); $this->register_modifier('abs', 'abs'); $this->register_modifier('display_champ_membre', [$this, 'displayChampMembre']); | > | | 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | $this->register_function('format_droits', [$this, 'formatDroits']); $this->register_function('csrf_field', function ($params) { return Form::tokenHTML($params['key']); }); $this->register_modifier('strlen', 'strlen'); $this->register_modifier('dump', ['KD2\ErrorManager', 'dump']); $this->register_modifier('get_country_name', ['Garradin\Utils', 'getCountryName']); $this->register_modifier('format_sqlite_date_to_french', ['Garradin\Utils', 'sqliteDateToFrench']); $this->register_modifier('format_bytes', ['Garradin\Utils', 'format_bytes']); $this->register_modifier('format_tel', [$this, 'formatPhoneNumber']); $this->register_modifier('abs', 'abs'); $this->register_modifier('display_champ_membre', [$this, 'displayChampMembre']); $this->register_modifier('get_nom_compte', function ($compte) { if (is_null($compte)) { return ''; } if (!isset($this->liste_comptes)) |
︙ | ︙ |
Modified src/templates/admin/config/_menu.tpl from [53db92aa96] to [cd582bc2fa].
1 2 3 4 5 6 7 8 | <ul class="actions"> <li{if $current == 'index'} class="current"{/if}><a href="{$admin_url}config/">Général</a></li> <li{if $current == 'categories'} class="current"{/if}><a href="{$admin_url}config/categories/">Catégories de membres</a></li> <li{if $current == 'fiches_membres'} class="current"{/if}><a href="{$admin_url}config/membres.php">Fiche des membres</a></li> <li{if $current == 'site'} class="current"{/if}><a href="{$admin_url}config/site.php">Site public</a></li> <li{if $current == 'donnees'} class="current"{/if}><a href="{$admin_url}config/donnees/">Sauvegarde et restauration</a></li> <li{if $current == 'plugins'} class="current"{/if}><a href="{$admin_url}config/plugins.php">Extensions</a></li> </ul> | > | 1 2 3 4 5 6 7 8 9 | <ul class="actions"> <li{if $current == 'index'} class="current"{/if}><a href="{$admin_url}config/">Général</a></li> <li{if $current == 'categories'} class="current"{/if}><a href="{$admin_url}config/categories/">Catégories de membres</a></li> <li{if $current == 'fiches_membres'} class="current"{/if}><a href="{$admin_url}config/membres.php">Fiche des membres</a></li> <li{if $current == 'site'} class="current"{/if}><a href="{$admin_url}config/site.php">Site public</a></li> <li{if $current == 'donnees'} class="current"{/if}><a href="{$admin_url}config/donnees/">Sauvegarde et restauration</a></li> <li{if $current == 'plugins'} class="current"{/if}><a href="{$admin_url}config/plugins.php">Extensions</a></li> <li{if $current == 'logs'} class="current"{/if}><a href="{$admin_url}config/logs.php">Journaux</a></li> </ul> |
Added src/templates/admin/config/logs.tpl version [494547ec56].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | {include file="admin/_head.tpl" title="Journaux" current="config"} {include file="admin/config/_menu.tpl" current="logs"} <ul class="actions sub"> <li{if $type != 'errors'} class="current"{/if}><a href="{$self_url_no_qs}">Actions utilisateurs</a></li> <li{if $type == 'errors'} class="current"{/if}><a href="?type=errors">Erreurs système</a></li> </ul> {if isset($reports) && isset($id)} {foreach from=$main.errors item="error"} <h2>{$error.type}: {$error.message} [Code: {$error.errorCode}]</h2> {if !empty($error.backtrace)} {foreach from=$error.backtrace item=trace} <h4>{$trace.function}{if !empty($trace.args)} ({$trace.args|count} arg.){/if}</h4> <h5>{$trace.file}:{$trace.line}</h5> {if !empty($trace.args)} <table> {foreach from=$trace.args key=name item=arg} <tr> <th>{$name}</th> <td>{$arg}</td> </tr> {/foreach} </table> {/if} {if !empty($trace.code)} <pre>{foreach from=$trace.code item=line key=n}{if $n == $trace.line}<b>{$line}</b>{else}{$line}{/if}<br />{/foreach}</pre> {/if} {/foreach} {/if} {/foreach} {foreach from=$reports item=report} <h2>Occurence du {$report.context.date|date_fr}</h2> <h3>Contexte</h3> <table> {foreach from=$report.context key="k" item="v"} <tr> <th>{$k}</th> <td>{$v}</td> </tr> {/foreach} </table> {/foreach} {elseif isset($errors)} <p class="help"> Liste des erreurs système et de code rencontrées par Garradin. Cliquer sur un des bugs pour le rapporter aux développeur⋅euses de Garradin. </p> {if !count($errors)} <p class="alert">Aucune erreur n'a été trouvée dans le journal error.log</p> {else} <table class="list"> <thead> <tr> <th>Réf.</th> <td>Erreur</td> <td>Occurences</td> <td>Dernière fois</td> <td></td> </tr> </thead> <tbody> {foreach from=$errors item=error key=ref} <tr> <th><a href="?type=errors&id={$ref}">{$ref}</a></th> <td> {$error.message}<br /> <tt>{$error.source}</tt> </td> <td>{$error.count}</td> <td>{$error.last_seen|date_fr}</td> <td class="actions"><a title="Voir les détails" class="icn" href="?type=errors&id={$ref}">𝍢</a></td> </tr> {/foreach} </tbody> </table> {/if} {else} <p class="help"> Cette page permet de suivre les actions effectuées par les utilisateurs. </p> {if empty($list)} <p class="alert"> Aucune entrée dans le journal d'actions. </p> {/if} {/if} {include file="admin/_foot.tpl"} |
Added src/www/admin/config/logs.php version [708f1ed139].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php namespace Garradin; use KD2\ErrorManager; require_once __DIR__ . '/_inc.php'; if (qg('type') == 'errors') { $reports = ErrorManager::getReportsFromLog(null, qg('id')); $reports = array_reverse($reports, true); foreach ($reports as &$report) { $report->context->date = strtotime($report->context->date); } unset($report); $errors = []; if (qg('id')) { $tpl->assign('id', qg('id')); $tpl->assign('main', $reports[0]); $tpl->assign('reports', $reports); } else { foreach ($reports as $report) { if (!isset($errors[$report->context->id])) { $errors[$report->context->id] = [ 'message' => $report->errors[0]->message, 'source' => sprintf('%s:%d', $report->errors[0]->backtrace[0]->file, $report->errors[0]->backtrace[0]->line), 'count' => 0, ]; } $errors[$report->context->id]['last_seen'] = $report->context->date; $errors[$report->context->id]['count']++; } $tpl->assign('errors', $errors); } } $tpl->assign('type', qg('type')); $tpl->display('admin/config/logs.tpl'); |