Development #14191
système de log intégré
0%
Description
Plutôt que de compter sur le système de log trop générique de Django, avoir en avant un système dédié dans Passerelle.
1) Un modèle Log avec : timestamp, connecteur (type+slug), niveau de debug, ip source, apiuser, niveau de debug, message, extras (jsonfield), … -- ie un max de contexte de la request)
2) Dans BaseResource avoir des methode log_info, log_error, log_warn, log_error qui font ce qu'il faut dans Log puis envoient dans le logger Django.
3) Enfin, sur la page de présentation d'un connecteur, quand on a les droits (idem que ceux de l'affichage security), ajouter les x dernières lignes de log du connecteur concerné.
Fichiers
Demandes liées
Historique
Mis à jour par Josué Kouka il y a plus de 7 ans
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
- Patch proposed changé de Non à Oui
Un draft du patch final. Il reste la partie template, mais je voulais avoir des retours avant déja
Mis à jour par Frédéric Péters il y a plus de 7 ans
connector = '%s-%s' % (slugify(unicode(self.__class__.__name__)), self.slug)
Ça me semble plus pratique pour la suite d'avoir dans le modèle deux champs; un qui serait l'appname (il y a déjà une méthode get_connector_slug pour avoir ça) et l'autre pour le slug de l'objet.
def _log(self, levelname, message, request=None, **extra):
logger.whatever n'oblige pas l'évaluation immédiate des arguments, on fait par exemple self.logger.debug('new token: %s (timeout %ss)', token, timeout)
. On pourrait ne pas perdre ça ?
Il ne faut bien sûr pas logguer ce qui sort du log_level.
Je préférerais aussi vraiment qu'on remplace le self.logger = logging.getLogger(...) actuel par un self.logger = NotreObject, qui fasse le boulot sans demander des modifications dans tous les connecteurs.
connector = models.CharField(max_length=128, verbose_name='connector')
cf remarque plus haut. Aussi pour moi ça pourrait être NULL, j'imagine assez bien qu'on veuille logguer des trucs "généraux" (genre au démarrage logguer le numéro de version de passerelle).
ipsource = models.GenericIPAddressField(blank=True, null=True, unpack_ipv4=True,
unpack_ipv4 est à False par défaut côté Django, pourquoi ça nous déplait ?
Mis à jour par Thomas Noël il y a plus de 7 ans
Frédéric Péters a écrit :
Ça me semble plus pratique pour la suite d'avoir dans le modèle deux champs; un qui serait l'appname (il y a déjà une méthode get_connector_slug pour avoir ça) et l'autre pour le slug de l'objet.
et tant qu'à faire, ajouter un «endpoint» (qui peut être NULL, comme les autres).
Je préférerais aussi vraiment qu'on remplace le self.logger = logging.getLogger(...) actuel par un self.logger = NotreObject, qui fasse le boulot sans demander des modifications dans tous les connecteurs.
+1
ipsource = models.GenericIPAddressField(blank=True, null=True, unpack_ipv4=True,
unpack_ipv4 est à False par défaut côté Django, pourquoi ça nous déplait ?
J'ai pas d'avis, donc je dirais de laisser Django décider. Et pis ::ffff: ça fait moderne.
Mis à jour par Josué Kouka il y a plus de 7 ans
Mis à jour par Frédéric Péters il y a plus de 7 ans
def init(self, level, classname=None, appname=None, slug=None):
Je virerais le classname, et je passerais plutôt le appname au getLogger().
Plus loin il est utilisé pour faire resource_type/resource_pk mais comme je suggérais, je préférerais comme champs « un qui serait l'appname (il y a déjà une méthode get_connector_slug pour avoir ça) et l'autre pour le slug de l'objet ».
def debug(self, message, request=None, **extra):
Comme noté dans un commentaire précédent, logger.debug() n'a pas cette signature, on fait par exemple self.logger.debug('new token: %s (timeout %ss)', token, timeout)
.
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
D'avance désolé pour le template log_detail.html, j'attends vos retours.
Je suis parti pour une ListView qui /<connector>/<slug>/_logs/
et un DetailView /<connector>/<slug>/_logs/<pk>
.
Mis à jour par Josué Kouka il y a environ 7 ans
Mis à jour par Josué Kouka il y a environ 7 ans
Exemple de rendu
Mis à jour par Frédéric Péters il y a environ 7 ans
Bandeau corail, tu paies ta tournée à l'eoday.
À part ça je voyais les logs dans un pavé supplémentaire du connecteur.
Mis à jour par Benjamin Dauvergne il y a environ 7 ans
Il faudra au minimum un filtrage par date (voir admin Django elle est bien) parce qu'à 10 lignes par page ça va vite devenir galère à exploiter.
Mis à jour par Frédéric Péters il y a environ 7 ans
Il faudra au minimum un filtrage par date (voir admin Django elle est bien) parce qu'à 10 lignes par page ça va vite devenir galère à exploiter.
Ouaip; cela étant je laisserais à ce ticket un affichage basique, comme je l'écrivais dans un bloc de la page du connecteur, sur l'idée d'un "systemctl status ..." qui affiche juste les dix dernières lignes.
Ensuite et je vais créer un ticket immédiatement pour ça, l'ajout de fonctionnalités de filtres, puis d'autres encore. (filtres : #14671)
Mis à jour par Thomas Noël il y a environ 7 ans
Frédéric Péters a écrit :
Il faudra au minimum un filtrage par date (voir admin Django elle est bien) parce qu'à 10 lignes par page ça va vite devenir galère à exploiter.
Ouaip; cela étant je laisserais à ce ticket un affichage basique, comme je l'écrivais dans un bloc de la page du connecteur, sur l'idée d'un "systemctl status ..." qui affiche juste les dix dernières lignes.
Ca me va d'en avoir 50 par écran dans cette première mouture (ça va vite, les logs passerelle)
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier logrecords_arcgis.png logrecords_arcgis.png ajouté
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
- Les logs sont sur la meme page que le connecteur
- 10 log record par ecran
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
Frédéric Péters a écrit :
[...]
Sérieux ?
Désolé corrigé
Mis à jour par Frédéric Péters il y a environ 7 ans
J'écrivais :
Ça me semble plus pratique pour la suite d'avoir dans le modèle deux champs; un qui serait l'appname (il y a déjà une méthode get_connector_slug pour avoir ça) et l'autre pour le slug de l'objet.
Et je n'ai pas vu de commentaire là-dessus et pourtant tu continues avec un champ connector créé sur base de '%s-%s' % (self.appname, self.slug)
.
attr['message'] = message
Mais les substitutions de chaine qui peuvent se trouver dedans ?
- Resource Custom DB Loggger
Kamoulox ?
<th>{% trans 'Id' %}</th>
Sert à rien.
<th>{% trans 'Message preview' %}</th>
J'appellerais juste ça "Message".
passerelle/templates/passerelle/manage/log_detail.html
Laissons l'affichage d'un unique message de log à un autre ticket sinon on s'en sortira pas. (je viens de créer #14682)
<div id="logs"> {% if perms.base.view_resourcelog %}
Plutôt ne pas afficher du tout le pavé.
_logs/
(J'ai noté plus haut qu'on pouvait zapper cette partie pour ce ticket, mais pour l'avenir quand même, évitons les underscores dans les URL.)
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
Je pense avoir tout corrigé normalement.
Mis à jour par Josué Kouka il y a environ 7 ans
Mis à jour par Frédéric Péters il y a environ 7 ans
Fichier 0001-misc-fix-pep8-errors.patch
Je trouve une certaine valeur à pouvoir naviguer dans l'historique, les modifications d'indentation, elles m'ennuient plus qu'autre chose.
Fichier 0002-misc-add-import-of-PermissionDenied.patch
Certes, mais si tu tombes sur des bugs lors du développement d'une fonctionnalité, n'hésite pas à le noter dans de nouveaux tickets, plutôt que mêler ça à une revue de code pour autre chose.
Fichier 0003-add-integrated-log-system-14191.patch
Pourquoi ce passage à un _message qui est un encodage base64 du message ?
def __unicode__(self): return '%s %s %s' % (self.timestamp, self.loglevel, self.appname, self.slug)
Manque un %s.
loglevel = models.CharField(max_length=16, verbose_name='log level')
En fait ça serait pas mal d'avoir ça sous forme d'entier, ça sera plus facile ensuite pour filter genre "tout ce qui est au-dessus de erreur".
<th>Id</th>
Pourquoi pas de trad ?
<th>{% trans 'Ip Source' %}</th>
Dans la description du modèle, le verbose_name est "IP Address", ça sera bien d'avoir la même chose des deux côtés, et que "IP" soit en majuscules, bien sûr.
(pas terminé)
Mis à jour par Josué Kouka il y a environ 7 ans
- Lié à Bug #15380: PermissionDenied utilisé sans avoir été importé ajouté
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
Frédéric Péters a écrit :
Fichier 0001-misc-fix-pep8-errors.patch
Je trouve une certaine valeur à pouvoir naviguer dans l'historique, les modifications d'indentation, elles m'ennuient plus qu'autre chose.
Fichier 0002-misc-add-import-of-PermissionDenied.patch
Certes, mais si tu tombes sur des bugs lors du développement d'une fonctionnalité, n'hésite pas à le noter dans de nouveaux tickets, plutôt que mêler ça à une revue de code pour autre chose.
Fichier 0003-add-integrated-log-system-14191.patch
Pourquoi ce passage à un _message qui est un encodage base64 du message ?
C'est principalement pour mieux gérer tout ce qui est binaire et passe par lq log. Peut etre, une autre solution serait d'utiliser un FileField et d'y mettre tout ce que l'on reçoit comme message de la log.
[...]
Manque un %s.
[...]
En fait ça serait pas mal d'avoir ça sous forme d'entier, ça sera plus facile ensuite pour filter genre "tout ce qui est au-dessus de erreur".
[...]
Pourquoi pas de trad ?
[...]
Dans la description du modèle, le verbose_name est "IP Address", ça sera bien d'avoir la même chose des deux côtés, et que "IP" soit en majuscules, bien sûr.
(pas terminé)
Mis à jour par Frédéric Péters il y a environ 7 ans
C'est principalement pour mieux gérer tout ce qui est binaire et passe par lq log. Peut etre, une autre solution serait d'utiliser un FileField et d'y mettre tout ce que l'on reçoit comme message de la log.
Ça n'a pas de sens quand après au niveau de l'affichage du tape juste {{record.message}}. Les messages de log, c'est du texte, point.
Mis à jour par Josué Kouka il y a environ 7 ans
- Lié à Bug #15435: LoggedRequest: ne pas loguer le contenu des réponse dont content_type != text, json et html ajouté
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
On ne logue plus que du text avec ce patch
Mis à jour par Frédéric Péters il y a environ 7 ans
message = models.TextField(max_length=2048, verbose_name='message')
alors que très visiblement ça peut déborder, cf l'actuel REQUESTS_RESPONSE_CONTENT_MAX_LENGTH dont la valeur par défaut est 5000.
Mis à jour par Benjamin Dauvergne il y a environ 7 ans
log.message = message[:model._meta.get_field('message').max_length]
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
Mise à jour passé, je ressoumets le patch
Mis à jour par Frédéric Péters il y a environ 7 ans
Le patch ne s'applique pas, peut-être parce que trainent aussi dans ce ticket 0002-misc-add-import-of-PermissionDenied.patch et 0001-misc-fix-pep8-errors.patch. Il y a moyen de les dégager vers leurs propres tickets ? (Et si possible de faire sans le deuxième (sérieusement))
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0002-fix-generic-family-test-14191.patch 0002-fix-generic-family-test-14191.patch ajouté
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
Frédéric Péters a écrit :
Le patch ne s'applique pas, peut-être parce que trainent aussi dans ce ticket 0002-misc-add-import-of-PermissionDenied.patch et 0001-misc-fix-pep8-errors.patch. Il y a moyen de les dégager vers leurs propres tickets ? (Et si possible de faire sans le deuxième (sérieusement))
Désolé corrigé. C'est le second qui posait problème.
Le patch 2 corrige un test qui échouait à cause des modifs de ce tickets.
Mis à jour par Frédéric Péters il y a environ 7 ans
- Fichier 0001-log-panel-style.patch 0001-log-panel-style.patch ajouté
C'est chiant à modifier plus tard, faisons le tout de suite. "Source IP", pas "IP Source", ça vaut aussi et surtout pour le nom de l'attribut.
Question rendu, les autres sections de la page, endpoints et security, sont dans des blocs, le style doit être identique ici. À propos du style aussi, trop facilement ça s'étale sur plusieurs lignes et ça rend la lecture difficile, donc il faudrait s'assurer que date et heure tiennent sur une ligne, et question lisibilité aussi, il faut aligner à gauche le message. Dans le tableau level, 10, 20, etc. ça ne va parler à personne, plutôt s'épargner cette colonne et poser une classe. Et "Id" ça me semble ne servir strictement à rien, on peut aussi virer cette colonne.
Sur ces modifs de style, elles se trouvent dans le patch attaché.
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0002-fix-generic-family-test-14191.patch 0002-fix-generic-family-test-14191.patch ajouté
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
J'ai intégré ton patch dans 0001.
Mis à jour par Frédéric Péters il y a environ 7 ans
Il y avait une petite part pour toi quand même : C'est chiant à modifier plus tard, faisons le tout de suite. "Source IP", pas "IP Source", ça vaut aussi et surtout pour le nom de l'attribut.
Et ça n'a pas bougé :
('ipsource', models.GenericIPAddressField(null=True, verbose_name='IP Source', blank=True)),
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0002-fix-generic-family-test-14191.patch 0002-fix-generic-family-test-14191.patch ajouté
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
Frédéric Péters a écrit :
Il y avait une petite part pour toi quand même : C'est chiant à modifier plus tard, faisons le tout de suite. "Source IP", pas "IP Source", ça vaut aussi et surtout pour le nom de l'attribut.
Et ça n'a pas bougé :
[...]
Désolé, done.
Mis à jour par Frédéric Péters il y a environ 7 ans
Ça vaut aussi et surtout pour le nom de l'attribut.
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0002-fix-generic-family-test-14191.patch 0002-fix-generic-family-test-14191.patch ajouté
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
Frédéric Péters a écrit :
Ça vaut aussi et surtout pour le nom de l'attribut.
+1
Mis à jour par Josué Kouka il y a environ 7 ans
Josué Kouka a écrit :
Frédéric Péters a écrit :
Ça vaut aussi et surtout pour le nom de l'attribut.
+1
(pas fini)
Mis à jour par Josué Kouka il y a environ 7 ans
- Fichier 0002-fix-generic-family-test-14191.patch 0002-fix-generic-family-test-14191.patch ajouté
- Fichier 0001-add-integrated-log-system-14191.patch 0001-add-integrated-log-system-14191.patch ajouté
Je pense que tout est ok now.
Mis à jour par Frédéric Péters il y a environ 7 ans
Je pense que tout est ok now.
Pour vérifier, c'est facile, il suffit de chercher dans le patch "ip source" ou "ip source".
Hint: il en reste un.
Mis à jour par Josué Kouka il y a environ 7 ans
Mis à jour par Frédéric Péters il y a environ 7 ans
Il y a encore de quoi discuter mais passons, ack.
Mis à jour par Frédéric Péters il y a environ 7 ans
Hint: il en reste un.
Et comme un boulet je ne vérifie pas et bim, le patch qui suit ne corrige pas ça.
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Fermé
add integrated log system (#14191)