在Google App Engine上使用log4j

时间:2010-10-02 12:53:00

标签: java google-app-engine log4j

我需要在我的应用程序中使用log4j,但我不知道如何加载属性。 Deafult属性文件说我应该将log4j.properties放到/ WEB-INF / classes /文件夹中,但是在eclipse中我看不到该文件夹​​而我无法创建它,因为它已经存在。我也无法将任何文件添加到该文件夹​​中。

这是我得到的错误:

log4j:WARN No appenders could be found for logger (DataNucleus.ClassLoading).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

那么如何让Web应用程序加载log4j属性呢?

4 个答案:

答案 0 :(得分:6)

将log4j.properties文件放入项目的源目录中,例如/ src目录。 Eclipse会将其复制到目标构建目录中。

我建议使用SLF4J和Log4J,以及项目的SpringSource Tool Suite(STS)。

答案 1 :(得分:1)

我必须放入log4j.properties然后在web.xml中配置:

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener> 
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
</context-param>

这样它就可以在加载类路径之前运行,并且可以正常工作。

虽然它没有将JUL内容发送到log4j,但是你需要一个单独的配置才能做到这一点。

答案 2 :(得分:0)

忽略您在互联网上看到的关键字spring + log4j + appengine的所有内容。

对我有用并且没有产生歧义的解决方案是离开JUL并以这种方式单独使用spring配置log4j:

public class CustomXmlWebApplicationContext extends XmlWebApplicationContext {
@Override
protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) {
    super.initBeanDefinitionReader(beanDefinitionReader);

    try {
        Resource res = beanDefinitionReader.getResourceLoader().getResource("classpath:log4j.properties");
        Properties props = new Properties();
        props.load(res.getInputStream());
        PropertyConfigurator.configure(props);
    }
    catch(Throwable e) {
        e.printStackTrace();
    }
}

}

然后将log4j.properties放在源文件夹的根目录中。

答案 3 :(得分:0)

Logging in the Google AppEngine for Java (GAE/J) with Slf4j, Log4j and JUL上有一篇很好的文章。

\src\main\webapp\WEB-INF\appengine-web.xml中你需要

  

应用服务引擎-web.xml中

<!-- Configure java.util.logging -->
<system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/java-util-logging.properties"/>
</system-properties>

告诉GAE配置了java.util.logging(JUL)。

\src\main\webapp\WEB-INF\java-util-logging.properties中你需要

  

java-util-logging.properties

.level = ALL

或其他JUL级别名称,如您所愿(即'TRACE'不起作用)。

\src\main\resources\log4j.properties文件中,您将拥有

  

log4j.properties

log4j.rootLogger=ALL, stdout
# or a lower log level such as DEBUG, INFO or WARN. 

# Define the destination and format of our logging
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p: %m  at %C.(%F:%L) on %d{ISO8601}%n

您需要将log4j添加到CLASSPATH。我使用Gradle进行依赖关系管理,所以这是我的构建脚本:

  

的build.gradle

configurations {
    all*.exclude group: "commons-logging", module: "commons-logging"
}

dependencies {
    // Logging
    compile 'org.slf4j:slf4j-api:1.7.+'
    runtime 'org.slf4j:slf4j-jdk14:1.7.+'
    runtime ('log4j:log4j:1.2.17') {
        exclude group: "com.sun.jdmk", module: "jmxtools"
        exclude group: "com.sun.jmx", module: "jmxri"
        exclude group: "javax.mail", module: "mail"
        exclude group: "javax.jms", module: "jms"
    }    
}

如果您使用的是 Spring WebMVC ,为了在启动应用程序时提供Log4J配置文件,请将以下侦听器添加到部署描述符中。

  

的web.xml

<!-- The definition of the Log4j Configuration -->
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
</context-param>