2012-03-07 16 views
11

Pytanie pochodzi z: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format - bez odpowiedzi.GlassFish 3: jak zmienić (domyślny) format rejestrowania?

Domyślny format zapisu GlassFish 3 jest bardzo denerwujący, o wiele za długi.

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

To tylko straszne domyślne IMO. Dokumenty wyjaśniają tylko wszystkie pola, ale nie zmieniają formatu: http://docs.oracle.com/cd/E18930_01/html/821-2416/abluk.html

Uwaga: wdrażam SLF4J wraz z moją aplikacją webową, która powinna również pobrać format.

Jak zmienić format rejestrowania?

FYI:

Linki tutaj są nieaktualne: Install log formater in glassfish ...

Chodzi tutaj nie zostało odebrane: How to configure GlassFish logging to show milliseconds in timestamps? ...

Delegowanie tutaj zaowocować niczym: http://www.java.net/forum/topic/glassfish/glassfish/cant-seem-configure- ...

Wygląda na to, że konfiguracja logowania GlassFish jest kwestią samą w sobie. Czy ktoś może ktoś pomóc pomóc?

+0

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

+0

Faktycznie wymiana tylko formatera wydaje się o wiele lżejsza, zobacz pierwszy link "FYI", który napisałem, działa, ale najwyraźniej go nie zauważyłem. – Kawu

+0

Należy zauważyć, że format rejestrowania nie jest wybierany dla ludzi, ale dla strony administracyjnej, która może wykonywać wszelkiego rodzaju wymyślne rzeczy z dziennikami. Jeśli zmienisz format rejestrowania, przerwiesz stronę Administrator. –

Odpowiedz

4

Rozwiązaniem wydaje się być pierwszą SO księgowania tutaj: Install log formater in glassfish

Mam hacked razem prosty dziennika formatowania (dostosowanie do woli):

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

} 

nawet rozwiązuje problemu podwójnego nowej linii na komputerach z systemem Windows.


Dostałem to do pracy poprzez umieszczenie słoik do domain/lib/extna pierwszy, ale dla nowszych próbach, bez względu na powód jest tylko Wciąż dostaję ClassNotFoundException teraz:

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. 

widziałem nowy format dla kilku prób, ale przestał działać - dziwny.

Załączam JAR, jak jest w moim oryginalnym poście na forum GlassFish. Zasadniczo po prostu użyłem mojego narzędzia ZIP i zmieniłem jego nazwę na JAR, ale nie powinno to stanowić problemu (?). Jeśli ktoś zadziała (znowu), proszę dać mi znać.

Uwaga: Używam wtyczki GlassFish do uruchamiania/zatrzymywania serwera, nie wiem, czy to może być problem.

Proszę kontynuować żadnych dyskusji na forum GlassFish tutaj: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format

PS: Przepraszam, że muszę pisać ślad stosu tutaj jako forum GF jest nieco uszkodzony.

UPDATE:

Rozszerzanie java.util.logging.SimpleFormatter załatwiło sprawę. GlassFish tworzy teraz wpisy do dziennika, takie jak:

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] 

Jeszcze raz w systemie Windows: brak podwójnych linii nowego wiersza.

1

Musisz dostarczyć własną implementację rejestrowania, ponieważ nie ma sposobu na zmianę Glassfish. SLF4J jest po prostu fasadą i nie wykonuje żadnego logowania, przekazuje ją do rejestratora, który jest obecny w ścieżce klas.

To, co zrobiłem w mojej aplikacji, to zastąpienie całej rejestracji glassfish logbackem po tym wpisie. http://hwellmann.blogspot.com/2010/12/glassfish-logging-with-slf4j-part-2.html

+0

Jest jedna korzyść z używania java.util.logging, a mianowicie, że będzie działał nawet w modułach ładujących klasy. –

3

Domyślny format rejestrowania można zmienić zgodnie z postem powyżej. Można pominąć zgłoszony błąd NoClassDefFoundError poprzez rozszerzenie java.util.logging.Formatter zamiast com.sun.enterprise.server.logging.UniformLogFormatter.

Podsumowując:

  1. Wdrożenie niestandardowego formatowania, która rozciąga java.util.logging.Formatter
  2. Kopiowanie słoik zawierający niestandardowego formatowania do domain/lib/ext
  3. Określ formatowania dziennika w logging.properties, np.

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

Po wszystkich przewodników i braku, co wreszcie to dla mnie pracować w GF 3.1.2.2 było zaktualizować odpowiednią usługę w logging.properties jak wyjaśniono powyżej:

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

Wszystkie przewodniki, które widziałem, mówiły o aktualizacji "usług", ale nie było to konieczne. Powyższa właściwość jest jedyną nieruchomością, którą zmieniono.

Oh; a mój własny formatter rozszerza SimpleFormatter.

Powiązane problemy