2012-03-07 14 views
11

La pregunta se originó desde aquí: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format - sin respuesta.GlassFish 3: ¿cómo se cambia el formato de registro (predeterminado)?

El formato predeterminado de registro GlassFish 3 es muy molesto, demasiado largo.

[#|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... ] 

Esto es simplemente un IMO horrible por defecto. Los documentos solo explican todos los campos, pero no cómo cambiar el formato: http://docs.oracle.com/cd/E18930_01/html/821-2416/abluk.html

Tenga en cuenta que despliego SLF4J junto con mi aplicación web, que también debe elegir el formato.

¿Cómo se cambia el formato de registro?

FYI:

Los enlaces que aquí no están actualizados: Install log formater in glassfish ...

La cuestión aquí no ha sido contestada: How to configure GlassFish logging to show milliseconds in timestamps? ...

La publicación que aquí se tradujo en nada: http://www.java.net/forum/topic/glassfish/glassfish/cant-seem-configure- ...

Parece que la configuración de registro GlassFish es un problema por sí mismo. ¿Puede alguien ayudar?

+0

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

+0

Bueno, en realidad el intercambio de solo el formateador parece mucho más ligero, consulte el primer enlace "FYI" que publiqué, esto funciona, pero obviamente me lo he perdido. – Kawu

+0

Tenga en cuenta que el formato de registro no se elige para seres humanos, sino para la página de administración, que puede hacer todo tipo de cosas elegantes con los registros. Si cambia el formato de registro, romperá la página de administración. –

Respuesta

4

La solución parece ser el primero para publicar aquí: Install log formater in glassfish

He hackeado un simple registro de formateador (ajustar a voluntad):

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(); 
    } 

} 

Incluso se soluciona el problema de doble salto de línea en máquinas con Windows.


que tiene esto funcione al poner el JAR en domain/lib/exten un primer momento, pero para los nuevos intentos, cualquiera que sea la razón es, sólo seguir recibiendo un ClassNotFoundException ahora:

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. 

vi el nuevo formato para algunos intentos, pero dejó de funcionar, extraño.

He adjuntado el JAR como está en mi publicación original en el foro de GlassFish. Básicamente acabo de utilizar mi herramienta ZIP y la he cambiado el nombre a JAR, pero esto no debería ser un problema (?). Si alguien consigue que funcione (otra vez) por favor hágamelo saber.

Nota: Estoy utilizando el complemento GlassFish para iniciar/detener el servidor, no sé si esto podría ser un problema.

favor continuar cualquier discusión en el foro GlassFish aquí: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format

PD: lo siento, tenía que colocar el seguimiento de pila aquí como el foro GF es un poco roto.

ACTUALIZACIÓN:

Extendiendo java.util.logging.SimpleFormatter hizo el truco. GlassFish ahora produce como entradas de registro:

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] 

Una vez más, en Windows: no hay nuevas líneas dobles.

1

Debe proporcionar su propia implementación de registro ya que no parece haber una forma de cambiar glassfish's. SLF4J es solo una fachada y no realiza ningún registro, sino que lo reenvía al registrador que está presente en su classpath.

Lo que he hecho en mi aplicación es reemplazar todo el registro glassfish con logback después de esta publicación. http://hwellmann.blogspot.com/2010/12/glassfish-logging-with-slf4j-part-2.html

+0

Hay una ventaja al utilizar java.util.logging, es decir, que funcionará incluso en los cargadores de clases. –

3

El formato predeterminado de registro se puede cambiar según la publicación anterior. El NoClassDefFoundError informado anteriormente puede evitarse ampliando java.util.logging.Formatter en lugar de com.sun.enterprise.server.logging.UniformLogFormatter.

Para resumir:

  1. Implementar un formateador personalizado que se extiende java.util.logging.Formatter
  2. Copiar el frasco que contiene formateador personalizado a domain/lib/ext
  3. Especificar el formateador de registro en logging.properties, por ejemplo.

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

Después de todas las guías y en su defecto, lo que finalmente consiguió que esto funcione para mí en GF 3.1.2.2 fue actualizar la propiedad correcta en logging.properties como se explicó anteriormente:

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

Todas las guías que he visto han hablado acerca de la actualización de la propiedad "handlers", pero esto no era necesario. La propiedad anterior es la única propiedad que he cambiado.

Oh; y mi formateador personalizado se extiende SimpleFormatter.

Cuestiones relacionadas