`
忆梦竹
  • 浏览: 65958 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

在web应用中使用log4j

阅读更多
实习了几个月,都不怎么写博客,今天在使用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则可以避免这些不必要的调用。


0
2
分享到:
评论

相关推荐

    Web项目中使用Log4j实例

    本篇文章将深入探讨如何在Web项目中集成并使用Log4j,以便更好地管理和分析应用的日志。 首先,Log4j主要由三部分组成:配置文件(log4j.properties或log4j.xml)、日志记录器(Logger)和日志输出格式(Appender)...

    log4j与web.xml的配置

    - 将log4j配置文件放入WEB-INF/classes目录下,确保在Web应用启动时能被加载。 4. **通过web.xml配置Log4j** - 在web.xml中,我们可以使用`&lt;context-param&gt;`标签来指定Log4j配置文件的位置,例如: ```xml ...

    log4j 在web中的应用

    - 通过修改log4j.properties文件即可实现在运行时调整日志级别和策略的功能,而无需重启Web应用。 - 这种功能的实现依赖于Spring框架的支持,具体做法是在`web.xml`文件中指定log4j配置文件的位置: ```xml ...

    使用log4j写日志文件

    要在Web应用中使用Log4j,需要在Servlet容器启动时加载配置文件。下面是一个简单的Servlet示例,展示了如何在Servlet的`init()`方法中初始化Log4j: ```java public class InitServlet extends HttpServlet { ...

    在web应用中使用日志工具log4J

    3. **在代码中使用Log4J** - 通过`import org.apache.log4j.Logger;`导入Logger类。 - 使用`Logger.getLogger(Class)`获取一个Logger实例,通常使用当前类作为参数。 - 调用`logger.debug()`, `logger.info()`, `...

    Log4j在web和控制台应用程序的使用

    然后,"Log4jDemo.rar"可能是一个简单的Java控制台应用示例,演示了如何在非web环境中使用Log4j。在控制台应用中,Log4j的配置和使用方式与web应用基本一致,但无需考虑web容器的影响。开发者可以直接在main方法中...

    Log4j2 web demo (log4j2 version 2.1)

    **Log4j2 Web Demo(基于Log4j2 Version 2.1)*...总的来说,Log4j2 Web Demo展示了如何在Web应用中高效、灵活地记录和管理日志。通过正确的配置和使用,可以极大地提升开发效率,帮助排查问题,同时保持应用的高性能。

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    使用这个BurpSuite插件,可以有效地帮助安全从业者在目标系统中识别出Log4j、Log4j2和Fastjson的使用,并评估是否存在安全风险。无论是老版还是新版的BurpSuite,该插件都能兼容,这意味着它具有良好的兼容性和实用...

    tomcat下的log4j日志配置

    1. **引入 Log4j 库**:在特定的 web 应用的 `WEB-INF/lib` 目录下添加 Log4j 的 `.jar` 文件。 2. **编写初始化 Servlet**:创建一个自定义的 Servlet 来初始化 Log4j。该 Servlet 的主要任务是在启动时加载特定的...

    web项目log4j简单案例

    在IT行业中,日志记录是任何应用程序不可或缺的一部分,...通过这个简单的Log4j案例,你可以快速掌握在Web项目中使用日志的基本方法,进一步提升你的开发和维护能力。记住,良好的日志实践是软件工程中不可或缺的一环。

    Spring项目中怎么配置log4j

    最后,为了使Spring与log4j集成,我们需要在`web.xml`(对于Web应用)或`context.xml`(对于非Web应用)中引入log4j的初始化参数,确保在应用启动时加载log4j配置: ```xml &lt;param-name&gt;log4jConfigLocation ...

    log4j-2.18.0

    由于很多大型企业和服务都在其基础设施中使用log4j2,这个漏洞的暴露无疑对全球网络安全构成了严重威胁。 面对这样的危机,Apache官方迅速行动,发布了log4j2的2.18.0版本,作为紧急修复措施。这个新版本包含了关键...

    log4j.properties配置详解

    Log4j是一种广泛应用于Java应用程序的日志框架,它可以帮助开发者轻松管理应用程序的日志记录过程。Log4j支持多种配置方式,其中.properties文件配置是最常用的一种。通过.properties文件,我们可以灵活地设置日志...

    weblogic中使用log4j生成日志文件实例

    2. **集成到WebLogic**: 在WebLogic中使用Log4j,我们需要将Log4j的JAR文件(如`log4j-x.x.x.jar`)添加到WebLogic的类路径中。这通常可以通过在WebLogic的`WEB-INF/lib`目录下放置Log4j JAR文件来实现。同时,确保`...

    log4j.properties(完整版) log4j.properties(精简版)

    Log4j是Apache组织开发的一个强大的、灵活的日志记录框架,被广泛应用于各种Java应用中。本文将围绕Log4j的核心配置文件`log4j.properties`进行详细讲解,分为完整版和精简版两个部分。 **1. Log4j基础概念** Log4...

    log4j2所需jar包

    6. **应用场景**:Log4j2适用于各种Java应用程序,包括Web应用、桌面应用、微服务、大数据项目等,可以帮助开发者进行问题排查、性能分析和合规审计。 总的来说,这两个jar文件是构建和运行Log4j2日志系统的基础,...

    Tomcat下使用Log4j接管生成日志文件

    在代码中使用Log4j 在Java代码中,通过以下方式获取并使用logger: ```java import org.apache.log4j.Logger; public class MyClass { private static final Logger logger = Logger.getLogger(MyClass.class); ...

    tomcat9 slf4j+log4j2 写日志.zip

    本教程主要关注如何在Tomcat 9环境中使用SLF4J(Simple Logging Facade for Java)和Log4j2进行日志记录,并解决可能出现的日志不写入问题。 首先,SLF4J是一个日志门面,它为各种日志框架提供了抽象层,如Logback...

    log4j所依赖jar包

    总的来说,这个压缩包为Java开发者提供了一个方便的集合,包含了运行Log4j所需的所有依赖,使得他们能够在项目中轻松地引入和使用Log4j进行日志管理。在实际操作中,开发者还需要理解Log4j的配置和使用方法,以充分...

    Log4j详解,详细讲解log4j的使用,和原理

    Log4j 是一款功能强大的日志记录工具,广泛应用于 Java 应用程序中。它可以帮助开发人员调试和分析程序,记录程序的运行情况,并提供了灵活的配置方式来控制日志的输出。 Log4j 的概念 Log4j 中有三个主要的组件:...

Global site tag (gtag.js) - Google Analytics