JavaWeb应用中初始化Log4j的两种方式
本文主要介绍了普通JavaWeb应用(基于Tomcat)中初始化Log4j的两种方式:
1、通过增加 InitServlet ,设置令其自启动来初始化 Log4j 。
2、通过监听器 ServletContextListener 监听 ServletContext 的初始化事件来初始化 Log4j 。
先来看下方式一,直接上代码:
web.xml 编写如下:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>initServlet</servlet-name>
<servlet-class>com.michael.controll.InitServlet</servlet-class>
<init-param>
<param-name>log4j</param-name>
<param-value>WEB-INF/config/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>initServlet</servlet-name>
<url-pattern>/initServlet.do</url-pattern>
</servlet-mapping> </web-app>
其中参数 <load-on-startup>1</load-on-startup> 指定 initServlet 随 web 应用的部署而自启动,启动优先级为 1,此数值越小,优先级越高。
并在参数 <param-value>WEB-INF/config/log4j.properties</param-value> 中指定 log4j.properties 文件存放的位置。
InitServlet 代码如下:
public class InitServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
String prefix = getServletContext().getRealPath("/");
// Log4J
String log4jFile = getServletConfig().getInitParameter("log4j");
String log4jConfigPath = prefix + log4jFile;
PropertyConfigurator.configure(log4jConfigPath);
}
}
这样即可完成 log4j 的初始化工作。
再来看下方式二,通过监听器 ServletContextListener 监听 ServletContext 的初始化事件来初始化 Log4j 。
web.xml 代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> <context-param>
<param-name>log4j</param-name>
<param-value>WEB-INF/config/log4j.properties</param-value>
</context-param> <listener>
<listener-class>com.michael.listener.MyServletContextListener</listener-class>
</listener> </web-app>
同样在 servletContext 初始化参数 <param-value>WEB-INF/config/log4j.properties</param-value> 中指定文件存放位置。
下面看下监听 servletContext 初始化的监听器:
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext ctx = servletContextEvent.getServletContext();
String prefix = ctx.getRealPath("/");
// Log4J
String log4jFile = ctx.getInitParameter("log4j");
String log4jConfigPath = prefix + log4jFile;
PropertyConfigurator.configure(log4jConfigPath);
System.out.println("initialized log4j finish");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
在 context 初始化完成后调用 contextInitialized 方法完成 Log4j 的初始化。
值得注意的是,无论在 <load-on-startup>1</load-on-startup> 参数中把自启动 servlet 的优先级设置的多高,这个 servlet 的 init 方法都会在
ServletContextListener 的 contextInitialized 方法调用之后才被调用。
本篇随笔主要用于个人备忘,如有不对,敬请指出!
JavaWeb应用中初始化Log4j的两种方式的更多相关文章
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- jQuery中开发插件的两种方式
jQuery中开发插件的两种方式(附Demo) 做web开发的基本上都会用到jQuery,jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数 ...
- web.config文件中配置数据库连接的两种方式
web.config文件中配置数据库连接的两种方式 标签: 数据库webconfig 2015-04-28 18:18 31590人阅读 评论(1)收藏举报 分类: 数据库(74) 在网站开发 ...
- java中数组复制的两种方式
在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...
- 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...
- Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...
随机推荐
- javascript中的垃圾回收
1引用计数垃圾回收 核心:跟踪记录对象被引用的次数.思路是如果一个对象A被赋值给了一个变量v,则该对象A的引用计数值加1,如果变量v又被赋予其他值了,比如a="str",则该对象A ...
- powerdesigner Oracle.sql转mysql.sql
将要导入的库的所有表的表结构(不要表数据,只要表结构)导出成一个.sql文件. 在PowerDesinger里找到 File -->> Reverse Engineer --->&g ...
- 玩转angularJs——通过自定义ng-model,不仅仅只是input可以实现双向数据绑定
体验更优排版请移步原文:http://blog.kwin.wang/programming/angularJs-user-defined-ngmodel.html angularJs双向绑定特性在开发 ...
- OSCache-JSP页面缓存(2)
如果在jsp中使用如下标签 <cache:cache key="foobar" scope="session"> some jsp content ...
- 通过helloworld来认识下backbone
Backbone主要涉及3部分:model,collection和view.而这个框架的优势在于:数据与视图分离,通过操作model来自动更新view. 根据我的个人经验,直接写个简单的例子是最最直观 ...
- s=1+2*3+4*5*6+7*8*9*10+.... C语言求解
#include <stdio.h> /*类似斐波那契数列的计算方式 项 1 2 3 4 1 2*3 4*5*6 7*8*9*10 生成项的起始数字 1 2 4 7 和后一项的差值 1 2 ...
- 189. Rotate Array 从右边开始翻转数组
[抄题]: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the ...
- while循环for循环优缺点和应用
while循环常用于那种不知道循环次数是多少的情况,比如让用户循环输入一个整数,直到输入某个特殊的字符为止,你根本没法直到这个循环会进行的次数. for循环多用于循环次数比较明确的情况,比如for(n ...
- 特征选择Boruta
A good feature subset is one that: contains features highly correlated with (predictive of) the clas ...
- 正确设置-Dfile.encoding参数
正确设置-Dfile.encoding参数 摘自:https://blog.csdn.net/youge/article/details/6178265 2011年02月11日 10:18:00 阅读 ...