实习了几个月,都不怎么写博客,今天在使用log4j的时候蛮纠结的,测试的时候是在普通的Java项目里面测试,使用还蛮简单的,结果将log4j移植到web项目中。好吧,问题出现了。折腾了我一个下午,结果还是路径的问题
问题描述: 配置了log4j.properties文件,配置文件放在src目录下,导入了jar包,结果在将日志信息写入文件中时出现问题了,根本就没有写入。
log4j.properties:
log4j.rootLogger=INFO, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%-5p\: %d{ISO8601}\: %C{1}[line\:%L}\: %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=WEB-INF/log/offlineMap.log
log4j.appender.R.MaxFileSize=1024KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=5
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-5p\: %d{ISO8601}\: %C{1}[line\:%L}\: %m%n
在java的类中使用如下:
package com.ylz.dao.map.impl;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import com.ylz.dao.map.MapQueryDao;
import com.ylz.model.TableInfo;
import com.ylz.utils.MapMerger;
import com.ylz.utils.MapToSqlHelper;
public class SiteDaoImpl implements MapQueryDao {
private SimpleJdbcTemplate siteJdbcTemplate;
private static Logger logger = Logger.getLogger(SiteDaoImpl.class);
public SimpleJdbcTemplate getSiteJdbcTemplate() {
return siteJdbcTemplate;
}
public void setSiteJdbcTemplate(SimpleJdbcTemplate siteJdbcTemplate) {
this.siteJdbcTemplate = siteJdbcTemplate;
}
public Map<String, Object> query(TableInfo tableInfo) {
String sql = MapToSqlHelper.getMapToSqlHelper().parseMapToSql(tableInfo).toString();
Map<String,Object> rsMap = null;
try {
rsMap = this.getSiteJdbcTemplate().queryForMap(sql, new Object[]{tableInfo.getQueryId()});
} catch(EmptyResultDataAccessException e){
logger.warn("WARNING : SiteDaoImpl.java query查询结果为空,请注意ID编号是否正确!");
return null;
}
return MapMerger.getMapMerger().merge(rsMap,tableInfo.getColumnMap());
}
}
结果是:只能将日志信息输出到控制台,而无法输出到日志文件中。这不是我想要的结果。
解决方法:
重新让log4j定位properties文件,这时,我把log4j.properties配置文件WEB-INF下面,然后让tomcat启动的时候就解析这个配置文件,然后将日志文件的位置重新赋值。而要在tomcat启动时做点事情,那么我写了一个servlet将load-on-startup设置为1,在web.xml配置文件中如下:
<!-- servlet配置 -->
<servlet>
<servlet-name>Log4jServlet</servlet-name>
<servlet-class>com.ylz.servlet.logger.Log4jServlet</servlet-class>
<init-param>
<param-name>configFile</param-name>
<!-- 这里配置的位置是相对于web应用的目录 (位于Tomcat服务器中) -->
<param-value>WEB-INF/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
但是,我不让这个servlet被访问,仅仅需要servlet读取我们配置的log4j.properties的位置信息,然后再去重新配置log4j.properties配置文件里面的日志文件存放路径。这样的话,我在servlet的init方法里面做这些事情即可。
package com.ylz.servlet.logger;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.log4j.PropertyConfigurator;
public class Log4jServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public Log4jServlet() {
}
/**
* 初始化log4j配置文件的位置,然后重新设置日志文件的记录位置
* @author LINWENBIN
* @since 2013-5-27
* @throws 如果日志文件初始化失败,那么就抛出运行时异常,不然程序继续运行了. 更正,要考虑容错机制的加入.
*/
public void init() throws ServletException {
String log4jConfigFilePath = this.getServletConfig().getInitParameter("configFile");
String webRootPath = this.getServletContext().getRealPath("/");
webRootPath = webRootPath.replaceAll("\\\\","/");
String log4jConfigFileRealName = webRootPath + log4jConfigFilePath;
Properties prop = new Properties();
InputStream is = null;
try {
is = new FileInputStream(log4jConfigFileRealName);
prop.load(is);
String logFilePath = prop.getProperty("log4j.appender.R.File");
logFilePath = webRootPath + logFilePath;
System.out.println(logFilePath);
[b]PropertyConfigurator.configure(prop);[/b]
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally{
try {
is.close();
} catch (IOException e1) {
throw new RuntimeException(e1);
}
}
}
}
思考:为什么不用Filter,Listener来实现这个事情呢?
我的理解:因为Filter没办法和tomcat一起启动并且在达到过滤条件的时候就会执行doFilter,这样反而浪费资源。而Listener在符合触发条件的时候,如session的创建,销毁等时刻就会触发各种listener对应的方法,这样也会导致不必要的调用。反而,我们放在servlet的init中然后不给这个servlet配置servlet-mapping则可以避免这些不必要的调用。
分享到:
相关推荐
讲述在web应用中使用日志工具log4J,需要的朋友看看哈~
log4j 在web中的应用
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过...
Log4j很有必要使用,能很清楚了解程序的运行。 本文件主要是web和普通项目的Log4j的使用!~ 两个demo及log4j的一个总结ppt~!
在web应用中增加跟踪功能学习在多线程环境下ApacheLog4j的NDCMDC开发.pdf
基于Apache开源项目Log4j的Web应用,Linux部署控制台日志级别调整。可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地、日志信息的输出格式log4j除了可以记录程序运行日志信息外还有一重要的功能就是...
它分布在一个小的.jar文件(log4jwebtracker.jar)中,并且必须放在Java Web应用程序的WEB-INF/lib文件夹中。 要对其进行配置,必须在WEB-INF/web.xml文件中添加如下所示的映射: < servlet>TrackerServlet ...
WAS上log4j日志不能输出(ibatis)sql语句解决办法[借鉴].pdf
公司使用Apache作为Web应用服务器,日志采用log4j组件来做。日志是应用软件中不可缺少的部分,Apache的开源项目Log4j是一个功能强大的日志组件,提供方便的日志记录。 Log4j是Apache基金会的一个项 目,Log4j是一个...
jboss下通过配置log4j.xml实现web应用的日志.htm log4j.xml log4j.xml配置文件设置.doc Log4J快速入门.htm pwosboy -JavaEye技术社区.htm 将系统日志发布到多个文件.htm 请问怎么控制日志的输出啊.htm 怎样关闭...
自定义 Log4J 的 SocketAppender,在日志服务器和调用事件的各种客户端之间进行通信。 如何使用:AsynchListener - 通知程序 - 当日志服务器在特定端口和机器上准备就绪时,通知日志客户端是否准备好调用通知。 ...
Web4Log是一个基于java的web应用项目,使用Apache Wicket作为其前端框架,使用SocketAppender Log4J logger模拟其他应用的日志输出的tail命令。 它可以帮助您在一个基于 Web 的界面中监控来自一个或多个应用程序的 ...
WEB应用框架,基于JDK1.6.0,使用JAVA语言进行开发。开发工具使用MYECLIPSE6.5M,后台数据库使用MYSQL5.1.28,应用服务器使用...WEB应用框架采用当前流行的STRUST架构,使用LOG4J、XML等技术,具有一定的领先水平。
对hibernate,及web开发,有更好的辅助作用。
第2篇JSP高级技术分为7章,深入剖析了主流的Web开发框架,包括EL表达式语言、JSTL、自定义标签、Log4j、Hibernate、Spring框架;第3篇Java Web技术应用分为5章,介绍具体场景下的应用案例,包括注册登录模块的应用、...
13.2 在jsp中使用javabean 412 13.2.1 [jsp:usebean] 412 13.2.2 [jsp:setproperty] 413 13.2.3 [jsp:getproperty] 414 13.2.4 示例 414 13.3 网上书店程序 418 13.4 小结 440 第14章 jsp开发的两种模型 441 ...
13.2 在jsp中使用javabean 412 13.2.1 [jsp:usebean] 412 13.2.2 [jsp:setproperty] 413 13.2.3 [jsp:getproperty] 414 13.2.4 示例 414 13.3 网上书店程序 418 13.4 小结 440 第14章 jsp开发的两种模型 441 ...
13.2 在jsp中使用javabean 412 13.2.1 [jsp:usebean] 412 13.2.2 [jsp:setproperty] 413 13.2.3 [jsp:getproperty] 414 13.2.4 示例 414 13.3 网上书店程序 418 13.4 小结 440 第14章 jsp开发的两种模型 441 ...
该应用的注释非常规范与详细,是学习XP模式开发web应用的非常好... 使用时的疑问:在标签中使用子标签会报”A zip file cannot include itself”的错误信息,但是如果杀掉已经压缩好的war档,有时能够构建成功!
主要内容包括:Tomcat和Java Web开发的基础知识、Java Web开发的高级技术、在Java Web应用中运用第三方提供的实用软件(如Struts、Velocity和Log4J)的方法,以及Tomcat的各种高级功能。 书中内容注重理论与实践相...