Как включить log4j в этом приложении Grizzly / Jersey

Я не использую XML-конфигурацию и все делаю во время выполнения.

Мое приложение работает, а в Джерси мой API работает, но я не вижу никаких журналов. Я ожидаю увидеть что-то вроде INFO: [MyApp] Initializing log4j from [classpath:environment-${MY_ENVIRONMENT}.properties] , когда это приложение загрузится, чтобы подтвердить, что оно видит конфигурацию log4j.

Я избегал использования log4j.properties, так как мне нужна другая конфигурация ведения журнала для среды моего приложения.

Как я могу получить это приложение, записывающее журналы, с помощью моей конфигурации журнала?

Мой основной класс:

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.api.json.JSONConfiguration;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.servlet.WebappContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.ContextLoaderListener;

...

protected static HttpServer startServer() throws IOException {
    ResourceConfig rc = new PackagesResourceConfig("com.company.product.api.resources");
    Map<String,Boolean> features = rc.getFeatures();
    features.put(JSONConfiguration.FEATURE_POJO_MAPPING, true);

    return GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
}

public static void main(String[] args) throws IOException {
    //Without this, ApplicationContextProvider has no context
    AnnotationConfigApplicationContext annotationCtx = new AnnotationConfigApplicationContext(Config.class);

    //The only reason this is here is because I think I need it for log4j config
    WebappContext ctx = new WebappContext("API", "/");

    //enable log4j configuration
    ctx.addListener("org.springframework.web.util.Log4jConfigListener");
    ctx.addContextInitParameter("log4jConfigLocation", "classpath:environment-${MY_ENVIRONMENT}.properties");

    //enable annotation configuration so we can avoid XML
    ctx.addContextInitParameter("contextClass", "org.springframework.web.context.support.AnnotationConfigWebApplicationContext");
    ctx.addContextInitParameter("contextConfigLocation", "com.company.product.api");

    //allow spring to do all of it's stuff
    ctx.addListener(ContextLoaderListener.class);

    HttpServer httpServer = startServer();

    System.in.read();
    httpServer.stop();
}

В environment-production.properties вся конфигурация используется правильно, за исключением log4j:

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
# Set the name of the file
log4j.appender.FILE.File=/var/log/productionApi/productionApi.log

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true

# Set the DatePattern
log4j.appender.FILE.DatePattern='.' yyyy-MM-dd-a

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

person Webnet    schedule 18.10.2013    source источник


Ответы (2)


Основываясь на примере, вы не вызывали ctx.deploy (HttpServer). Если вы этого не сделаете, то определенный вами прослушиватель ServletContext не будет вызван (обратите внимание: не имеет значения, вызываете ли вы развертывание до или после запуска сервера).

person rlubke    schedule 21.10.2013

Вы можете передать системное свойство log4j.configuration, чтобы добиться цели.

Например:

    java -Dlog4j.configuration=environment-production.properties
person Maksim Liauchuk    schedule 18.10.2013
comment
Это не работает, я все еще вижу предупреждения об отсутствии конфигурации log4j - person Webnet; 21.10.2013