View Javadoc

1   package atg.service.log;
2   
3   
4   /**
5    * Titre :        Formateur de log<BR>
6    * Description :  Formatte la sortie des logs<BR>
7    * <p>Copyright : FERRARI Olivier</p>
8    * @author BOSC Frédéric repris et modifié par FERRARI Olivier
9    * @version 1.0
10   * Ce logiciel est régi par la licence CeCILL soumise au droit français et
11   * respectant les principes de diffusion des logiciels libres. Vous pouvez
12   * utiliser, modifier et/ou redistribuer ce programme sous les conditions
13   * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA 
14   *  sur le site http://www.cecill.info.
15   * 
16   * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez 
17   * pris connaissance de la licence CeCILL, et que vous en avez accepté les
18   * termes.
19   */
20  
21  
22  
23  public  class  AtgLogFormatter extends java.util.logging.SimpleFormatter {
24  
25    //***************************************************************************
26  //                          Attributs
27  //***************************************************************************
28  
29      /**
30       * Nom de la classe
31       */
32    protected static String className = null;
33  
34    /**
35     * Formatage de la date
36     */
37    protected java.util.Date date;
38  
39    /**
40     * Formatage de la date
41     */
42    protected static final String format = "{0,date} {0,time}";
43  
44  
45    /**
46     * Formatteur
47     */
48    protected java.text.MessageFormat formatter;
49  
50    /**
51     * Formatteur
52     */
53    protected Object args[];
54  
55    /**
56     * Saut de ligne
57     */
58    protected String lineSeparator;
59  
60    /**
61     * Initialisation du nom de la classe (dynamique)
62     * package + nom de la classe
63     * Saut de ligne
64     */
65    static
66    {
67      className = (new AtgLogFormatter()).getClass().getName();
68    }
69  
70  
71  
72  //***************************************************************************
73  //                          Constructeurs
74  //***************************************************************************
75  
76    /**
77     * Constructeur
78     */
79    public AtgLogFormatter()
80    {
81      // initialisation des variables
82      date = new java.util.Date();
83      args = new Object[1];
84      lineSeparator = (String)java.security.AccessController.doPrivileged(new sun.security.action.GetPropertyAction("line.separator"));
85    }
86  
87  
88  //***************************************************************************
89  //                          Méthodes publiques
90  //***************************************************************************
91  
92    /**
93     * Retourne le message formaté
94     * @param logrecord Message
95     * @return String log formaté
96     */
97      public synchronized String format(java.util.logging.LogRecord logrecord)
98      {
99        // resultat
100       StringBuffer stringbuffer = new StringBuffer();
101 
102       // formatage de la date
103       date.setTime(logrecord.getMillis());
104       args[0] = date;
105 
106       // formateur par défaut
107       StringBuffer stringbuffer1 = new StringBuffer();
108       if(formatter == null)
109           formatter = new java.text.MessageFormat("{0,date} {0,time}");
110       formatter.format(args, stringbuffer1, null);
111 
112       // ajout du numéro du thread
113       stringbuffer.append("Thread " + logrecord.getThreadID() + " - " + stringbuffer1 + " ");
114 
115       // ajout du niveau du log (SEVERE, WARNING...) et nom du log
116       stringbuffer.append(" (" + logrecord.getLevel().getLocalizedName() + " - " + logrecord.getLoggerName() + ") ");
117 
118       // ajout de la classe
119       if(logrecord.getSourceClassName() != null)
120           stringbuffer.append(logrecord.getSourceClassName());
121       else
122           stringbuffer.append(logrecord.getLoggerName());
123 
124       // ajout du nom de la methode
125       if(logrecord.getSourceMethodName() != null)
126           stringbuffer.append(" " + logrecord.getSourceMethodName() + " ");
127 
128       // decalage du message
129       int lg = stringbuffer.length();
130       if (lg < 125)
131       for (int j=0; j < (125 - lg); j++)
132         stringbuffer.append(" ");
133 
134       // message
135       String s = formatMessage(logrecord);
136       stringbuffer.append(s);
137       stringbuffer.append(lineSeparator);
138 
139       // affichage de la pile si une exception a ete associee
140       // au message
141       if(logrecord.getThrown() != null)
142       try
143       {
144         java.io.StringWriter stringwriter = new java.io.StringWriter();
145         java.io.PrintWriter printwriter = new java.io.PrintWriter(stringwriter);
146         logrecord.getThrown().printStackTrace(printwriter);
147         printwriter.close();
148         stringbuffer.append(stringwriter.toString());
149       }
150       catch (Exception exception)
151       {
152         // aucune gestion d'erreur si la pile ne peut etre
153         // affichee
154       }
155 
156       return stringbuffer.toString();
157    }
158 
159 
160 //***************************************************************************
161 //                          Méthodes statiques
162 //***************************************************************************
163 
164   /**
165    * Retourne la méthode appelante
166    * @return String Methode et numéro de la ligne
167    */
168   public static String getCallerMethod()
169   {
170       StackTraceElement astacklogelement[] = (new Throwable()).getStackTrace();
171       int i;
172 
173       // recherche de la premiere occurence de "StdTrcFormatter" dans
174       // la pile
175       for(i = 0; i < astacklogelement.length; i++)
176       {
177         if(astacklogelement[i].getClassName().equals(className))
178           break;
179       }
180 
181       // recherche de la premiere occurence autre que "StdTrcFormatter"
182       // dans le reste de la pile
183       for(; i < astacklogelement.length; i++)
184       {
185         if(! astacklogelement[i].getClassName().equals(className))
186           // retour = nom de la methode : numero de la ligne
187           return astacklogelement[i+1].getMethodName() + ":" + astacklogelement[i+1].getLineNumber();
188       }
189 
190       return "";
191    }
192 }