Struts2 日志原理及配置方法
Struts2没有直接使用Log4j或JCL(Apache Java Commons Logger),也没有使用slf4j它先编写了自己的LoggerFactory(com.opensymphony.xwork2.util.logging.LoggerFactory),然后让其选择使用何种LoggerFactory,然后再进行日志处理
如果你在使用Struts2的类中使用它的日志系统,如在action中使用,可以按照以下的方式编码
package cn.sengtang.valuestack_ognl.web.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
public class FooAction extends ActionSupport {
private Logger logger = LoggerFactory.getLogger(FooAction.class);
@Override
public String execute() throws Exception {
String msg="debug level logger Info";
logger.debug(msg);
return super.execute();
}
}
以下看看LoggerFactory.getLogger();方法的实现
getLoggerFactory().getLoggerImpl(cls);
而getLoggerFactory()的核心代码为
if (factory == null) {
try {
Class.forName("org.apache.commons.logging.LogFactory");
factory = new com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory();
} catch (ClassNotFoundException ex) {
// commons logging not found, falling back to jdk logging
factory = new JdkLoggerFactory();
}
}
显然,在Struts2的getLoggerFactory中有两种选择:Apache的CommonLogging 和JdkLoggerFactory,在前者不行的情况下将选择后者。
如何使用CommonLogger则其默认的LogFactory也会按照先后顺序决定使用哪个Log实现
References:commons-logging-1.1.1/site/guide.html#Quick Start
Look for a configuration attribute of this factory named org.apache.commons.logging.Log (for backwards compatibility to pre-1.0 versions of this API, an attribute org.apache.commons.logging.log is also consulted). Configuration attributes can be set explicitly by java code, but they are more commonly set by placing a file named commons-logging.properties in the classpath. When such a file exists, every entry in the properties file becomes an "attribute" of the LogFactory. When there is more than one such file in the classpath, releases of commons-logging prior to 1.1 simply use the first one found. From release 1.1, each file may define a priority key, and the file with the highest priority is used (no priority definition implies priority of zero). When multiple files have the same priority, the first one found is used. Defining this property in a commons-logging.properties file is the recommended way of explicitly selecting a Log implementation.
Look for a system property named org.apache.commons.logging.Log (for backwards compatibility to pre-1.0 versions of this API, a system property org.apache.commons.logging.log is also consulted).
If the Log4J logging system is available in the application class path, use the corresponding wrapper class (Log4JLogger).
If the application is executing on a JDK 1.4 system, use the corresponding wrapper class (Jdk14Logger).
Fall back to the default simple logging wrapper (SimpleLog).
大意如下
查找factory的org.apache.commons.logging.Log属性(这个API与1.0之前的版本是向后兼容的).可以通过Java代码对配置属性进行明确的设置,但更通用的方式是在classpath(类路径下)放置一个commons-logging.properties属性文件 。
查找名为org.apache.commons.logging.Log的系统属性
如果Log4j 日志系统在应用程序的类路径下是可用,则使用对用的包装器类Log4jLogger
如果应用程序运行在JDK1.4上,使用对应的包装器类Jdk14Logger
最后回退到使用默认的简单日志包装器SimpleLog
我们可以利用Common-Logger查找日志记录器的第3条原则,直接将Log4 的jar放到项目的Classpath中
并配置Log4j的log4j.properties就可以了
log4j.rootLogger=warn, stdout
log4j.logger.cn.sengtang=debug
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
那Struts2又是如何加载LoggerFactory的呢?
StrutsPrepareAndExecuteFilter中init方法的关键代码为
InitOperations init = new InitOperations();init.initLogging(config);
InitOperations.initLogging()的关键代码为:
String factoryName = filterConfig.getInitParameter("loggerFactory");
Class cls = ClassLoaderUtils.loadClass(factoryName, this.getClass());
LoggerFactory fac = (LoggerFactory) cls.newInstance();
LoggerFactory.setLoggerFactory(fac);
以下代码显示,Struts会通过名为loggerFactory的参数加载LoggerFactory,
则可以通过在web.xml中设置
<filter>
<filter-name>strut2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>loggerFactory</param-name>
<param-value>
com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory
</param-value>
</init-param>
</filter>
以上的请求过程,用序列图表示为:
可以直接将附件中的WAR部署,访问http://localhost:8080/struts2logger/Foo查看控制台的日志消息
源码包为struts2logger.rar
分享到:
相关推荐
Struts2、Freemarker和Log4j是Java Web开发中的三个重要组件,它们各自扮演着不同的角色。这里,我们来深入探讨这三个技术的核心概念及其整合应用。 **Struts2** 是一个开源的MVC(Model-View-Controller)框架,...
通过以上内容可以看出,《Pro Apache Log4j 第二版》是一本非常详尽且实用的指南,不仅介绍了Apache Log4j的基本原理和配置方法,还涉及了大量高级特性和实战技巧,非常适合希望深入了解并运用Log4j进行高效日志记录...
总之,调试Struts2应用需要全面理解其架构和工作原理,结合配置、日志、断点、拦截器等手段,逐步缩小问题范围,找到问题的根源。随着经验的积累,你将更加熟练地驾驭Struts2框架,解决各种开发难题。
9. **log4j**: 日志记录库,用于调试和监控应用的运行情况。 10. **servlet-api**: Java Servlet API,所有Web应用程序都需要的库,提供了Servlet和JSP的相关接口和类。 这些JAR文件共同构成了Struts2框架的基础,...
在这个方法中,我们可以编写记录日志的代码,如使用`java.util.logging.Logger`或者`org.apache.log4j.Logger`库。 2. **注解支持**:为了让拦截器能够根据注解自动应用到特定的方法或Action,我们需要实现`...
Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。在使用Struts2的过程中,可能会遇到一...理解Struts2的工作原理,结合日志信息,通常可以找出导致404错误的原因,并进行修复。
5. **commons-logging-1.0.4.jar**:Apache Commons Logging是一个轻量级的日志记录API,为各种日志框架(如Log4j、Java内置的日志系统)提供一个统一的接口。Struts2依赖于它来实现日志输出,方便开发者调试和跟踪...
`log4j-1.2.17.jar`是日志记录库,用于记录应用程序运行时的各种信息,帮助开发者调试和追踪问题。 `commons-beanutils-1.7.0.jar`提供了对Java Bean操作的便捷方法,如属性的读写、复制等。 在Liferay中集成...
在Struts2中,它作为日志服务的抽象层,使得开发者可以在不修改代码的情况下切换不同的日志实现,如Log4j、Java Util Logging或Simple Logging Facade for Java (SLF4J)。 2. **freemarker** FreeMarker是一个模板...
这个库允许开发者在不修改代码的情况下切换底层日志实现,如Log4j、java.util.logging等。通过commons-logging,Struts2可以记录框架运行过程中的信息,帮助开发者调试和优化应用程序。 这五个jar包构成了Struts2...
5. `log4j-1.2.17.jar`:Apache的流行日志记录框架,Struts2使用它进行系统日志记录,帮助开发者追踪和诊断程序中的问题。 6. `commons-lang3-3.1.jar`:Apache Commons Lang库,提供了许多Java语言层面上的实用...
`log4j.txt`通常是日志记录配置文件,Log4j是Apache的一个开源项目,提供了一个灵活的日志系统。开发者可以通过配置log4j来控制日志信息的输出级别、格式以及输出位置,这对于调试和监控应用运行状态至关重要。 `...
- **日志和异常处理**:如何在Struts2中配置日志框架(如Log4j),以及如何处理应用程序中的异常。 通过分析和实践这些代码,你可以深入理解Struts2的工作原理,掌握如何使用它来构建Web应用程序。同时,这也会帮助...
`log4j-core-2.6.2.jar`是日志框架,提供日志记录功能;`spring-web-4.3.7.RELEASE.jar`和`spring-beans-4.3.7.RELEASE.jar`分别包含了Spring的Web支持和Bean管理功能。 整合SSH框架需要理解每个框架的工作原理,...
6. **log4j-1.2.16.jar** - Log4j是一个广泛使用的日志记录框架,帮助开发者调试和记录程序运行情况。 7. **com.springsource.org.quartz-1.6.2.jar** - Quartz是一个作业调度框架,可用于安排任务执行。 8. **mysql...
对于初学者来说,这个压缩包提供了一个很好的实践机会,可以学习如何配置Struts1.2、编写Action、处理JSP表单数据以及使用Log4j进行日志记录。通过对`myActionServlet.java`、`struts-config.xml`和`log4j....
内容推荐 Struts是目前非常流行的基于MVC的Java ...第19章到第21章介绍了如何采用第三方软件,如Apache Common Logging API、Log4J、ANT和StrutsTestCase,来控制Struts应用的输出日志、管理以及测试Struts应用项目。
Struts是目前非常流行的基于MVC的Java Web框架。...第19章到第21章介绍了如何采用第三方软件,如Apache Common Logging API、Log4J、ANT和StrutsTestCase,来控制Struts应用的输出日志、管理以及测试Struts应用项目。