实习了几个月,都不怎么写博客,今天在使用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主要由三部分组成:配置文件(log4j.properties或log4j.xml)、日志记录器(Logger)和日志输出格式(Appender)...
- 将log4j配置文件放入WEB-INF/classes目录下,确保在Web应用启动时能被加载。 4. **通过web.xml配置Log4j** - 在web.xml中,我们可以使用`<context-param>`标签来指定Log4j配置文件的位置,例如: ```xml ...
- 通过修改log4j.properties文件即可实现在运行时调整日志级别和策略的功能,而无需重启Web应用。 - 这种功能的实现依赖于Spring框架的支持,具体做法是在`web.xml`文件中指定log4j配置文件的位置: ```xml ...
要在Web应用中使用Log4j,需要在Servlet容器启动时加载配置文件。下面是一个简单的Servlet示例,展示了如何在Servlet的`init()`方法中初始化Log4j: ```java public class InitServlet extends HttpServlet { ...
3. **在代码中使用Log4J** - 通过`import org.apache.log4j.Logger;`导入Logger类。 - 使用`Logger.getLogger(Class)`获取一个Logger实例,通常使用当前类作为参数。 - 调用`logger.debug()`, `logger.info()`, `...
然后,"Log4jDemo.rar"可能是一个简单的Java控制台应用示例,演示了如何在非web环境中使用Log4j。在控制台应用中,Log4j的配置和使用方式与web应用基本一致,但无需考虑web容器的影响。开发者可以直接在main方法中...
**Log4j2 Web Demo(基于Log4j2 Version 2.1)*...总的来说,Log4j2 Web Demo展示了如何在Web应用中高效、灵活地记录和管理日志。通过正确的配置和使用,可以极大地提升开发效率,帮助排查问题,同时保持应用的高性能。
使用这个BurpSuite插件,可以有效地帮助安全从业者在目标系统中识别出Log4j、Log4j2和Fastjson的使用,并评估是否存在安全风险。无论是老版还是新版的BurpSuite,该插件都能兼容,这意味着它具有良好的兼容性和实用...
1. **引入 Log4j 库**:在特定的 web 应用的 `WEB-INF/lib` 目录下添加 Log4j 的 `.jar` 文件。 2. **编写初始化 Servlet**:创建一个自定义的 Servlet 来初始化 Log4j。该 Servlet 的主要任务是在启动时加载特定的...
在IT行业中,日志记录是任何应用程序不可或缺的一部分,...通过这个简单的Log4j案例,你可以快速掌握在Web项目中使用日志的基本方法,进一步提升你的开发和维护能力。记住,良好的日志实践是软件工程中不可或缺的一环。
最后,为了使Spring与log4j集成,我们需要在`web.xml`(对于Web应用)或`context.xml`(对于非Web应用)中引入log4j的初始化参数,确保在应用启动时加载log4j配置: ```xml <param-name>log4jConfigLocation ...
由于很多大型企业和服务都在其基础设施中使用log4j2,这个漏洞的暴露无疑对全球网络安全构成了严重威胁。 面对这样的危机,Apache官方迅速行动,发布了log4j2的2.18.0版本,作为紧急修复措施。这个新版本包含了关键...
Log4j是一种广泛应用于Java应用程序的日志框架,它可以帮助开发者轻松管理应用程序的日志记录过程。Log4j支持多种配置方式,其中.properties文件配置是最常用的一种。通过.properties文件,我们可以灵活地设置日志...
2. **集成到WebLogic**: 在WebLogic中使用Log4j,我们需要将Log4j的JAR文件(如`log4j-x.x.x.jar`)添加到WebLogic的类路径中。这通常可以通过在WebLogic的`WEB-INF/lib`目录下放置Log4j JAR文件来实现。同时,确保`...
Log4j是Apache组织开发的一个强大的、灵活的日志记录框架,被广泛应用于各种Java应用中。本文将围绕Log4j的核心配置文件`log4j.properties`进行详细讲解,分为完整版和精简版两个部分。 **1. Log4j基础概念** Log4...
在代码中使用Log4j 在Java代码中,通过以下方式获取并使用logger: ```java import org.apache.log4j.Logger; public class MyClass { private static final Logger logger = Logger.getLogger(MyClass.class); ...
总的来说,这个压缩包为Java开发者提供了一个方便的集合,包含了运行Log4j所需的所有依赖,使得他们能够在项目中轻松地引入和使用Log4j进行日志管理。在实际操作中,开发者还需要理解Log4j的配置和使用方法,以充分...
Log4j 是一款功能强大的日志记录工具,广泛应用于 Java 应用程序中。它可以帮助开发人员调试和分析程序,记录程序的运行情况,并提供了灵活的配置方式来控制日志的输出。 Log4j 的概念 Log4j 中有三个主要的组件:...
3. 在Tomcat的`web.xml`配置文件中,可能需要配置一个`ContextLoaderListener`,以确保在应用程序启动时加载Log4j配置。 压缩包中的"**lib**"目录可能包含Log4j的必要依赖库,比如`log4j.jar`,这是运行Log4j的日志...
本教程主要关注如何在Tomcat 9环境中使用SLF4J(Simple Logging Facade for Java)和Log4j2进行日志记录,并解决可能出现的日志不写入问题。 首先,SLF4J是一个日志门面,它为各种日志框架提供了抽象层,如Logback...