IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

[Sydney] Meilleur pratique d'alimentation d'un log


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 102
    Points
    102
    Par défaut [Sydney] Meilleur pratique d'alimentation d'un log
    Bonjour,

    J'ouvre ce post pour poser une question qui devrait intéresser plusieurs personnes.

    J'ai créer une application de gestion de portefeuille, sous Win/Android/iOS. L'application se connecte à une base Oracle via un serveur IIS.
    On voudrait que l'application cliente crèe un log afin de tracer certaines situations. La création du log horodaté du jour se ferait en début de programme. Au fil de l'application, le log serait alimenté.
    Un bouton permettrait d'afficher le log dans un TMemo.

    Voici la question : Comment faire ?

    Ce que j'ai essayé et qui ne marche QUE sous Windows :
    - utilisation d'outil ancien : AssignFile, Rewrite, Writeln et CloseFile. C'est parfait sous Windows 64
    - C'est KO sous Android et iOS à cause des caractères accentués. Il faut spécifier l'utilisation de l'UTF8, pas possible avec les anciens outils.

    Dans une autre discussion, un poil différente, je teste TFile... qui pour le moment, ne fonctionne pas bien.

    Toute idée sera la bienvenue :-)

    Cordialement

    Carmichael

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    pourquoi pas un TStringList ?

    après écrire de l'UTF8 dans un fichier n'est pas bien compliqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      str: UTF8String;
    begin
      // vers un Stream
      Stream.Write(str[1], Length(Str));
     // vers un file
      BlockWrite(f, Str[1], Length(Str));
    end;
    après l'usage de WriteLn() est pratique avec sa mise en forme automatique...mais j'ai réalisé une unité CrtSock il y a quelques années qui permettait d'utiliser ReadLn/WriteLn vers un "socket"...donc qui à créer l'équivalent pour un fichier UTF8 n'est pas la mer à boire.

    Après je viens de voir qu'on peut préciser une page de code dans AssignFile()


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      AssignFile(Outfile, 'test.txt', CP_UTF8);
    ça marche pas déjà ça ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Paul Toth
    AssignFile(Outfile, 'test.txt', CP_UTF8);
    c'est la première chose qui m'est venue à l'esprit, mais je n'ai pas eu le temps de faire de test et donc n'avais pas répondu à la question sur l'autre fil.

    Maintenant, vu qu'il y a BDD, j'aurai eu tendance à mettre le log directement dans celle-ci et non dans un fichier texte local mais le contexte ne permet peut-être pas ce genre de chose
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Le plus simple actuellement est par TFile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TFile.AppendAllText(LogFile, Text, TEncoding.UTF8);

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    Merci des différentes contributions.

    Le but est de créer un fichier de log, qui peut par exemple être activé en plaçant le client en mode debug.
    Puisque l'idée est de savoir POST MORTEM ce qui s'est passé lorsque l'application plante, il vaut mieux que l'application trace le plus vite possible les traces de passage dans le code.
    A la relance de l'application, on pourra consulter ce qui s'est passé la fois précédente.

    Plusieurs personnes ont proposé d'utiliser TFile, ou de définir un flux. Il s'agit de 2 bonnes idées.
    Je laisse tomber l'usage de TStringList qui ne sauvegardera pas les lignes dans un fichier le plus vite possible.

    Exemple court de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      fic := System.IOUtils.TPath.GetDocumentsPath + PathDelim + 'FichierDeTraces.log';
      if (TFile.Exists(fic)) then TFile.Delete(fic);
      TFile.AppendAllText(fic, 'Création du fichier'+ sLineBreak, TEncoding.utf8);
      TFile.AppendAllText(fic,'Les élèves vont à l''école'+ sLineBreak, TEncoding.utf8);

    sLineBreak permet de faire un retour à la ligne valable sous Win/Android/iOS

    Cordialement

    Carmichael

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    une base sqlite ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    Ecrire un log d'IHM dans une base de données présuppose que l'accès à la base fonctionne.
    Or un log applicatif sert justement lorsqu'il y a une défaillance du logiciel.
    En dehors des erreurs de jeunesse de l'application, le plus souvent les plantages proviennent de données incorrectes, ou d'un souci réseau.

    L'usage des logs prend alors tout son sens, puisque l'on peut consulter le fichier de log post mortem, et connaitre la raison de la défaillance.
    Enfin, si l'application le prévoit, on la passe en mode debug et le log devient verbeux.

    Cordialement

    Carmichael

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Sans doute mais l'exemple de code montre l'utilisation d'un fichier en local.
    Une base SQLite n'est jamais qu'un fichier en local qui n'a rien à faire du réseau.
    La connexion à ce genre de "fichier" est tellement rapide que 3 lignes suffisent pour enregistrer une ligne de log.
    Ouverture, Log, Fermeture.
    C'est tout aussi rapide et fiable qu'un fichier texte.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 61
    Dernier message: 29/12/2016, 12h58
  2. [information] meilleures pratiques pour gestion d'events
    Par trolldom dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/07/2007, 13h24
  3. [session] Meilleures pratiques d'utilisation de session
    Par jvajva dans le forum Hibernate
    Réponses: 3
    Dernier message: 21/05/2007, 11h44
  4. Réponses: 2
    Dernier message: 19/03/2007, 16h41
  5. MSSQL: Meilleures pratiques/Best practices
    Par spyne dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/08/2006, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo