Comment écrire des journaux dans un fichier texte lors de l’utilisation de java.util.logging.Logger

J’ai une situation dans laquelle je veux écrire tous les journaux créés par moi pour écrire dans un fichier texte.

Nous utilisons l’API java.util.logging.Logger pour générer les journaux.

j’ai essayé

private static Logger logger = Logger.getLogger(className.class.getName()); FileHandler fh; fh = new FileHandler("C:/className.log"); logger.addHandler(fh); 

Mais toujours obtenir mes journaux sur la console seulement ….

Essayez cet exemple. Ça marche pour moi.

 public static void main(Ssortingng[] args) { Logger logger = Logger.getLogger("MyLog"); FileHandler fh; try { // This block configure the logger with handler and formatter fh = new FileHandler("C:/temp/test/MyLogFile.log"); logger.addHandler(fh); SimpleFormatter formatter = new SimpleFormatter(); fh.setFormatter(formatter); // the following statement is used to log any messages logger.info("My first log"); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } logger.info("Hi How ru?"); } 

Produit la sortie sur MyLogFile.log

 Apr 2, 2013 9:57:08 AM testing.MyLogger main INFO: My first log Apr 2, 2013 9:57:08 AM testing.MyLogger main INFO: Hi How ru? 

Modifier:

Pour supprimer le gestionnaire de console, utilisez

 logger.setUseParentHandlers(false); 

puisque ConsoleHandler est enregistré avec le consignateur parent dont dérivent tous les consignateurs.

Premièrement, où avez-vous défini votre enregistreur et de quelle classe \ méthode avez-vous essayé de l’appeler? Il y a un exemple de travail, cuit au four:

 public class LoggingTester { private final Logger logger = Logger.getLogger(LoggingTester.class .getName()); private FileHandler fh = null; public LoggingTester() { //just to make our log file nicer :) SimpleDateFormat format = new SimpleDateFormat("M-d_HHmmss"); try { fh = new FileHandler("C:/temp/test/MyLogFile_" + format.format(Calendar.getInstance().getTime()) + ".log"); } catch (Exception e) { e.printStackTrace(); } fh.setFormatter(new SimpleFormatter()); logger.addHandler(fh); } public void doLogging() { logger.info("info msg"); logger.severe("error message"); logger.fine("fine message"); //won't show because to high level of logging } } 

Dans votre code, vous avez oublié de définir le formateur, si vous en avez besoin d’un simple, vous pouvez le faire comme je l’ai mentionné ci-dessus, mais il y a une autre option, vous pouvez la formater vous-même .setFormatter (nouveau code SimpleFormatter ()) suivant):

 fh.setFormatter(new Formatter() { @Override public Ssortingng format(LogRecord record) { SimpleDateFormat logTime = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss"); Calendar cal = new GregorianCalendar(); cal.setTimeInMillis(record.getMillis()); return record.getLevel() + logTime.format(cal.getTime()) + " || " + record.getSourceClassName().subssortingng( record.getSourceClassName().lastIndexOf(".")+1, record.getSourceClassName().length()) + "." + record.getSourceMethodName() + "() : " + record.getMessage() + "\n"; } }); 

Ou toute autre modification que vous voulez. J’espère que cela aide.

Une bonne bibliothèque disponible nommée log4j pour Java .
Cela fournira de nombreuses fonctionnalités. Passez par le lien et vous trouverez votre solution.

 import java.io.IOException; import org.apache.log4j.Appender; import org.apache.log4j.FileAppender; import org.apache.log4j.Logger; import org.apache.log4j.SimpleLayout; /** * @author Kiran * */ public class MyLogger { public MyLogger() { } public static void main(Ssortingng[] args) { Logger logger = Logger.getLogger("MyLog"); Appender fh = null; try { fh = new FileAppender(new SimpleLayout(), "MyLogFile.log"); logger.addAppender(fh); fh.setLayout(new SimpleLayout()); logger.info("My first log"); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } logger.info("Hi How ru?"); } } 

C’est peut – être ce dont vous avez besoin …

 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; /** * LogToFile class * This class is intended to be use with the default logging class of java * It save the log in an XML file and display a friendly message to the user * @author Ibrabel  */ public class LogToFile { protected static final Logger logger=Logger.getLogger("MYLOG"); /** * log Method * enable to log all exceptions to a file and display user message on demand * @param ex * @param level * @param msg */ public static void log(Exception ex, Ssortingng level, Ssortingng msg){ FileHandler fh = null; try { fh = new FileHandler("log.xml",true); logger.addHandler(fh); switch (level) { case "severe": logger.log(Level.SEVERE, msg, ex); if(!msg.equals("")) JOptionPane.showMessageDialog(null,msg, "Error", JOptionPane.ERROR_MESSAGE); break; case "warning": logger.log(Level.WARNING, msg, ex); if(!msg.equals("")) JOptionPane.showMessageDialog(null,msg, "Warning", JOptionPane.WARNING_MESSAGE); break; case "info": logger.log(Level.INFO, msg, ex); if(!msg.equals("")) JOptionPane.showMessageDialog(null,msg, "Info", JOptionPane.INFORMATION_MESSAGE); break; case "config": logger.log(Level.CONFIG, msg, ex); break; case "fine": logger.log(Level.FINE, msg, ex); break; case "finer": logger.log(Level.FINER, msg, ex); break; case "finest": logger.log(Level.FINEST, msg, ex); break; default: logger.log(Level.CONFIG, msg, ex); break; } } catch (IOException | SecurityException ex1) { logger.log(Level.SEVERE, null, ex1); } finally{ if(fh!=null)fh.close(); } } public static void main(Ssortingng[] args) { /* Create simple frame for the example */ JFrame myFrame = new JFrame(); myFrame.setTitle("LogToFileExample"); myFrame.setSize(300, 100); myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); myFrame.setLocationRelativeTo(null); JPanel pan = new JPanel(); JButton severe = new JButton("severe"); pan.add(severe); JButton warning = new JButton("warning"); pan.add(warning); JButton info = new JButton("info"); pan.add(info); /* Create an exception on click to use the LogToFile class */ severe.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae) { int j = 20, i = 0; try { System.out.println(j/i); } catch (ArithmeticException ex) { log(ex,"severe","You can't divide anything by zero"); } } }); warning.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae) { int j = 20, i = 0; try { System.out.println(j/i); } catch (ArithmeticException ex) { log(ex,"warning","You can't divide anything by zero"); } } }); info.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae) { int j = 20, i = 0; try { System.out.println(j/i); } catch (ArithmeticException ex) { log(ex,"info","You can't divide anything by zero"); } } }); /* Add the JPanel to the JFrame and set the JFrame visible */ myFrame.setContentPane(pan); myFrame.setVisible(true); } } 

L’emplacement du fichier journal peut être contrôlé via le fichier logging.properties. Et il peut être passé en tant que paramètre JVM ex: java -Djava.util.logging.config.file=/scratch/user/config/logging.properties

Détails: https://docs.oracle.com/cd/E23549_01/doc.1111/e14568/handler.htm

Configuration du gestionnaire de fichiers

Pour envoyer des journaux à un fichier, ajoutez FileHandler à la propriété gestionnaires dans le fichier logging.properties. Cela permettra la journalisation des fichiers globalement.

handlers= java.util.logging.FileHandler Configurez le gestionnaire en définissant les propriétés suivantes:

 java.util.logging.FileHandler.pattern=/logs/oaam.log java.util.logging.FileHandler.limit=50000 java.util.logging.FileHandler.count=1 java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter 

java.util.logging.FileHandler.pattern spécifie l’emplacement et le modèle du fichier de sortie. Le paramètre par défaut est votre répertoire personnel.

java.util.logging.FileHandler.limit spécifie, en octets, la quantité maximale que l’enregistreur écrit dans un fichier.

java.util.logging.FileHandler.count spécifie le nombre de fichiers de sortie à parcourir.

java.util.logging.FileHandler.formatter spécifie la classe de formatage java.util.logging utilisée par la classe du gestionnaire de fichiers pour formater les messages de journal. SimpleFormatter écrit de brefs résumés “lisibles par l’homme” des enregistrements de journal.

Pour que java utilise ce fichier de configuration au lieu de $ JDK_HOME / jre / lib / logging.properties:

 java -Djava.util.logging.config.file=/scratch/user/config/logging.properties 
 int SIZE = "" int ROTATIONCOUNT = "" Handler handler = new FileHandler("test.log", SIZE, LOG_ROTATIONCOUNT); logger.addHandler(handler); // for your code.. // you can also set logging levels Logger.getLogger(this.getClass().getName()).log(Level.[...]).addHandler(handler); 

Voici ma classe de journalisation basée sur la réponse acceptée :

 import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.*; public class ErrorLogger { private Logger logger; public ErrorLogger() { logger = Logger.getAnonymousLogger(); configure(); } private void configure() { try { Ssortingng logsDirectoryFolder = "logs"; Files.createDirectories(Paths.get(logsDirectoryFolder)); FileHandler fileHandler = new FileHandler(logsDirectoryFolder + File.separator + getCurrentTimeSsortingng() + ".log"); logger.addHandler(fileHandler); SimpleFormatter formatter = new SimpleFormatter(); fileHandler.setFormatter(formatter); } catch (IOException exception) { exception.printStackTrace(); } addCloseHandlersShutdownHook(); } private void addCloseHandlersShutdownHook() { Runtime.getRuntime().addShutdownHook(new Thread(() -> { // Close all handlers to get rid of empty .LCK files for (Handler handler : logger.getHandlers()) { handler.close(); } })); } private Ssortingng getCurrentTimeSsortingng() { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); return dateFormat.format(new Date()); } public void log(Exception exception) { logger.log(Level.SEVERE, "", exception); } }