Конфигурация SLF4J и LogBack в GWT (Eclipse и Jetty) - PullRequest
2 голосов
/ 26 ноября 2011

Я сделал функцию инициализации приложения, которую использую как в приложениях Java, так и в приложениях GWT. У меня есть внешний файл logback.xml , для которого я устанавливаю путь к « logback.configurationFile » Системное свойство . В проектах на чистом Java все работает как положено, но не в проектах GWT.

Я реализовал ServletContextListener и в методе contextInitialized Я устанавливаю свойство System. Logback не читает его, но возвращается к основному (красные буквы в консоли).

Итак, я попытался следовать инструкциям Конфигурация logback

LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();

для перенастройки Logback, но это выдает

java.lang.ClassCastException: org.slf4j.impl.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext

Я также пытался поместить logback.xml в папки: src, war, war / WEB_INF, но он его не читает.

Я переключаюсь на slf4j, потому что предыдущий log4j начал выдавать много исключений «класс не найден» (что-то с использованием регистрации в общем)

Вопрос:

  1. Что не так?

    или

  2. Как получить sfl4j (logback) для чтения внешнего XML-файла конфигурации?

    или

  3. Как получить sfl4j (logback) для чтения любого файла конфигурации XML?

Помощь оценена

РЕДАКТИРОВАТЬ: Попытка использовать адаптер log4j с slf4j, и он тоже не работает.

EDIT2: я вернулся к чистому log4j, который раньше не работал. Тем не менее, я добавил log4j.jar прямо в «Установленный JRE» в Eclipse в основной системе JRE, и теперь чистый log4j работает. Мне кажется, что существует большая разница между OpenJDK и Sun JDK, и это вызывает проблемы. Я постараюсь исправить эту проблему через несколько дней. Может быть, есть необходимость в банке в каком-то странном месте.

EDIT3: slf4j теперь работает с log4j, но я должен вручную настроить его. Не имеет значения, куда я положил log4j.xml, он не читается. Похоже, проблема загрузчика классов с Sun JDK. Я скоро попробую с Logback. Это может быть похожая проблема.

Ответы [ 4 ]

3 голосов
/ 28 ноября 2011

У меня есть logback, работающий в моих проектах gwt, eclipse, jetty. работает довольно хорошо. Вид отработан из коробки. Я использую Maven. Что я сделал, это: добавить slf4j-api и logback как зависимости.

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
        </dependency>
            <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-classic</artifactId>
           <version>1.0.0</version>
       </dependency>

в моем коде я получаю регистратор, используя:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
protected Logger log = LoggerFactory.getLogger(this.getClass());

logback.xml находится в моей папке src / main / resources. Таким образом, он будет помещен в классы target / myproject / WEB-INF / после компиляции.

Надеюсь, это поможет вам.

1 голос
/ 30 ноября 2011

Существует несколько возможных конфигураций с jetty, slf4j и logback. Это действительно зависит от того, чего вы пытаетесь достичь.

1) Наличие самого веб-приложения для входа в систему самостоятельно.

2) Наличие глобального журнала на уровне сервера, который регистрирует события сервера и события веб-приложения для выхода из системы.

3) Наличие глобальной конфигурации обратного входа на уровне сервера, которая создает файл журнала для сервера и отдельные файлы журнала для каждого веб-приложения.

Чтобы выполнить # 1, вам просто нужно поместить файлы slf4j и logback в каталог WEB-INF / lib вашего веб-приложения и развернуть его. (убедитесь, что вы поместили файлы конфигурации в каталог WEB-INF / classes или WEB-INF / webapps)

Чтобы выполнить # 2 и # 3, вы должны сообщить Jetty, что slf4j и logback должны быть доступны всем веб-приложениям, и что все веб-приложения, независимо от наличия их собственных (потенциальных) slf4j и jar-файлов logback, должны всегда используйте файлы JAR с сервера. Это делается путем манипулирования списком systemClasses и serverClasses в WebAppContext через веб-интерфейс по умолчанию Slf4j разрешен через барьер загрузчика классов webapp на Jetty, но вход в систему запрещен.

Это может быть определено статически в контексте развертываемого / *. Xml или динамически через привязку DeploymentManager. см. модуль jetty-webapp-logging на jetty.codehaus.org для получения подробной информации о том, как это сделать (я бы связал вас с этим, но codehaus проходит аттестацию сервера миграции) Итак, я получил соответствующий файл здесь - https://gist.github.com/1409147

package org.mortbay.jetty.webapp.logging;

import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppLifeCycle;
import org.eclipse.jetty.deploy.graph.Node;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.webapp.WebAppContext;

public class CentralizedWebAppLoggingBinding implements AppLifeCycle.Binding
{
    @Override
    public String[] getBindingTargets()
    {
        return new String[]
        { "deploying" };
    }

    @Override
    public void processBinding(Node node, App app) throws Exception
    {
        ContextHandler handler = app.getContextHandler();
        if (handler == null)
        {
            throw new NullPointerException("No Handler created for App: " + app);
        }

        if (handler instanceof WebAppContext)
        {
            WebAppContext webapp = (WebAppContext)handler;
            webapp.addSystemClass("org.apache.log4j.");
            webapp.addSystemClass("org.slf4j.");
            webapp.addSystemClass("org.apache.commons.logging.");
        }
    }
}

Чтобы выполнить # 3, вам нужно настроить обработчик MDC slf4j и просеять запись в журнал, который использует информацию MDC для маршрутизации соответствующего события регистрации в файл журнала по вашему выбору. Я написал об этом в http://webtide.intalio.com/2011/08/sifting-logs-in-jetty-with-logback/, и у меня есть примеры проектов для базовой обратной связи, отфильтрованной обратной связи и даже как использовать модуль logback-access для регистрации доступа NCSA в https://github.com/jetty-project/jetty-and-logback-example

0 голосов
/ 02 июля 2014

Я также столкнулся с той же проблемой, обнаружил slf4j-simple.jar в пути pom / class.Как только он был удален, работает нормально.

0 голосов
/ 07 мая 2012

Logback ищет свои файлы конфигурации в classpath , а не в файловой системе.

Чтобы получить файл конфигурации в файловой системе, используйте включение файла, как описано в http://logback.qos.ch/manual/joran.html#fileInclusion. Обратите внимание, что имя файла может ссылаться на переменную среды, если оно облегчает указание на местоположение файловой системы файл.

...