|
public
class
Log4jConfigListener
implements
ServletContextListener {
public
void
contextInitialized(ServletContextEvent event) {
Log4jWebConfigurer.initLogging(event.getServletContext());
}
public
void
contextDestroyed(ServletContextEvent event) {
Log4jWebConfigurer.shutdownLogging(event.getServletContext());
}
}
|
| private String CLASSPATH = "classpath:";
private
String
location
=
CLASSPATH
+
"log4j.xml"
;
private
String
locationRunning
=
location
;
private
long
refreshInterval
= 60000;
private
long
refreshSecond
= 0;
private
long
refreshMinute
= 0;
private
long
refreshHour
= 0;
private
boolean
refreshDaemon
=
false
;
|
| publicinterface ILog4JRefreshInterval
{
public
void
init();
//
根据配置信息初始化日志
public
void
destroy();
//
销毁日志
public
void
refreshIntervalThread();
//
定时加载日志的配置信息
public
void
refreshIntervalImmediately();
//
立即加载默认的日志配置信息
public
void
refreshIntervalImmediatelyByFilePath(String log4jFilePath);
//
立即加载指定的日志配置文件
public
void
refreshIntervalImmediately(
boolean
isXmlConfig,String log4jConfigInfo);
//
立即加载指定的日志配置文件
public
String getRunningConfing()
throws
Exception;
//
获取正在运行的日志配置信息
}
|
|
</
head
>
<
body
>
<
img
src
=
"logger.jpg"
alt
=
"
日志动态配置管理控制台
"
/>
<
form
action
=
"log4JRefresh.do"
method
=
"post"
>
<
p
>
配置内容:(两者只取其一)
</
p
>
<
p
><
input
checked type
=
"radio"
name
=
"configMethod"
onclick
=
"isXmlConfig.disabled=true;log4jConfigInfo.value
='';log4jConfigInfo.disabled=true;log4jFilePath.disabled
=false;log4jFilePath.focus();"
/>
1、
Log4J
的文件路径,格式如下:
<
input
name
=
"log4jFilePath"
ondblclick
=
"this.value='/var/
log4j.properties'"
size
=
"100"
/></
p
>
<
ul
>
<
li
>
classpath:log4j.properties
或者
classpath:log4j.xml
</
li
>
<
li
>
file:C:/log4j.properties
或者
file:C:/log4j.xml
</
li
>
<
li
>
C:/log4j.properties
或者
C:/log4j.xml
</
li
>
</
ul
>
<
p
><
input
type
=
"radio"
name
=
"configMethod"
onclick
=
"log4jFilePath.value='';log4jFilePath.disabled=
true;isXmlConfig.disabled=false;log4jConfigInfo.disabled=
false;log4jConfigInfo.focus();"
/>
2、
Log4J
的详细配置信息:
</
p
>
<
p
>
配置方式:
<
select
name
=
"isXmlConfig"
>
<
option
value
=
"0"
selected
>
Property
</
option
>
<
option
value
=
"1"
>
XML
</
option
>
</
select
>
(请根据实际的配置内容选择相应的类型)
</
p
>
<
textarea
name
=
"log4jConfigInfo"
rows
=
"23"
cols
=
"123"
ondblclick
=
"this.value=''"
>
# default.layout.ConversionPattern = %t [%c{3}]-[%-5p]:[%L]:%m%n
default.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t] [%c{3}]-[%-5p]:[%L]:%m%n
</
textarea
>
<
input
type
=
"submit"
value
=
"
提 交
"
/>
<
input
type
=
"reset"
value
=
"
重 置
"
/>
</
form
>
<
br
>
<
a
href
=
"log4JRunning.do"
title
=
"
查看正在运行的
Log4J
配置信息。
"
>
查看配置信息
</
a
>
<
a
href
=
"log4JRefresh.do"
title
=
"
立刻重新加载通过配置文件加载的
Log4J
配置信息。
"
>
立刻重新加载
</
a
>
<
a
href
=
"log4JShutdown.do"
title
=
"
立刻停止
Log4J
的服务,所有日志关停。
"
>
立刻停止日志
</
a
>
<
a
href
=
"HelloServlet"
title
=
"
调用
Servlet
来测试
Log4J
信息是否正常。
"
>
测试是否正常
</
a
>
</
body
>
</
html
>
|
| publicclass HelloServlet extends HttpServlet
{
privatestaticfinallongserialVersionUID = -4506255419343502640L;
privatestaticfinal Logger logger = Logger.getLogger(HelloServlet.class);
publicvoid doGet(HttpServletRequest request,HttpServletResponse response)
{
try
{
ServletOutputStream out = response.getOutputStream();
out.println("<html xmlns=/"http://www.w3.org/1999/xhtml/">");
out.println("<head>");
out.println("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=GBK/"/>");
out.println("<title>动态配置测试页面</title>");
out.println("<link href=/"facade.css/" rel=/"stylesheet/" type=/"text/css/"/>");
out.println("</head><body>");
out.println("<img src=/"logger.jpg/" alt=/"日志动态配置管理控制台/"/>");
out.println("<p>Begin:" + new Date() + "<br/>");
if(logger.isDebugEnabled())
{
logger.debug("DEBUG级别的信息:debugging<p>");
out.println("DEBUG级别的信息:debugging</p>");
}
if(logger.isInfoEnabled())
{
logger.info("INFO级别的信息:information<p>");
out.println("INFO级别的信息:information</p>");
}
logger.warn("warning");
logger.error("error");
logger.fatal("fatal");
out.println("End:" + new Date() + "<br/>");
out.println("</p></body></html>");
out.flush();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
|
| <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>动态配置操作成功</title>
<link href="facade.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<img src="logger.jpg" alt="日志动态配置管理控制台"/>
<p>
恭喜:动态配置操作成功!
<p>
当前的配置为:
<textarea rows="23" cols="123" ReadOnly><%=request.getAttribute("RunningConfig")%></textarea>
<p>
<a href="JavaScript:history.go(-1)">返 回</a>
</body>
</html>
|
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.
PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:LoggerConsole.properties</value>
</list>
</property>
</bean>
<bean id="log4JRefreshInterval" class="net.agile.springtime.logger.util.Log4JRefreshInterval" init-method="init" destroy-method="destroy">
<property name="location" value="${logger.log4j.location}"/>
<property name="refreshDaemon" value="${logger.log4j.refreshDaemon}"/>
<property name="refreshInterval" value="${logger.log4j.refreshInterval}"/>
<property name="refreshSecond" value="${logger.log4j.refreshSecond}"/> <property name="refreshMinute" value="${logger.log4j.refreshMinute}"/> <property name="refreshHour" value="${logger.log4j.refreshHour}"/> </bean>
</beans>
|
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.
SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/log4JRefresh.do">log4JRefreshController</prop>
<prop key="/log4JShutdown.do">log4JShutdownController</prop>
<prop key="/log4JRunning.do">log4JRunningController</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.
view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<bean id="log4JRefreshController" class="net.agile.springtime.logger.web.Log4JRefreshController">
<property name="successView" value="RefreshSuccess"/>
<property name="failedView" value="RefreshFailed"/>
<property name="log4JRefreshInterval"
ref="log4JRefreshInterval"/>
</bean>
<bean id="log4JShutdownController" class="net.agile.springtime.logger.web.Log4JShutdownController">
<property name="successView" value="RefreshSuccess"/>
<property name="failedView" value="RefreshFailed"/>
<property name="log4JRefreshInterval"
ref="log4JRefreshInterval"/>
</bean>
<bean id="log4JRunningController" class="net.agile.springtime.logger.web.Log4JRunningController">
<property name="successView" value="RefreshSuccess"/>
<property name="failedView" value="RefreshFailed"/>
<property name="log4JRefreshInterval"
ref="log4JRefreshInterval"/>
</bean>
</beans>
|
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<import resource="beanRefLog4J.xml" />
<import resource="beanRefMVC.xml" />
</beans>
|
|
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Spring Log4J Refresh Web Application</display-name>
<description>Spring Log4J Refresh Web Application</description>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/beanRefApplication.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>50</load-on-startup>
</servlet>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<display-name>HelloServlet</display-name>
<servlet-class>net.agile.springtime.logger.web.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
|
1. 启动应用,访问 http://localhost:8080/Log4J_Spring_Web/ 如下图所示

可以选择"Log4J的文件路径"或者直接输入详细的配置文件的"Log4J的详细配置信息"方式进行动态切换
2.查看配置信息
可以查看到当前正在运行的配置信息,如下图:

3.立刻重新加载
可以立即加载默认的日志配置 文件,并返回默认的配置内容,如下图:

4.立刻停止日志
可以立即停止日志,并显示停止前的日志配置信息,如下图:

5.测试是否正常
可通过此测试用的 Servlet 来查看日志是否成功,在重新加载新的配置文件后,建议都调用一下来测试是否切换成功,如下图:
先提交 INFO 等级的配置

然后查看测试的结果信息,如下:

只显示 INFO 级别的信息
更改为 DEBUG级别,并提交,如下:

然后查看测试的结果信息,如下:

五、总结
一个简单的封装与扩展,实现了对日志的配置进行动态切换,调试、监控和检查系统的运行时信息,方便了许多,提升了开发效率。
4781




被折叠的 条评论
为什么被折叠?



