2012-03-07 2 views
11

La domanda ha origine da qui: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format - senza risposta.GlassFish 3: come si modifica il formato di registrazione (predefinito)?

Il formato di registrazione GlassFish 3 predefinito è molto fastidioso, troppo lungo.

[#|2012-03-02T09:22:03.165+0100|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=113;_ThreadName=AWT-EventQueue-0;| MESSAGE... ] 

Questo è solo un orribile IMO predefinito. I documenti spiegano solo tutti i campi, ma non come modificare il formato: http://docs.oracle.com/cd/E18930_01/html/821-2416/abluk.html

Nota che distribuisco SLF4J insieme alla mia webapp che dovrebbe anche prendere il formato.

Come si modifica il formato di registrazione?

FYI:

I link qui sono obsoleti: Install log formater in glassfish ...

La domanda qui non è stato risposto: How to configure GlassFish logging to show milliseconds in timestamps? ...

Il commento ha provocato nulla: http://www.java.net/forum/topic/glassfish/glassfish/cant-seem-configure- ...

Sembra che la configurazione di registrazione GlassFish sia un problema a parte. Possibile qualcuno aiuto?

+0

Duplicato: [http://stackoverflow.com/questions/9556503/reducing-line-width-of-glassfish-log](http://stackoverflow.com/questions/9556503/reducing-line-width-of -cartone di vetro) – TPete

+0

Beh, in realtà lo scambio di solo il formattatore sembra molto più leggero, vedi il primo collegamento "FYI" che ho postato, funziona, ma ovviamente l'ho perso. – Kawu

+0

Si noti che il formato di registrazione non è scelto per gli esseri umani ma per la pagina di amministrazione che può fare tutti i tipi di cose fantasiose con i registri. Se si modifica il formato di registrazione si interrompe la pagina di amministrazione. –

risposta

4

La soluzione sembra essere il primo distacco ecco: Install log formater in glassfish

ho messo insieme un semplice formattatore di registro (regolare a piacere):

import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.logging.LogRecord; 
import java.util.logging.SimpleFormatter; 

public class JBossAS7LikeFormatter extends SimpleFormatter 
{ 
    private final String nl = System.getProperty("line.separator"); 
    private final DateFormat df = new SimpleDateFormat("HH:mm:ss,SSS"); 

    @Override 
    public synchronized String format(LogRecord lr) 
    { 
     StringBuffer sb = new StringBuffer(); 

     // time only 
     Date dt = new Date(); 
     dt.setTime(lr.getMillis()); 

     sb.append(df.format(dt)); 
     sb.append(" "); 

     // level (longest is "WARNING" = 7 chars, space fill for level output) 
     String level = lr.getLevel().getName(); 

     int numSpaces = 7 - level.length(); 

     sb.append(level); 

     for (int i = 0 ; i < numSpaces + 1 ; i++) 
     { 
      sb.append(" "); 
     } 

     // package 
     sb.append("["); 
     sb.append(lr.getSourceClassName()); 
     sb.append("] "); 

     // thread (name?) 
     sb.append("("); 
     sb.append(lr.getThreadID()); 
     sb.append(") "); 

     // message 
     sb.append(formatMessage(lr)); 
     sb.append(nl); 

     // optional stack trace 
     if (lr.getThrown() != null) 
     { 
      try 
      { 
       StringWriter sw = new StringWriter(); 
       PrintWriter pw = new PrintWriter(sw); 
       lr.getThrown().printStackTrace(pw); 
       pw.close(); 
       sb.append(sw.toString()); 
      } 
      catch (Exception e) 
      { 
      } 
     } 

     return sb.toString(); 
    } 

} 

Fissa anche il doppio problema di nuova riga su macchine Windows.


ho avuto questo lavoro mettendo il vaso in domain/lib/extin un primo momento, ma per tentativi più recenti, qualunque sia la ragione è, ho solo continuo a ricevere un ClassNotFoundException ora:

Mrz 08, 2012 9:39:14 AM com.sun.enterprise.admin.launcher.GFLauncherLogger info 
Information: Successfully launched in 5 msec. 
Launching GlassFish on Felix platform 
Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.sun.enterprise.glassfish.bootstrap.GlassFishMain.main(GlassFishMain.java:97) 
    at com.sun.enterprise.glassfish.bootstrap.ASMain.main(ASMain.java:55) 
Caused by: java.lang.NoClassDefFoundError: com/sun/enterprise/server/logging/UniformLogFormatter 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:410) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    at java.util.logging.LogManager.getFormatterProperty(LogManager.java:1048) 
    at java.util.logging.StreamHandler.configure(StreamHandler.java:76) 
    at java.util.logging.StreamHandler.<init>(StreamHandler.java:94) 
    at java.util.logging.ConsoleHandler.<init>(ConsoleHandler.java:88) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at java.lang.Class.newInstance0(Class.java:372) 
    at java.lang.Class.newInstance(Class.java:325) 
    at java.util.logging.LogManager$3.run(LogManager.java:419) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.util.logging.LogManager.loadLoggerHandlers(LogManager.java:405) 
    at java.util.logging.LogManager.initializeGlobalHandlers(LogManager.java:1076) 
    at java.util.logging.LogManager.access$1100(LogManager.java:148) 
    at java.util.logging.LogManager$RootLogger.getHandlers(LogManager.java:1157) 
    at java.util.logging.Logger.log(Logger.java:521) 
    at com.sun.logging.LogDomains$1.log(LogDomains.java:372) 
    at java.util.logging.Logger.doLog(Logger.java:543) 
    at java.util.logging.Logger.log(Logger.java:587) 
    at com.sun.enterprise.server.logging.LogManagerService.postConstruct(LogManagerService.java:354) 
    at com.sun.hk2.component.AbstractCreatorImpl.inject(AbstractCreatorImpl.java:131) 
    at com.sun.hk2.component.ConstructorCreator.initialize(ConstructorCreator.java:91) 
    at com.sun.hk2.component.AbstractCreatorImpl.get(AbstractCreatorImpl.java:82) 
    at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:67) 
    at com.sun.hk2.component.EventPublishingInhabitant.get(EventPublishingInhabitant.java:139) 
    at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:78) 
    at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:229) 
    at com.sun.enterprise.v3.server.AppServerStartup.doStart(AppServerStartup.java:145) 
    at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:136) 
    at com.sun.enterprise.glassfish.bootstrap.GlassFishImpl.start(GlassFishImpl.java:79) 
    at com.sun.enterprise.glassfish.bootstrap.GlassFishDecorator.start(GlassFishDecorator.java:63) 
    at com.sun.enterprise.glassfish.bootstrap.osgi.OSGiGlassFishImpl.start(OSGiGlassFishImpl.java:69) 
    at com.sun.enterprise.glassfish.bootstrap.GlassFishMain$Launcher.launch(GlassFishMain.java:117) 
    ... 6 more 
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.server.logging.UniformLogFormatter 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    ... 53 more 
Completed shutdown of GlassFish runtime 
Command start-domain failed. 
The DAS was stopped. 

ho visto il nuovo formato per alcuni tentativi, ma si è fermato per funzionare - strano.

Ho allegato il JAR come nel mio post sul forum GlassFish originale. Ho praticamente usato il mio strumento ZIP e lo ho rinominato in JAR, ma questo non dovrebbe essere un problema (?). Se qualcuno lo fa funzionare (ancora) per favore fammi sapere.

Nota: sto utilizzando il plug-in GlassFish per avviare/arrestare il server, non so se questo potrebbe essere un problema.

prega continuare qualsiasi discussione nel forum GlassFish qui: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format

PS: scusate avevo bisogno di inviare la traccia dello stack qui come forum GF è un po 'rotto.

UPDATE:

Estendere java.util.logging.SimpleFormatter ha fatto il trucco. GlassFish ora produce voci di registro come:

12:13:02,400 INFO [com.sun.enterprise.web.WebContainer] (1) WEB0172: Virtual server [server] loaded default web module [] 
12:13:07,700 INFO [org.hibernate.validator.util.Version] (1) Hibernate Validator 4.2.0.Final 
12:13:08,919 WARNING [null] (1) Multiple [2] JMX MBeanServer instances exist, we will use the server at index [0] : [[email protected]]. 
12:13:08,920 WARNING [null] (1) JMX MBeanServer in use: [[email protected]] from index [0] 
12:13:08,920 WARNING [null] (1) JMX MBeanServer in use: [[email protected]] from index [1] 

Ancora, su Windows: nessun doppio nuovo.

1

È necessario fornire la propria implementazione di registrazione poiché non sembra essere un modo per cambiare il glassfish. SLF4J è solo una facciata e in realtà non esegue alcuna registrazione, la inoltra al registratore presente sul classpath.

Quello che ho fatto nella mia app è sostituire l'intera registrazione di glassfish con il logback seguendo questo post. http://hwellmann.blogspot.com/2010/12/glassfish-logging-with-slf4j-part-2.html

+0

C'è un vantaggio nell'utilizzo di java.util.logging, vale a dire che funzionerà anche attraverso i classloader. –

3

Il formato di registrazione predefinito può essere modificato in base al post in alto. Il NoClassDefFoundError sopra riportato può essere evitato estendendo java.util.logging.Formatter piuttosto che com.sun.enterprise.server.logging.UniformLogFormatter.

In sintesi:

  1. implementare una formattazione personalizzata che si estende java.util.logging.Formatter
  2. Copiare il barattolo contenente formattazione personalizzata per domain/lib/ext
  3. Specificare il formattatore di registro nella logging.properties, ad es.

    com.sun.enterprise.server.logging.GFFileHandler.formatter=com.myformatter.CustomFormatter 
    
1

seguito tutte le guide e in mancanza, quello che finalmente ha ottenuto questo lavoro per me in GF 3.1.2.2 è stato quello di aggiornare la proprietà corretta nella logging.properties come spiegato sopra:

com. sun.enterprise.server.logging.GFFileHandler.formatter = com.myformatter.CustomFormatter

Tutte le guide che ho visto hanno parlato dell'aggiornamento della proprietà "gestori", ma questo non era necessario. La proprietà sopra è l'unica proprietà che ho cambiato.

Oh; e il mio formattatore personalizzato estende SimpleFormatter.