怎样去掉警告 log4j:WARN No appenders could be found for logger

本文详细介绍了Log4j配置的方法及常见警告的解决方案。通过具体的配置文件和代码示例,展示了如何设置日志级别、输出格式及文件滚动策略等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

资料参考:[url]http://www.java1995.cn/blog/item/144[/url]
LOG4J配置全接触
[url]http://xace.iteye.com/blog/729036[/url]
应用程序在运行的时候打印出了如下警告信息:
log4j:WARN No appenders could be found for logger
log4j:WARN Please initialize the log4j system properly.

原因:程序中使用了log4j日志处理模块,但在程序运行环境中没有设置 log4j.properties 文件,log4j 就会报上述警告了。

解决方法:

1 在应用程序运行路径下加上log4j.properties 文件.
2 应用程序的开始之处,利用如下语句直接去掉日志:
System.setProperty( "org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog" );
重新运行程序,发现上述那两行 log4j 的警告已经没有了。

原由:为什么我在src没有放置log4j.properties文件呢,因程序中需要为日志输出到一个文件,得这个文件的位置是应用服务器下,所以不能是log4j.properties中硬编码设置日志文件生成的位置,要在程序中动态设置.
如下代码:
日志文件名称:log4jConfig.properties

log4j.rootLogger=INFO,logfile
# DailyRollingFileAppender:每天产生一个日志文件
# Threshold=WARN:指定日志消息的输出最低层次。
# ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
# File=mylog.txt:指定消息输出到mylog.txt文件。
# Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
# DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分
# %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
# %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
# %r: 输出自应用启动到输出该log信息耗费的毫秒数
# %c: 输出日志信息所属的类目,通常就是所在类的全名
# %t: 输出产生该日志事件的线程名
# %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
# %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
# %%: 输出一个"%"字符
# %F: 输出日志消息产生时所在的文件名称
# %L: 输出代码中的行号
# %m: 输出代码中指定的消息,产生的日志具体信息
# %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=/WEB-INF/logs/log4j.log
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.logfile.ImmediateFlush=true
log4j.appender.logfile.Append=true
log4j.appender.logfile.Threshold=DEBUG
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c]- %m%n

log4j.logger.com.myuser=ERROR
# DWR日志配置
log4j.logger.uk.ltd.getahead.dwr = ERROR


代码如下:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.PropertyConfigurator;

public class Log4jInit extends HttpServlet {

private static final long serialVersionUID = 1L;


public Log4jInit() {
}

public void init(ServletConfig config) throws ServletException {
String prefix = config.getServletContext().getRealPath("/");
String file = config.getInitParameter("log4jConfig");
String filePath = prefix + file;
Properties props = new Properties();
try {
FileInputStream istream = new FileInputStream(filePath);
props.load(istream);
istream.close();
String logFile = prefix + props.getProperty("log4j.appender.logfile.File");// 设置路径
Out.println("\n日志文件位置: "+logFile);
props.setProperty("log4j.appender.logfile.File", logFile);
PropertyConfigurator.configure(props);// 装入log4j配置信息
} catch (IOException e) {
toPrint("Could not read configuration file [" + filePath + "].");
toPrint("Ignoring configuration file [" + filePath + "].");
return;
}
}

public static void toPrint(String content) {
System.out.println(content);
}
}


web.xml中配置如下:

<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>com.log4j.Log4jInit</servlet-class>
<init-param>
<param-name>log4jConfig</param-name>
<param-value>/WEB-INF/classes/log4jConfig.properties</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>


要最后消除警告还要在web容器启动时加入上面那句话才行,OK

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServlet;

public class SrvStartListener extends HttpServlet implements
ServletContextListener {

private static final long serialVersionUID = 1L;


public void contextInitialized(ServletContextEvent sce) {
System.setProperty( "org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog" );
}


public void contextDestroyed(ServletContextEvent sev) {

}

}


web.xml配置如下
<listener>
<listener-class>com.SrvStartListener</listener-class>
</listener>

通过实际运用,发现只能监控处理web请求的路径,对调用DAO层的代码无能为力,唯有spring aop代理来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值