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

Java Discussion :

Gestion de fichier de log


Sujet :

Java

  1. #1
    Membre confirmé
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 74
    Par défaut Gestion de fichier de log
    Bonjour ou bonsoir...

    J'ai une (des) application(s) qui font du logging.
    Un fichier pour reçevoir le stream standard (System.out) et un fichier pour recevoir le stream d'erreur (System.err).

    Une redirection des styreams out et err vers des fichiers.

    Mais, actuellement, ces deux fichiers sont stocker dans un répertoire du profile utilisateur.
    Si j'avais besoin de faire du support, je me connectais sur le serveur en mode administrateur et j'allais dans le répertoire adhoc consulter les fichiers logs.

    Sauf que la parano des admins ont décider de mettre en place une solution zero-trust avec une solution nommée cyber-ark.
    Donc, pour faire du support utilisateur, il faut que je me connecte sur la plate-formce cyber-ark, MFA, arriver sur le serveur, et faire le support...

    Dès lors, je me demande s'il serait pas plus simple que les fichiers logs soit mis ailleurs, dans le répertoire d'installation de l'application, ce serait plus facile.
    Sauf que plusieurs personnes peuvent utiliser l'application..

    La contrainte est que la méthode de redirection est avant la fenêtre qui demande le logging utilisateur.

    Alors, je me demande s'il serait pas possible de faire:

    création de deux fichier temporaire
    mise en place redirection vers les deux fichiers temporaire
    renommer les deux fichiers temporaire vers <login>.err.log & <login>.out.log

    Mais, ma question est : Est-ce que cela est possible ?
    faut-il faire un genre de switch log (remise en place redirection par défaut après loggin, renommer les fichiers temporaire et puis refaire la redirection) ?

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 567
    Par défaut
    Hello,

    faut-il faire un genre de switch log (remise en place redirection par défaut après loggin, renommer les fichiers temporaire et puis refaire la redirection) ?
    Ça me semble pas mal, faudrait voir ce que vous proposez...

    Sinon il existe des Frameworks de logging qui font ça comme Logback ou Log4j2

    Si vous avez la possibilité de modifier le code pour intégrer un de ces frameworks, ce serait la solution la plus robuste et la plus simple à maintenir, je pense...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre confirmé
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 74
    Par défaut
    Inclure un framework risque d'être compliqué, c'est un programme qui à 25 ans et qui est utilisé en tant que programme avec interface graphique, mais aussi intégrer comme package dans deux autres applications plus backend.

  4. #4
    Membre confirmé
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 74
    Par défaut
    Voici ce que j'ait fais :

    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
    private void initLog()
    		{
    		// Generate random filename
     
    		int leftLimit = 48; // numeral '0'
    		int rightLimit = 122; // letter 'z'
    		int targetStringLength = 10;
    		Random random = new Random();
     
    		String generatedString = random.ints(leftLimit, rightLimit + 1)
    						.filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
    						.limit(targetStringLength)
    						.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
    						.toString();
     
    		temporary_logfilename_out = generatedString+"."+XinosConstants.LOGFILE_OUT;
    		temporary_logfilename_err  = generatedString+"."+XinosConstants.LOGFILE_ERR;
     
    		try	{
    			// test if log folder exist, if not create it
    		  String path_home = System.getProperty("user.dir")+File.separator+XinosConstants.LOGDIR;
     
    		 // File creation = new File(HOME + File.separator + XinosConstants.LOGDIR);
    			File creation = new File(path_home);
    			if (creation.isDirectory() == false)
    				creation.mkdir();
     
    			console2 = System.err;
    			fpError = new FileOutputStream(path_home + File.separator + temporary_logfilename_err);
    			System.setErr(new PrintStream(fpError, true));
     
    			console = System.out;
    			fpLog = new FileOutputStream(path_home + File.separator + temporary_logfilename_out);
    			System.setOut(new PrintStream(fpLog, true));
    			}
    		catch (FileNotFoundException e)
    			{
    			System.err.println("redirection  System.setErr impossible : " + e);
    			}
    		}
    et après authenfication :

    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
     
    private void switchLog()
    		{
    		try {
    			Path srcOutStreamPath = null, srcErrStreamPath, targetOutStreamPath = null, targetErrStreamPath = null;
    			String path_home = System.getProperty("user.dir")+File.separator+XinosConstants.LOGDIR;
     
    			real_logfilename_err = userInfo.getLogin()+"."+XinosConstants.LOGFILE_ERR;
    			real_logfilename_out = userInfo.getLogin()+"."+XinosConstants.LOGFILE_OUT;
     
    			// Switch to standard and default out & err output stream
     
    			System.setOut(console);
    			System.setErr(console2);
     
    			fpLog.close();
    			fpError.close();
     
    			srcOutStreamPath = Paths.get(path_home+File.separator+temporary_logfilename_out);
    			targetOutStreamPath = Paths.get(path_home+File.separator+real_logfilename_out);
    			Files.copy(srcOutStreamPath, targetOutStreamPath, StandardCopyOption.REPLACE_EXISTING);
     
    			srcErrStreamPath = Paths.get(path_home+File.separator+temporary_logfilename_err);
    			targetErrStreamPath = Paths.get(path_home+File.separator+real_logfilename_err);
    			Files.copy(srcErrStreamPath, targetErrStreamPath, StandardCopyOption.REPLACE_EXISTING);
     
    			fpError = new FileOutputStream(path_home + File.separator + real_logfilename_err, true );
    			System.setErr(new PrintStream(fpError, true));
     
    			fpLog = new FileOutputStream(path_home + File.separator + real_logfilename_out, true);
    			System.setOut(new PrintStream(fpLog, true));
     
     
    			Files.delete(srcOutStreamPath);
    			Files.delete(srcErrStreamPath);
    			}
    		catch (IOException io_err)
    			{
    			System.err.println("switchLog > failed to move from temporay log file to real log file : " + io_err);
    			}
    		}

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 567
    Par défaut
    Ça semble fonctionnel pour du mono-utilisateur par machine, mais pour du multi-utilisateurs concurrents, il faudra un minimum ajouter des timestamps dans le nom des fichiers.

    Les problèmes restants,

    • Fenêtre de perte de logs : Entre System.setOut(console) et la réouverture, tout output est perdu. Si une exception survient pendant switchLog(), les logs ne sont plus capturés.
    • Concurrence multi-utilisateur : Si le même login se connecte deux fois simultanément, REPLACE_EXISTING écrase le fichier actif de l'autre session. Les logs s'entremêlent.
    • Cleanup des temporaires : Si l'app crash avant switchLog(), les fichiers temporaires persistent indéfiniment.
    • Permissions user.dir : Fonctionne uniquement si l'app s'exécute depuis un répertoire accessible en écriture.


    L'approche copie + suppression fonctionne, mais présente encore quelques risques...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre confirmé
    Homme Profil pro
    dev. full stack
    Inscrit en
    Octobre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : dev. full stack
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2016
    Messages : 74
    Par défaut
    • Fenêtre de perte de logs : Entre System.setOut(console) et la réouverture, tout output est perdu. Si une exception survient pendant switchLog(), les logs ne sont plus capturés.
      Elle seront affichée dans la console (j'utilise pas javaw)
    • Concurrence multi-utilisateur : Si le même login se connecte deux fois simultanément, REPLACE_EXISTING écrase le fichier actif de l'autre session. Les logs s'entremêlent.
      Il y a un cas où il peut avoir deux fois le même utilisateur qui se connecte, c'est pour des formations, sinon, il y a tjrs un seul utilisateur qui se connecte à la version de son application.
      A la limite, je pourrais créer un compte pour les formations...
    • Cleanup des temporaires : Si l'app crash avant switchLog(), les fichiers temporaires persistent indéfiniment.
      Effectivement, mais si crash, cela posera un problème pour le fonctionnement de l'application => intervention de ma part.
    • Permissions user.dir : Fonctionne uniquement si l'app s'exécute depuis un répertoire accessible en écriture.
      Ce qui est le cas

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 567
    Par défaut
    Bon ben voilà je ne vois rien d'autre à ajouter, ça semble globalement correct
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

Discussions similaires

  1. [Débutant] Gestion de Fichier LOGs
    Par Ancalimeo dans le forum VB.NET
    Réponses: 6
    Dernier message: 12/09/2014, 22h43
  2. log de gestion des fichiers
    Par ilyace dans le forum Windows
    Réponses: 2
    Dernier message: 21/10/2011, 16h15
  3. [log4j] Gestion de plusieurs fichiers de logs
    Par bapfuror dans le forum Logging
    Réponses: 5
    Dernier message: 18/04/2008, 13h17
  4. gestion de fichiers log
    Par ricault dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 21/11/2007, 17h37
  5. Gestion de fichier log
    Par Seth77 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/05/2007, 23h32

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