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

Entrée/Sortie Java Discussion :

Ecrire et lire un fichier


Sujet :

Entrée/Sortie Java

  1. #21
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    L'idéal serait de faire faire la suppression par l'application qui récupère le fichier et l'insère dans la base de données.
    (comme ça on est sûr d'avoir les données)

    Si l'application de récupération "passe" à minuit alors :
    1) elle récupère le fichier
    2) l'intègre dans la base
    3) le supprime du disque

  2. #22
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 560
    Points : 21 622
    Points
    21 622
    Par défaut
    Tu fais un peu comme tu veux.

    Définir un timer qui se lancera à minuit (c'est-à-dire dans exactement le temps qu'il faut pour aller de maintenant à minuit) devrait faire l'affaire.
    Après il faudrait plus de specs sur qu'est-ce qui se passe si le programme est arrêté et comment fait-on pour déterminer au redémarrage s'il faut effacer le fichier ou pas. On pourrait se baser sur sa date de dernière modification si c'est possible.

  3. #23
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    en général c'est plutot le process qui stocke dans le nosql qui va supprimer le fichier. Si tu te content de le supprimer à minuit, le process qui récupère le fichier et le balance sur noSql pourrait tout aussi bien tombersur le fichier vide ou incomplet.

    Ensuite, ta méthode "log", je la rendrait synchronized. Tu ne veux pas que deux utilisateurs se mélangent dans une même ligne du fichier ou que l'un écrase l'autre. Bref, ne pas écrire à deux en même temps dans le fichier.

    Enfin, ce que tu fait est déjà supporté par les logger existant (écriture dans un fichier, log rotate, ...) , donc pourquoi s'emmerder à réécrire la roue?

  4. #24
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Enfin, ce que tu fait est déjà supporté par les logger existant (écriture dans un fichier, log rotate, ...) , donc pourquoi s'emmerder à réécrire la roue?
    J'ai cru à une blague de ses collègues ... mais non ; il nous explique :
    il y a plusieurs produits possédant des fichiers logs
    Je crois que son entreprise veut rassembler tous les logs de plusieurs applications dispersées.
    Ces applications ne sont pas forcément hébergées sur un serveur d'application ou de bases de données.

    Par contre ce qui m'étonne c'est de ne pas utiliser un vrai produit capable de centraliser ces logs.
    Il me semble que Log4j est capable d'envoyer ses logs à un point central.

  5. #25
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    J'ai essayé avec ce code dans ma méthode log() mais ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DateTime moment1 = new DateTime(2015, 9, 22, 11, 27, 27);
     
            int heure = moment1.getHourOfDay();
            int minute = moment1.getMinuteOfDay();
            int seconde = moment1.getSecondOfDay();
     
            String newDate =  heure + ":" +minute + ":" + seconde;
            if (newDate == "11:50:00"){
                Path source = Paths.get("C:/JAVA/test.log");
                Files.delete(source);
            }

  6. #26
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 792
    Points
    4 792
    Par défaut
    @yoanlibert : avant toute chose, peux-tu ajouter une tâche de suppression de fichier
    au processus qui le récupère pour l'intégrer à la base nosql ?

  7. #27
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Désolé, je n'ai pas remarqué vos réponses, je vous remercie

    Citation Envoyé par Népomucène Voir le message
    J'ai cru à une blague de ses collègues ... mais non
    ... On joue pas à ça !!

    Je crois que son entreprise veut rassembler tous les logs de plusieurs applications dispersées.
    Ces applications ne sont pas forcément hébergées sur un serveur d'application ou de bases de données.
    C'est ce que je suis entraîne de faire

    Par contre ce qui m'étonne c'est de ne pas utiliser un vrai produit capable de centraliser ces logs.
    Il me semble que Log4j est capable d'envoyer ses logs à un point central.
    Effectivement, j'ai pensé à ça, d'ailleurs j'ai créé un pattern log4j :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    -<Configuration status="WARN">
     
     
    -<Properties>
     
    <!-- en producation -->
     
     
    <!-- <Property name="log-path">${jboss.server.log.dir}/traces</Property> -->
     
     
    <!-- En test -->
     
     
    <Property name="log-path">C:\JAVA\</Property>
     
    </Properties>
     
     
    -<Appenders>
     
     
    -<Console name="console-log" target="SYSTEM_OUT">
     
    <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
     
    </Console>
     
     
    -<RollingFile name="error-log" filePattern="${log-path}/tracabilite-%d{yyyy-MM-dd}.log" fileName="${log-path}/tracabilite.log">
     
     
    -<PatternLayout>
     
    <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n </pattern>
     
    </PatternLayout>
     
     
    -<Policies>
     
    <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
     
    </Policies>
     
    </RollingFile>
     
     
    -<Console name="traceConsole-log" target="SYSTEM_OUT">
     
    <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} %msg%n"/>
     
    </Console>
     
     
    -<RollingFile name="traceError-log" filePattern="${log-path}/actionTraceTracabilite-%d{yyyy-MM-dd}.log" fileName="${log-path}/actionTraceTracabilite.log">
     
     
    -<PatternLayout>
     
    <pattern>type=[%-5level] datetime %d{yyyy-MM-dd HH:mm:ss.SSS} adresse=[%t] nomLogger=%c{1} %msg%n </pattern>
     
    </PatternLayout>
     
     
    -<Policies>
     
    <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
     
    </Policies>
     
    </RollingFile>
     
    </Appenders>
     
     
    -<Loggers>
     
     
    -<Logger name="fr.dlsante" additivity="false" level="debug">
     
    <appender-ref level="error" ref="error-log"/>
     
    <appender-ref level="info" ref="console-log"/>
     
    </Logger>
     
     
    -<Logger name="loggerForActionTrace" additivity="false" level="debug">
     
    <appender-ref level="info" ref="traceError-log"/>
     
    <appender-ref level="info" ref="traceConsole-log"/>
     
    </Logger>
     
     
    -<Root additivity="false" level="info">
     
    <AppenderRef ref="console-log"/>
     
    <AppenderRef ref="traceConsole-log"/>
     
    </Root>
     
    </Loggers>
     
    </Configuration>
    Le problème c'est que je ne sais pas comment l'utiliser, sinon, tout est précisé dans le pattern !

  8. #28
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    @yoanlibert : avant toute chose, peux-tu ajouter une tâche de suppression de fichier
    au processus qui le récupère pour l'intégrer à la base nosql ?
    Pour les autres produits, les logs sont dans des BDD Postgres donc j'utilise des requêtes Curl des Rivers pour récupérer les logs et les indexés dans une base NoSQL, par contre pour mon application, on m'a demandé de stocker les logs dans un fichier, je sais qu'il faut ensuite les indexés dans la Base NoSQL à son tour mais je n'ai pas encore de processus pour le faire donc je me contente de faire une étape par étape.

  9. #29
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Si tu utilises log4j et que tu veux stocker les logs directement en base : développe ton propre Appender (http://logging.apache.org/log4j/1.2/.../Appender.html) qui permettra de gérer ça.

    Parce que franchement, passer par des fichiers de logs quotidien dont tu contrôlerai toi même la rotation/suppression, c'est très casse gueule (si vous me permettez l'expression)

    Pourquoi faire un appender spécifique? Parce que ça permet de toujours avoir ton application qui marche normalement avec log4j, ça permet de choisir comment intégrer les logs et à quel endroit écrire les logs, et ça permet d'éviter de réinventer la roue.
    Autre avantage? Ton système sera réutilisable partout ailleurs.

    Conseil pour bien faire : fait en sorte de développer un Appender asynchrone pour ne pas faire ralentir ton application : une file d'attente et des insertion faites au fur et à mesure des ajouts dans la file (avec une file synchronisée comme une LinkedTransferQueue : http://docs.oracle.com/javase/7/docs...sferQueue.html )

  10. #30
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Si tu utilises log4j et que tu veux stocker les logs directement en base : développe ton propre Appender (http://logging.apache.org/log4j/1.2/.../Appender.html) qui permettra de gérer ça.
    Ben non l'idée c'est l'inverse, il laisse log4j gérer le fichier, en créer un différent par jour puis il se fait un cron qui rappatrie tous les jour à 1h du mat dans noSQL le fichier de la veille et le problème est réglé proprement sans code foireux. Et l'admin est libre de gérer à l'avenir les log différement si il le désire sans devoir patcher l'application.

    Yoanlibert, une fois ton fichier log4j.xml créé, tu le met à la racine du classpath de ton application, et tu utilise les loggers de log4j directement. Pour l'insertion dans noSQL, tu fait ça simplement dans un cron si t'es sous linux ou une tâche sous windows, à l'extérieur de ton programme, qui tourne une fois par jour et rappatrie le fichier de la veille.

  11. #31
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    J'ai bossé dans une boîte où ils utilisaient de genre de système... Ben une chose est sûre : c'est dangereux !
    Se fier à des fichiers qui sont lus une fois par jour et qui sont effacés derrière, c'est prendre le risque de perdre des informations... 24h d'informations...

    A moins de stocker les fichiers log4j dans des archives zippées pendant un certains temps (et donc d'augmenter la complexité du système).


    A partir du moment où il existe un besoin métier de récupérer des informations, on essaye si possible de faire en sorte de limiter les intermédiaires et les moulinettes à fichiers qui vont bouger/lire/supprimer du fichier.

    Un truc con avec log4j que j'ai déjà eu, c'est le jour où le handler sur un fichier de log n'a pas voulu lâcher la main... Le rolling appender a fait son office et a créé un nouveau fichier pour la nouvelle journée, mais l'ancien était bloqué en lecture/écriture... Impossible à bouger et ça nous a fait planter certains batchs. Il a fallu redémarrer Tomcat pour qu'il accepte de lâcher son fichier.


    Je le répète : évitez de manipuler du fichier quand vous pouvez faire de l'alimentation en direct.

  12. #32
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Merci pour les réponses !

    Citation Envoyé par tchize_ Voir le message
    Yoanlibert, une fois ton fichier log4j.xml créé, tu le met à la racine du classpath de ton application, et tu utilise les loggers de log4j directement. Pour l'insertion dans noSQL, tu fait ça simplement dans un cron si t'es sous linux ou une tâche sous windows, à l'extérieur de ton programme, qui tourne une fois par jour et rappatrie le fichier de la veille.
    Mon fichier log4j.xml est bien créé, j'ai posté le contenu auparavant. Il est bien dans le classpath de mon application. J'ai essayé d'utiliser les loggers directement mais ça ne marche pas (peut être que je n'ai pas su comment faire mais bon !).
    Exp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Logger logger = Logger.getLogger(ConnexionController.class);
    		             logger.info(" La connexion est établie ! ");
    Le résultat est affiché dans la console est pas dans mon fichier !


    Si tu utilises log4j et que tu veux stocker les logs directement en base : développe ton propre Appender (http://logging.apache.org/log4j/1.2/.../Appender.html) qui permettra de gérer ça.

    Conseil pour bien faire : fait en sorte de développer un Appender asynchrone pour ne pas faire ralentir ton application : une file d'attente et des insertion faites au fur et à mesure des ajouts dans la file (avec une file synchronisée comme une LinkedTransferQueue : http://docs.oracle.com/javase/7/docs...sferQueue.html )
    Je regarde depuis tout à l'heure et j'avoue que je ne sais toujours pas comment faire ça, je ne suis qu'un novice en java donc


    Ce que je souhaite faire c'est :
    1- Créer un pattern log4j pour tracer tout ce qui se passe sur mon application et tout enregistrer dans un fichier ".log".
    2- Récupérer les traces de mon fichier ".log" chaque jour à 23h:30:00 et les indexés dans une base NoSQL (en utilisant un processus spécifique "Logstash").
    3- Vider chaque jour mon fichier ".log" à 00:00:00.

    Le "1" est à moitié fait, le "2" je sais déjà comment faire et le "3" pas encore !

Discussions similaires

  1. Ecrire et lire un fichier txt simultanément
    Par sir_nebuchadnezzar dans le forum Général Python
    Réponses: 9
    Dernier message: 02/02/2012, 20h53
  2. ecrire et lire un fichier txt
    Par ka123tn dans le forum Débuter
    Réponses: 13
    Dernier message: 01/08/2009, 20h28
  3. ecrire et lire un fichier .txt
    Par sky88 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 20/04/2008, 16h28
  4. Comment creer (ecrire et lire) un fichier ?
    Par fefe69 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 06/01/2008, 16h52
  5. [CSV] Ecrire et Lire un fichier Excel depuis PHP
    Par cocaetjusdorange dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2006, 11h10

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