java.util.logging.Formatter : getHeader() et getTail()
3 réponses
Pierre Maurette
Bonjour,
Je (re)découvre Java à niveau amateur. J'ai un petit souci qui est plus
de l'ordre de comprendre que d'un vrai besoin (je ne désire en fait que
des .log en texte).
Comment faire pour invoquer les méthodes getHeader et getTail ? J'ai
réduit peu à peu mon code et fait de multiples essais, pour en arriver
à:
Ma classe principale:
public class CanvasApplication {
static protected Logger productionLogger = null;
/* ... */
public CanvasApplication() {
try {
InitLoggers();
}
catch (IOException ex) {
}
catch (SecurityException ex) {
}
productionLogger.info("logger de production initialisé");
/* ... */
private void InitLoggers() throws SecurityException, IOException {
productionLogger = Logger.getLogger("canvastestsProd");
FileHandler fh = new FileHandler("./log/production.log", false);
/* Variantes
FileHandler fh = new FileHandler("./log/production.log", true);
FileHandler fh = new FileHandler("./log/production.log");
*/
fh.setFormatter(new productionFormatter());
productionLogger.addHandler(fh);
}
Pour productionFormatter, j'ai testé un certain nombre de solutions,
par exemple en faire une classe autonome avec son fichier:
public class productionFormatter
extends Formatter {
public productionFormatter() {
}
public String format(LogRecord rec) {
StringBuffer buf = new StringBuffer(1000);
buf.append(rec.getLevel() + "\t");
Format formatter = new SimpleDateFormat("dd/MM/yy");
String s = formatter.format(new Date(rec.getMillis()));
buf.append(s + "\t");
buf.append(new Time(rec.getMillis()) + "\t");
buf.append(rec.getSourceClassName() + ".");
buf.append(rec.getSourceMethodName() + "\t");
buf.append(formatMessage(rec) + "\n");
return buf.toString();
}
public String getHeader(Handler h) {
/* Variante
public String getHead(Handler h) {
*/
String returnValue = "Début de Log\n";
return returnValue;
}
public String getTail(Handler h) {
return "Fin de Log\n";
}
}
En plus des variantes données dans le code, j'ai essayé avec des
contenus tant texte que html (copiés collés sur des exemples). Rien à
faire, même avec des exemples censés foncrtionner. Le code ne passe pas
dans les méthodes getHead (ou getHeader) ni getTail. J'ai même mis des
points d'arrêt, le code passe bien sûr dans format, mais pas dans
getHead (ou getHeader) ni getTail. Pour le reste j'obtiens les .log
attendus.
J'ai trouvé ce qui mettait le caca sans toutefois complètement l'interprêter (mais c'est normal à mon stade). Il s'agissait de la ligne:
import com.sun.javaws.net.protocol.https.Handler;
que j'avais certainement laissé ajouter par JBuilder.
Etonnant quand même, il me semblait avoir fait des essais minima à partir du tut: http://lotfree.next-touch.com/coding/java/fr_journalisation.pdf
-- Pierre Maurette
TestMan
Bonjour,
Comme tu débutes, voici quelques remarques pour amméliorer ton code :
- initialisation d'une variable static (niveau classe) depuis un contexte non-static (niveau objet) sans tester s'il n'a pas déjà été initialisé, ce qui peut te poser des problèmes.
- non-respect des conventions de nommages, ce qui rend ton code plus difficile à lire. Regarde : http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
- definition du niveau de visibilité de getHeader innutile : pas besoin de le mettre en public car le méchanisme de log ne l'utilisera jamais.
Pour le reste, comme tu l'as découvert toi même, la complétion automatique des outils peut parfois mener à utiliser une classe homonyme mais dans un paquet qui n'est pas le bon ;-)
Bonne re-découverte ;-)
A+
TM
Bonjour,
Je (re)découvre Java à niveau amateur. J'ai un petit souci qui est plus de l'ordre de comprendre que d'un vrai besoin (je ne désire en fait que des .log en texte).
Comment faire pour invoquer les méthodes getHeader et getTail ? J'ai réduit peu à peu mon code et fait de multiples essais, pour en arriver à:
Ma classe principale:
public class CanvasApplication { static protected Logger productionLogger = null; /* ... */ public CanvasApplication() { try { InitLoggers(); } catch (IOException ex) { } catch (SecurityException ex) { } productionLogger.info("logger de production initialisé"); /* ... */ private void InitLoggers() throws SecurityException, IOException { productionLogger = Logger.getLogger("canvastestsProd"); FileHandler fh = new FileHandler("./log/production.log", false); /* Variantes FileHandler fh = new FileHandler("./log/production.log", true); FileHandler fh = new FileHandler("./log/production.log"); */ fh.setFormatter(new productionFormatter()); productionLogger.addHandler(fh); }
Pour productionFormatter, j'ai testé un certain nombre de solutions, par exemple en faire une classe autonome avec son fichier:
public class productionFormatter extends Formatter { public productionFormatter() { }
public String format(LogRecord rec) { StringBuffer buf = new StringBuffer(1000); buf.append(rec.getLevel() + "t"); Format formatter = new SimpleDateFormat("dd/MM/yy"); String s = formatter.format(new Date(rec.getMillis())); buf.append(s + "t"); buf.append(new Time(rec.getMillis()) + "t"); buf.append(rec.getSourceClassName() + "."); buf.append(rec.getSourceMethodName() + "t"); buf.append(formatMessage(rec) + "n"); return buf.toString(); }
public String getHeader(Handler h) { /* Variante public String getHead(Handler h) { */ String returnValue = "Début de Logn"; return returnValue; }
public String getTail(Handler h) { return "Fin de Logn"; } }
En plus des variantes données dans le code, j'ai essayé avec des contenus tant texte que html (copiés collés sur des exemples). Rien à faire, même avec des exemples censés foncrtionner. Le code ne passe pas dans les méthodes getHead (ou getHeader) ni getTail. J'ai même mis des points d'arrêt, le code passe bien sûr dans format, mais pas dans getHead (ou getHeader) ni getTail. Pour le reste j'obtiens les .log attendus.
Merci de toute suggestion.
Bonjour,
Comme tu débutes, voici quelques remarques pour amméliorer ton code :
- initialisation d'une variable static (niveau classe) depuis un
contexte non-static (niveau objet) sans tester s'il n'a pas déjà été
initialisé, ce qui peut te poser des problèmes.
- non-respect des conventions de nommages, ce qui rend ton code plus
difficile à lire. Regarde :
http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
- definition du niveau de visibilité de getHeader innutile : pas besoin
de le mettre en public car le méchanisme de log ne l'utilisera jamais.
Pour le reste, comme tu l'as découvert toi même, la complétion
automatique des outils peut parfois mener à utiliser une classe homonyme
mais dans un paquet qui n'est pas le bon ;-)
Bonne re-découverte ;-)
A+
TM
Bonjour,
Je (re)découvre Java à niveau amateur. J'ai un petit souci qui est plus
de l'ordre de comprendre que d'un vrai besoin (je ne désire en fait que
des .log en texte).
Comment faire pour invoquer les méthodes getHeader et getTail ? J'ai
réduit peu à peu mon code et fait de multiples essais, pour en arriver à:
Ma classe principale:
public class CanvasApplication {
static protected Logger productionLogger = null;
/* ... */
public CanvasApplication() {
try {
InitLoggers();
}
catch (IOException ex) {
}
catch (SecurityException ex) {
}
productionLogger.info("logger de production initialisé");
/* ... */
private void InitLoggers() throws SecurityException, IOException {
productionLogger = Logger.getLogger("canvastestsProd");
FileHandler fh = new FileHandler("./log/production.log", false);
/* Variantes
FileHandler fh = new FileHandler("./log/production.log", true);
FileHandler fh = new FileHandler("./log/production.log");
*/
fh.setFormatter(new productionFormatter());
productionLogger.addHandler(fh);
}
Pour productionFormatter, j'ai testé un certain nombre de solutions, par
exemple en faire une classe autonome avec son fichier:
public class productionFormatter
extends Formatter {
public productionFormatter() {
}
public String format(LogRecord rec) {
StringBuffer buf = new StringBuffer(1000);
buf.append(rec.getLevel() + "t");
Format formatter = new SimpleDateFormat("dd/MM/yy");
String s = formatter.format(new Date(rec.getMillis()));
buf.append(s + "t");
buf.append(new Time(rec.getMillis()) + "t");
buf.append(rec.getSourceClassName() + ".");
buf.append(rec.getSourceMethodName() + "t");
buf.append(formatMessage(rec) + "n");
return buf.toString();
}
public String getHeader(Handler h) {
/* Variante
public String getHead(Handler h) {
*/
String returnValue = "Début de Logn";
return returnValue;
}
public String getTail(Handler h) {
return "Fin de Logn";
}
}
En plus des variantes données dans le code, j'ai essayé avec des
contenus tant texte que html (copiés collés sur des exemples). Rien à
faire, même avec des exemples censés foncrtionner. Le code ne passe pas
dans les méthodes getHead (ou getHeader) ni getTail. J'ai même mis des
points d'arrêt, le code passe bien sûr dans format, mais pas dans
getHead (ou getHeader) ni getTail. Pour le reste j'obtiens les .log
attendus.
Comme tu débutes, voici quelques remarques pour amméliorer ton code :
- initialisation d'une variable static (niveau classe) depuis un contexte non-static (niveau objet) sans tester s'il n'a pas déjà été initialisé, ce qui peut te poser des problèmes.
- non-respect des conventions de nommages, ce qui rend ton code plus difficile à lire. Regarde : http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
- definition du niveau de visibilité de getHeader innutile : pas besoin de le mettre en public car le méchanisme de log ne l'utilisera jamais.
Pour le reste, comme tu l'as découvert toi même, la complétion automatique des outils peut parfois mener à utiliser une classe homonyme mais dans un paquet qui n'est pas le bon ;-)
Bonne re-découverte ;-)
A+
TM
Bonjour,
Je (re)découvre Java à niveau amateur. J'ai un petit souci qui est plus de l'ordre de comprendre que d'un vrai besoin (je ne désire en fait que des .log en texte).
Comment faire pour invoquer les méthodes getHeader et getTail ? J'ai réduit peu à peu mon code et fait de multiples essais, pour en arriver à:
Ma classe principale:
public class CanvasApplication { static protected Logger productionLogger = null; /* ... */ public CanvasApplication() { try { InitLoggers(); } catch (IOException ex) { } catch (SecurityException ex) { } productionLogger.info("logger de production initialisé"); /* ... */ private void InitLoggers() throws SecurityException, IOException { productionLogger = Logger.getLogger("canvastestsProd"); FileHandler fh = new FileHandler("./log/production.log", false); /* Variantes FileHandler fh = new FileHandler("./log/production.log", true); FileHandler fh = new FileHandler("./log/production.log"); */ fh.setFormatter(new productionFormatter()); productionLogger.addHandler(fh); }
Pour productionFormatter, j'ai testé un certain nombre de solutions, par exemple en faire une classe autonome avec son fichier:
public class productionFormatter extends Formatter { public productionFormatter() { }
public String format(LogRecord rec) { StringBuffer buf = new StringBuffer(1000); buf.append(rec.getLevel() + "t"); Format formatter = new SimpleDateFormat("dd/MM/yy"); String s = formatter.format(new Date(rec.getMillis())); buf.append(s + "t"); buf.append(new Time(rec.getMillis()) + "t"); buf.append(rec.getSourceClassName() + "."); buf.append(rec.getSourceMethodName() + "t"); buf.append(formatMessage(rec) + "n"); return buf.toString(); }
public String getHeader(Handler h) { /* Variante public String getHead(Handler h) { */ String returnValue = "Début de Logn"; return returnValue; }
public String getTail(Handler h) { return "Fin de Logn"; } }
En plus des variantes données dans le code, j'ai essayé avec des contenus tant texte que html (copiés collés sur des exemples). Rien à faire, même avec des exemples censés foncrtionner. Le code ne passe pas dans les méthodes getHead (ou getHeader) ni getTail. J'ai même mis des points d'arrêt, le code passe bien sûr dans format, mais pas dans getHead (ou getHeader) ni getTail. Pour le reste j'obtiens les .log attendus.
Merci de toute suggestion.
Pierre Maurette
Bonjour,
Comme tu débutes, voici quelques remarques pour amméliorer ton code :
En fait, je fais un peu de Java de temps en temps, genre plugins quand il le faut. Je m'y mets un peu plus sérieusement pour aider mon fiston étudiant. C'est dans cet esprit que je lui mâche le boulot pour javadoc, les log, etc. tout en faisant un peu de refactoring (style, voir plus bas).
- initialisation d'une variable static (niveau classe) depuis un contexte non-static (niveau objet) sans tester s'il n'a pas déjà été initialisé, ce qui peut te poser des problèmes.
- non-respect des conventions de nommages, ce qui rend ton code plus difficile à lire. Regarde : http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
J'avais trouvé et envisagé d'adopter: http://geosoft.no/development/javastyle.html
- definition du niveau de visibilité de getHeader innutile : pas besoin de le mettre en public car le méchanisme de log ne l'utilisera jamais.
C'est getHead, et il semble que je doive le déclarer public. J'ai fait un test avec un htmlFormatter, getHead écrit l'entête et quelques lignes de css, ça marche bien. Je peux également l'utiliser dans un textFormatter, mais c'est sans grand intérêt. A noter que quand j'utilise true dans: FileHandler fh = new FileHandler("./log/production.htm", true); (qui conserve le fichier au lieu de le recréer) je me retrouve avec plusieurs headers et plusieurs footers, ce qui est un peu ballot.
Pour le reste, comme tu l'as découvert toi même, la complétion automatique des outils peut parfois mener à utiliser une classe homonyme mais dans un paquet qui n'est pas le bon ;-)
Bonne re-découverte ;-)
Merci
-- Pierre Maurette
Bonjour,
Comme tu débutes, voici quelques remarques pour amméliorer ton code :
En fait, je fais un peu de Java de temps en temps, genre plugins quand
il le faut. Je m'y mets un peu plus sérieusement pour aider mon fiston
étudiant. C'est dans cet esprit que je lui mâche le boulot pour
javadoc, les log, etc. tout en faisant un peu de refactoring (style,
voir plus bas).
- initialisation d'une variable static (niveau classe) depuis un contexte
non-static (niveau objet) sans tester s'il n'a pas déjà été initialisé, ce
qui peut te poser des problèmes.
- non-respect des conventions de nommages, ce qui rend ton code plus
difficile à lire. Regarde :
http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
J'avais trouvé et envisagé d'adopter:
http://geosoft.no/development/javastyle.html
- definition du niveau de visibilité de getHeader innutile : pas besoin de le
mettre en public car le méchanisme de log ne l'utilisera jamais.
C'est getHead, et il semble que je doive le déclarer public. J'ai fait
un test avec un htmlFormatter, getHead écrit l'entête et quelques
lignes de css, ça marche bien. Je peux également l'utiliser dans un
textFormatter, mais c'est sans grand intérêt.
A noter que quand j'utilise true dans:
FileHandler fh = new FileHandler("./log/production.htm", true);
(qui conserve le fichier au lieu de le recréer) je me retrouve avec
plusieurs headers et plusieurs footers, ce qui est un peu ballot.
Pour le reste, comme tu l'as découvert toi même, la complétion automatique
des outils peut parfois mener à utiliser une classe homonyme mais dans un
paquet qui n'est pas le bon ;-)
Comme tu débutes, voici quelques remarques pour amméliorer ton code :
En fait, je fais un peu de Java de temps en temps, genre plugins quand il le faut. Je m'y mets un peu plus sérieusement pour aider mon fiston étudiant. C'est dans cet esprit que je lui mâche le boulot pour javadoc, les log, etc. tout en faisant un peu de refactoring (style, voir plus bas).
- initialisation d'une variable static (niveau classe) depuis un contexte non-static (niveau objet) sans tester s'il n'a pas déjà été initialisé, ce qui peut te poser des problèmes.
- non-respect des conventions de nommages, ce qui rend ton code plus difficile à lire. Regarde : http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html
J'avais trouvé et envisagé d'adopter: http://geosoft.no/development/javastyle.html
- definition du niveau de visibilité de getHeader innutile : pas besoin de le mettre en public car le méchanisme de log ne l'utilisera jamais.
C'est getHead, et il semble que je doive le déclarer public. J'ai fait un test avec un htmlFormatter, getHead écrit l'entête et quelques lignes de css, ça marche bien. Je peux également l'utiliser dans un textFormatter, mais c'est sans grand intérêt. A noter que quand j'utilise true dans: FileHandler fh = new FileHandler("./log/production.htm", true); (qui conserve le fichier au lieu de le recréer) je me retrouve avec plusieurs headers et plusieurs footers, ce qui est un peu ballot.
Pour le reste, comme tu l'as découvert toi même, la complétion automatique des outils peut parfois mener à utiliser une classe homonyme mais dans un paquet qui n'est pas le bon ;-)