Projet

Général

Profil

Development #14191

système de log intégré

Ajouté par Thomas Noël il y a plus de 7 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Josué Kouka
Version cible:
-
Début:
01 décembre 2016
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

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

0001-add-integrated-log-system-14191.patch (8,42 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 11 janvier 2017 16:07
0001-add-integrated-log-system-14191.patch (12,1 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 16 janvier 2017 09:43
0001-add-integrated-log-system-14191.patch (19,3 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 18 janvier 2017 16:24
0001-add-integrated-log-system-14191.patch (18,7 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 18 janvier 2017 16:31
Screenshot from 2017-01-18 16-38-49.png (262 ko) Screenshot from 2017-01-18 16-38-49.png Josué Kouka, 18 janvier 2017 16:41
logrecords_arcgis.png (144 ko) logrecords_arcgis.png Josué Kouka, 19 janvier 2017 15:05
0001-add-integrated-log-system-14191.patch (19,5 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 19 janvier 2017 15:05
0001-add-integrated-log-system-14191.patch (19,3 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 19 janvier 2017 15:19
0001-add-integrated-log-system-14191.patch (14,6 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 19 janvier 2017 16:37
0003-add-integrated-log-system-14191.patch (15,7 ko) 0003-add-integrated-log-system-14191.patch Josué Kouka, 01 mars 2017 18:37
0002-misc-add-import-of-PermissionDenied.patch (766 octets) 0002-misc-add-import-of-PermissionDenied.patch Josué Kouka, 01 mars 2017 18:37
0001-misc-fix-pep8-errors.patch (4,47 ko) 0001-misc-fix-pep8-errors.patch Josué Kouka, 01 mars 2017 18:37
0001-add-integrated-log-system-14191.patch (15,6 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 13 mars 2017 09:44
0001-add-integrated-log-system-14191.patch (14,8 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 20 mars 2017 15:06
0001-add-integrated-log-system-14191.patch (14,7 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 24 mars 2017 10:23
0002-fix-generic-family-test-14191.patch (871 octets) 0002-fix-generic-family-test-14191.patch Josué Kouka, 24 mars 2017 15:13
0001-add-integrated-log-system-14191.patch (14,8 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 24 mars 2017 15:13
0001-log-panel-style.patch (4,42 ko) 0001-log-panel-style.patch Frédéric Péters, 29 mars 2017 20:48
0002-fix-generic-family-test-14191.patch (871 octets) 0002-fix-generic-family-test-14191.patch Josué Kouka, 30 mars 2017 15:48
0001-add-integrated-log-system-14191.patch (16,4 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 30 mars 2017 15:48
0002-fix-generic-family-test-14191.patch (871 octets) 0002-fix-generic-family-test-14191.patch Josué Kouka, 30 mars 2017 15:58
0001-add-integrated-log-system-14191.patch (16,4 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 30 mars 2017 15:58
0002-fix-generic-family-test-14191.patch (871 octets) 0002-fix-generic-family-test-14191.patch Josué Kouka, 30 mars 2017 16:13
0001-add-integrated-log-system-14191.patch (16,4 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 30 mars 2017 16:13
0002-fix-generic-family-test-14191.patch (871 octets) 0002-fix-generic-family-test-14191.patch Josué Kouka, 30 mars 2017 16:28
0001-add-integrated-log-system-14191.patch (16,4 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 30 mars 2017 16:28
0002-fix-generic-family-test-14191.patch (871 octets) 0002-fix-generic-family-test-14191.patch Josué Kouka, 30 mars 2017 16:45
0001-add-integrated-log-system-14191.patch (16,4 ko) 0001-add-integrated-log-system-14191.patch Josué Kouka, 30 mars 2017 16:45

Demandes liées

Lié à Passerelle - Bug #15380: PermissionDenied utilisé sans avoir été importé Fermé10 mars 2017

Actions
Lié à Passerelle - Bug #15435: LoggedRequest: ne pas loguer le contenu des réponse dont content_type != text, json et htmlFermé14 mars 2017

Actions
Lié à Passerelle - Development #14671: logs : filtresFermé13 janvier 201718 avril 2018

Actions

Révisions associées

Révision bbb7e430 (diff)
Ajouté par Josué Kouka il y a environ 7 ans

add integrated log system (#14191)

Révision 9388339e (diff)
Ajouté par Josué Kouka il y a environ 7 ans

misc: fix tests (#14191)

Historique

#1

Mis à jour par Josué Kouka il y a plus de 7 ans

  • Assigné à mis à Josué Kouka
#2

Mis à jour par Josué Kouka il y a plus de 7 ans

  • Statut changé de Nouveau à En cours
#3

Mis à jour par Josué Kouka il y a plus de 7 ans

Un draft du patch final. Il reste la partie template, mais je voulais avoir des retours avant déja

#4

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 ?

#5

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.

#7

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).

#8

Mis à jour par Josué Kouka il y a environ 7 ans

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>.

#10

Mis à jour par Josué Kouka il y a environ 7 ans

Exemple de rendu

#11

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.

#12

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.

#13

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)

#14

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)

#15

Mis à jour par Josué Kouka il y a environ 7 ans

  • Les logs sont sur la meme page que le connecteur
  • 10 log record par ecran
#16

Mis à jour par Frédéric Péters il y a environ 7 ans

- </div>
+ </dv>

Sérieux ?

#17

Mis à jour par Josué Kouka il y a environ 7 ans

Frédéric Péters a écrit :

[...]

Sérieux ?

Désolé corrigé

#18

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 ?

  1. 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.)

#19

Mis à jour par Josué Kouka il y a environ 7 ans

Je pense avoir tout corrigé normalement.

#21

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é)

#22

Mis à jour par Josué Kouka il y a environ 7 ans

  • Lié à Bug #15380: PermissionDenied utilisé sans avoir été importé ajouté
#23

Mis à jour par Josué Kouka il y a environ 7 ans

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é)

#24

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.

#25

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é
#26

Mis à jour par Josué Kouka il y a environ 7 ans

On ne logue plus que du text avec ce patch

#27

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.

#28

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

log.message = message[:model._meta.get_field('message').max_length]
#29

Mis à jour par Josué Kouka il y a environ 7 ans

Mise à jour passé, je ressoumets le patch

#30

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))

#31

Mis à jour par Josué Kouka il y a environ 7 ans

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.

#32

Mis à jour par Frédéric Péters il y a environ 7 ans

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é.

#34

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)),
#35

Mis à jour par Josué Kouka il y a environ 7 ans

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.

#36

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.

#37

Mis à jour par Josué Kouka il y a environ 7 ans

Frédéric Péters a écrit :

Ça vaut aussi et surtout pour le nom de l'attribut.

+1

#38

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)

#40

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.

#42

Mis à jour par Frédéric Péters il y a environ 7 ans

Il y a encore de quoi discuter mais passons, ack.

#43

Mis à jour par Josué Kouka il y a environ 7 ans

  • Statut changé de En cours à Résolu (à déployer)
#44

Mis à jour par Josué Kouka il y a environ 7 ans

#45

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.

#46

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF