GlassFish 3: как изменить формат регистрации (по умолчанию)?

Вопрос возник здесь: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format — без ответа.

Стандартный формат журнала GlassFish 3 очень раздражает, слишком длинный.

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

Это просто ужасный ИМО по умолчанию. Документы просто объясняют все поля, но не как изменить формат: http://docs.oracle.com/cd/E18930_01/html/821-2416/abluk.html

Обратите внимание, что я развертываю SLF4J вместе с моим веб-приложением, которое также должно подбирать формат.

Как изменить формат журнала?

К вашему сведению:

Ссылки здесь устарели: Установить модуль форматирования журнала в Glassfish...

На вопрос здесь нет ответа: Как настроить ведение журнала GlassFish для отображения миллисекунд в метках времени?...

Публикация здесь ничего не дала: http://www.java.net/forum/topic/glassfish/glassfish/cant-seem-configure-...

Похоже, конфигурация ведения журнала GlassFish — это отдельная проблема. кто-нибудь может помочь?


person Kawu    schedule 07.03.2012    source источник
comment
Дубликат: http://stackoverflow.com/questions/9556503/reduction-line-width-of-glassfish-log   -  person TPete    schedule 08.03.2012
comment
Ну, на самом деле замена только форматтера кажется намного более легкой, см. первую ссылку FYI, которую я разместил, это работает, но я, очевидно, пропустил это.   -  person Kawu    schedule 08.03.2012
comment
Обратите внимание, что формат журнала выбран не для людей, а для страницы администратора, которая может делать с журналами всевозможные причудливые вещи. Если вы измените формат ведения журнала, вы сломаете страницу администратора.   -  person Thorbjørn Ravn Andersen    schedule 20.03.2012
comment
Хм, пока информация новая и интересная, вопрос в том, является ли такая функция хорошей или плохой. В конце концов, это просто создает зависимость от формата ведения журнала. Возможно, здесь достаточно изменить формат обработчика консоли.   -  person Kawu    schedule 20.03.2012


Ответы (4)


Решение, похоже, является первой публикацией SO здесь: Установить форматировщик журнала в Glassfish

Я взломал простой форматировщик журнала (настройте по желанию):

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

}

Он даже устраняет проблему двойной новой строки на компьютерах с Windows.


Я заставил это работать, поместив JAR в domain/lib/ext сначала, но для новых попыток, какой бы ни была причина, я продолжаю получать ClassNotFoundException только сейчас:

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.

Я видел новый формат несколько раз, но он перестал работать - странно.

Я прикрепил JAR в том виде, в каком он есть, к моему исходному сообщению на форуме GlassFish. В основном я только что использовал свой ZIP-инструмент и переименовал его в JAR, но это не должно быть проблемой (?). Если кто-то заставит его работать (снова), пожалуйста, дайте мне знать.

Примечание. Я использую подключаемый модуль GlassFish для запуска/остановки сервера, не знаю, может ли это быть проблемой.

Пожалуйста, продолжайте обсуждение на форуме GlassFish здесь: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format

PS: извините, мне нужно было опубликовать трассировку стека здесь, так как форум GF несколько сломан.

ОБНОВЛЕНИЕ:

Расширение java.util.logging.SimpleFormatter помогло. GlassFish теперь создает такие записи журнала, как:

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] : [com.sun.enterprise.v3.admin.DynamicInterceptor@1a53cab6].
12:13:08,920 WARNING [null] (1) JMX MBeanServer in use: [com.sun.enterprise.v3.admin.DynamicInterceptor@1a53cab6] from index [0] 
12:13:08,920 WARNING [null] (1) JMX MBeanServer in use: [com.sun.jmx.mbeanserver.JmxMBeanServer@2f740f7e] from index [1] 

Опять же, в Windows: нет двойных новых строк.

person Kawu    schedule 08.03.2012

Формат ведения журнала по умолчанию можно изменить, как указано в сообщении выше. Описанной выше ошибки NoClassDefFoundError можно избежать, расширив java.util.logging.Formatter, а не com.sun.enterprise.server.logging.UniformLogFormatter.

Обобщить:

  1. Реализуйте собственный модуль форматирования, который расширяет java.util.logging.Formatter
  2. Скопируйте банку, содержащую пользовательский форматтер, в domain/lib/ext
  3. Укажите средство форматирования журнала в logging.properties, например.

    com.sun.enterprise.server.logging.GFFileHandler.formatter=com.myformatter.CustomFormatter
    
person user1267499    schedule 13.03.2012

Вам нужно предоставить свою собственную реализацию ведения журнала, поскольку, похоже, нет способа изменить стеклянную рыбу. SLF4J - это просто фасад, и на самом деле он не ведет журнал, он перенаправляет его в регистратор, который присутствует в вашем пути к классам.

Что я сделал в своем приложении, так это заменил всю запись в журнале Glassfish на logback после этого поста. http://hwellmann.blogspot.com/2010/12/glassfish-logging-with-slf4j-part-2.html

person Hiro2k    schedule 07.03.2012
comment
Есть одно преимущество использования java.util.logging, а именно то, что он будет работать даже между загрузчиками классов. - person Thorbjørn Ravn Andersen; 20.03.2012

Следуя всем руководствам и потерпев неудачу, в GF 3.1.2.2 это наконец-то помогло мне обновить правильное свойство в logging.properties, как описано выше:

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

Все руководства, которые я видел, говорили об обновлении свойства «handlers», но это не обязательно. Свойство выше - единственное свойство, которое я изменил.

Ой; и мой пользовательский форматтер расширяет SimpleFormatter.

person David A    schedule 22.03.2013