关于log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).的问题

 

 

今天在运行某程序时出现了如上图所示的问题,查找资料后发现是由于由于log4j这个日志信息打印模块的配置信息没有给出造成的,简单的说就是人家要有个地方来存放日志的打印信息,可是你又不给人家,所以就报错了吧

解决办法:

在你的项目的src目录中创建一个名为log4j.properties的文本文件,记住是文本文件,不是文件夹

然后在你的文本文件中加入如下的内容:

# Configure logging for testing: optionally with log file  
  
#log4j.rootLogger=debug,appender  
log4j.rootLogger=info,appender  
#log4j.rootLogger=error,appender  
  
#\u8F93\u51FA\u5230\u63A7\u5236\u53F0  
log4j.appender.appender=org.apache.log4j.ConsoleAppender  
#\u6837\u5F0F\u4E3ATTCCLayout  
log4j.appender.appender.layout=org.apache.log4j.TTCCLayout

 

我去==没成功 啥原因 继续找

根据错误提示中的链接到Apache官网找日志信息,然鹅(ಥ_ಥ)全是英文 不行 硬着头皮也得把他弄懂了

其实也还蛮简单的 大致上就是说log4j的配置文件没有找到并且应用程序执行的时候没有显示配置,而log4j呢,是依靠Thread.getContextClassLoader().getResource() 这两个类去定位文件的默认信息而不是直接去查他的文件系统,而你要将log4j放在合适的位置就需要知道类装入器(class loader大致是这么个理)的搜索策略,log4j没有提供一个默认的配置不管是输入到控制台还是到文件系统中,不过也可能在某些环境中被禁止。哔哔了半天,就是和文章开头我言简意赅的解释一样

 

并没有解决问题,所以接着看:

简单的说就是 log4j的类和属性文件不在同一个类加载器的范围。

不简单的说==就是 J2EE或servlet容器利用java的类加载系统,Sun改变了方法与java 2的发布方式,在java类装载器2,被安排在一个分层的parent-child关系,当一个子类的类加载器需要找到一个类或资源,它首先代表父类的要求。

log4j只使用默认的类加载类forname()机制 结论就是:所以,如果你有问题,尝试自己加载类或资源 

看样子Apache的log也没帮到忙

最后在外网上找到一个回答:

将该方法插入到main函数中,可以自行打印日志信息了

BasicConfigurator.configure(); //自动快速地使用缺省Log4j环境。

然后测试程序没有问题:

 

 ------------------------------------------------------------------------------------

BUT 虽然日志信息打印出来了 可是配置的问题其实还是没有解决

posted @ 2017-05-17 16:07  亲爱的不二999  阅读(86611)  评论(5编辑  收藏  举报