【问题标题】:Avoiding Log4j warning before Spring context loading在 Spring 上下文加载之前避免 Log4j 警告
【发布时间】:2015-11-28 10:59:19
【问题描述】:

我正在开发一个独立的 Java 应用程序并面临以下问题 我的应用程序启动期间的 log4j 警告:

log4j:WARN 找不到记录器的附加程序(org.springframework.core.env.StandardEnvironment)。 log4j:WARN 请正确初始化log4j系统。

但是,我可以在加载后看到所有“弹簧相关”的日志 spring 上下文(下面 main 方法中的第 3 行),即警告 甚至在加载弹簧上下文之前,但在加载之后 spring 上下文,正在记录 spring 日志。

我在下面提供我的应用程序 Java 主类和 bean xml:

ApplicationStarter(主 Java 类):

public class ApplicationStarter {

    @Autowired
    private UserInputs userInputs;

    @Resource
    private volatile BlockingQueue<String> inputsQueue;

    public static void main(String[] args) {                        

        GenericXmlApplicationContext context = new GenericXmlApplicationContext();
        context.setValidating(false);
        context.load("MyProject-Beans.xml");
        context.refresh();

        MyProjectBean myBeanObj = (MyProjectBean)(context.getBean("myProjectBean"));
        myBeanObj.startApplication();       
    }
}

我在开头也得到了下面的 log4j 代码 “MyProject-Beans.xml”文件:

<bean id="log4jInitialization"   class=
 "org.springframework.beans.factory.config.MethodInvokingFactoryBean">

  <property name="targetClass" 
   value="org.springframework.util.Log4jConfigurer" />
    <property name="targetMethod" value="initLogging" />
    <property name="arguments">
     <list>
         <value>file:///{MYPROJECT_HOME}log4j.properties</value>
       </list>
    </property>
 </bean>

我的项目 log4j.properties 文件:

log4j.category.org.springframework=INFO,MYPROJECT_CONSOLE_LOGS
log4j.category.com.myproject=INFO,MYPROJECT_CONSOLE_LOGS
log4j.appender.MYPROJECT_CONSOLE_LOGS=org.apache.log4j.ConsoleAppender
log4j.appender.MYPROJECT_CONSOLE_LOGS.layout=org.apache.log4j.PatternLayout
log4j.appender.MYPROJECT_CONSOLE_LOGS.layout.ConversionPattern=%d %p   
%C{1}:%M():%m\n

目前我通过添加以下第一行来抑制警告 在 main() 方法中。

org.apache.log4j.Logger.getLogger("org.springframework").setLevel(Level.OFF);

但是,我不喜欢这行代码,因为它在应用程序类中对 spring 记录器进行了硬编码。 我想知道是否有更好的方法可以通过在应用程序之外保留 spring log4j 级别属性来在启动期间删除 Spring Log4j 警告。

请帮忙。提前致谢。

【问题讨论】:

  • 为什么不在 log4j.properties 文件中定义它?
  • @Koby:我已经在项目中有 log4j.properties(从 spring beans xml 文件加载)。仅供参考,我在上面添加了 log4j.properties 文件内容。

标签: java spring logging log4j slf4j


【解决方案1】:

此警告告诉我们,在运行时无法在您的类路径中找到 log4j.properties。当您运行应用程序时,请确保您确实掌握了它,而不仅仅是作为某个 IDE 或其他地方的项目的一部分。

然后从你的 bean 配置中检查路径……假设 {MYPROJECT_HOME} 和 log4j.properties 之间没有足够的 /

<value>file:///{MYPROJECT_HOME}log4j.properties</value>

还有 2 种其他方法可以解决它,如果您确定,您在正确的位置有一个属性。首先,您可以设置一个 JVM 选项,以显示属性文件的路径:

-Dlog4j.configuration=file:///somepath/log4j.properties

或者你可以这样配置:

BasicConfigurator.configure();

但在这种情况下,您的所有日志记录都将仅记录到 System.out,因此可能不是您想要的。

【讨论】:

  • 感谢您的回复,查找/加载 log4j.properties 文件没有问题,唯一的问题是 log4j 警告甚至在加载 spring 上下文对象之前就出现了。 我已经尝试过你的 JVM 属性选项“-Dlog4j.configuration”,即使这样我在启动过程中仍然面临警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 2023-03-30
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多