当前位置: 首页 > 知识库问答 >
问题:

在Spring上下文加载之前避免Log4j警告

祖迪
2023-03-14

我正在开发一个独立的Java应用程序,在启动我的应用程序时,我会面临以下log4j警告:

log4j:WARN找不到记录器(org.springframework.core.env.StandardEnvironment)的appender。log4j:警告请正确初始化log4j系统。

然而,在加载spring上下文(下面的main method中的第3行)之后,我能够看到所有“与spring相关”的日志,也就是说,警告甚至在加载spring上下文之前就出现了,但在加载spring上下文之后,正在记录spring日志。

我提供我的应用程序Java主类

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

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

<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。属性文件:

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()方法中添加下面的第一行来消除警告。

组织。阿帕奇。log4j。记录器。getLogger(“org.springframework”)。设置水平(水平关闭);

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

请帮忙。提前谢谢。

共有1个答案

庾鸿飞
2023-03-14

这个警告告诉我们,log4j。运行时在类路径中找不到属性。当你运行应用程序时,确保你真正掌握了它,而不仅仅是作为某个IDE或其他地方项目的一部分。

并检查bean配置中的路径……假设,{MYPROJECT_HOME}和log4j之间没有足够的some/连接。属性

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

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

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

或者您可以这样配置它:

BasicConfigurator.configure();

但在这种情况下,您的所有日志记录将仅限于系统。出去,所以这可能不是你想要的。

 类似资料:
  • 问题内容: 我是Java的新手,刚开始弄清类加载器的概念。现在,关于线程上下文类加载器的使用,log4j出现了一些问题。 我收到以下错误: 我的应用程序大致以这种方式工作:在初始化URLClassLoader#1时,它会构建并加载一些类,这些类使用log4j。稍后在URLClassLoader#2上进行构造(其父类为URLClassLoader#1)并加载更多类,这些类也使用log4j。当使用UR

  • 问题内容: 在SpringMVC应用程序中,有没有一种方法可以使用web.xml加载上下文? 问题答案: Spring可以轻松集成到任何基于Java的Web框架中。你需要做的就是在中声明并使用 设置要加载的上下文文件。 然后,你可以使用WebApplicationContext来获取bean的句柄。

  • 下面是一个场景,我正在使用Spring Data JPA保存一个实体(我们将其称为CG实体)。在这个CG实体中,我们有很多实体一一,一多和M-M,在这些实体中,有更多的关系等等。我正在通过主键设置CG实体,并向其添加其他实体对象。所以基本上,这个CG实体PK应该作为FK来使用CG中的大多数其他实体。 有些实体是新的,有些实体是通过创建具有给定主Id的对象来设置的(因此不需要使用相关的存储库来查找和

  • 所以我有一个项目,在其中我使用Spring boot,并希望利用一个模块系统。我希望模块系统能够动态地重新加载。我让它几乎可以工作,但是@ComponentScan在模块中完全不工作。 有一个模块文件夹,包含启动时加载的jar文件,需要动态卸载、加载和重新加载。 模块通过AnnotationConfigApplicationContext创建,上下文的类加载器设置为核心的类加载器,模块接口中的方法

  • 我正在为project编写集成测试,我希望在Spring将所有数据库迁移脚本导入到schema.sql之前将其合并到schema.sql中。为此,我使用了一个小类,它在项目中搜索sql文件并将它们合并为一个。我创建了一个套件,如下所示: 那么,这是我的测试: 但这并不像我想象的那样有效。看起来Spring试图运行schema.sql的速度比我创建schema.sql的速度要快,但失败如下所示: 附