struts2源码解析一 Struts2 日记原理及配置方法
2014-07-01 10:30
295 查看
转自:http://www.myexception.cn/software/1518737.html
Struts2 日志原理及配置方法
Struts2没有直接使用Log4j、JCL(Apache Java Commons Logger)或slf4j。
它编写了自己的LoggerFactory(com.opensymphony.xwork2.util.logging.LoggerFactory),然后让其选择使用何种LoggerFactory,然后再进行日志处理。
在action中使用,可以按照以下的方式编码:
private Logger logger = LoggerFactory.getLogger(FooAction.class);
String msg="debug level logger Info";
logger.debug(msg);
struts2中日志源码涉及的有:
在org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter类中init方法中,初始化日志对象,如下:
在org.apache.struts2.dispatcher.ng.InitOperations类中的initLogging方法,
以下代码显示,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>
以下看看LoggerFactory.getLogger();方法的实现
见com.opensymphony.xwork2.util.logging.LoggerFactory类。
设置日志处理类,此处用到了写锁处理。
日志获取类共取了四次,
1,webwork的配置文件读取
2,org.apache.commons.logging.LogFactory
3,org.slf4j.LoggerFactory
4,JdkLoggerFactory
备注:我这里的struts的版本为2.3.16.3
Struts2 日志原理及配置方法
Struts2没有直接使用Log4j、JCL(Apache Java Commons Logger)或slf4j。
它编写了自己的LoggerFactory(com.opensymphony.xwork2.util.logging.LoggerFactory),然后让其选择使用何种LoggerFactory,然后再进行日志处理。
在action中使用,可以按照以下的方式编码:
private Logger logger = LoggerFactory.getLogger(FooAction.class);
String msg="debug level logger Info";
logger.debug(msg);
struts2中日志源码涉及的有:
在org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter类中init方法中,初始化日志对象,如下:
public void init(FilterConfig filterConfig) throws ServletException { InitOperations init = new InitOperations(); Dispatcher dispatcher = null; try { FilterHostConfig config = new FilterHostConfig(filterConfig); <span style="color:#ff0000;">init.initLogging(config); </span> dispatcher = init.initDispatcher(config); init.initStaticContentLoader(config, dispatcher); prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher); this.excludedPatterns = init.buildExcludedPatternsList(dispatcher); postInit(dispatcher, filterConfig); } finally { if (dispatcher != null) { dispatcher.cleanUpAfterInit(); } init.cleanup(); } }
在org.apache.struts2.dispatcher.ng.InitOperations类中的initLogging方法,
public void initLogging( HostConfig filterConfig ) { <span style="color:#ff0000;">String factoryName = filterConfig.getInitParameter("loggerFactory"); </span> if (factoryName != null) { try { <span style="color:#ff0000;">Class cls = ClassLoaderUtil.loadClass(factoryName, this.getClass()); LoggerFactory fac = (LoggerFactory) cls.newInstance(); LoggerFactory.setLoggerFactory(fac); </span> } catch ( InstantiationException e ) { System.err.println("Unable to instantiate logger factory: " + factoryName + ", using default"); e.printStackTrace(); } catch ( IllegalAccessException e ) { System.err.println("Unable to access logger factory: " + factoryName + ", using default"); e.printStackTrace(); } catch ( ClassNotFoundException e ) { System.err.println("Unable to locate logger factory class: " + factoryName + ", using default"); e.printStackTrace(); } } }
以下代码显示,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>
以下看看LoggerFactory.getLogger();方法的实现
见com.opensymphony.xwork2.util.logging.LoggerFactory类。
public static void setLoggerFactory(LoggerFactory factory) { lock.writeLock().lock(); try { LoggerFactory.factory = factory; } finally { lock.writeLock().unlock(); } }
设置日志处理类,此处用到了写锁处理。
public static Logger getLogger(String name) { return getLoggerFactory().getLoggerImpl(name); }
protected static LoggerFactory getLoggerFactory() { lock.readLock().lock(); try { if (factory != null) { return factory; } } finally { lock.readLock().unlock(); } lock.writeLock().lock(); try { if (factory == null) { <span style="color:#ff0000;">String userLoggerFactory = System.getProperty(XWorkConstants.XWORK_LOGGER_FACTORY); </span> if (userLoggerFactory != null) { try { <span style="color:#ff0000;"> Class clazz = Class.forName(userLoggerFactory); </span> factory = (LoggerFactory) clazz.newInstance(); } catch (Exception e) { throw new XWorkException("System property [" + XWorkConstants.XWORK_LOGGER_FACTORY + "] was defined as [" + userLoggerFactory + "] but there is a problem to use that LoggerFactory!", e); } } else { try { <span style="color:#ff0000;">Class.forName("org.apache.commons.logging.LogFactory");</span> factory = new com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory(); } catch (ClassNotFoundException ex) { //commons-logging not found try slf4j LogFactory try { <span style="color:#ff0000;">Class.forName("org.slf4j.LoggerFactory"); </span> factory = new Slf4jLoggerFactory(); } catch (ClassNotFoundException cnfex) { // slf4j not found, falling back to jdk logging <span style="color:#ff0000;">factory = new JdkLoggerFactory(); </span> } } } } return factory; } finally { lock.writeLock().unlock(); } }
日志获取类共取了四次,
1,webwork的配置文件读取
2,org.apache.commons.logging.LogFactory
3,org.slf4j.LoggerFactory
4,JdkLoggerFactory
备注:我这里的struts的版本为2.3.16.3
相关文章推荐
- Struts2 日志原理及配置方法(结合Log4j)
- jQuery源码——.html()方法原理解析
- Rhyme/Struts2源码解析以及拦截器原理模拟
- struts2--(4)---深入解析struts.xml配置的实现原理
- struts2 之执行原理|源码解析|拦截器|权限案例(04)
- Spring 事务管理配置方法以及对应源码解析
- struts2拦截器的实现原理及源码解析
- Struts2 日志原理及配置方法(结合Log4j)
- 【mybatis源码分析】原理分析之三:初始化(配置文件读取和解析)
- linux 内核编译:内核配置原理与常见配置问题的解决方法&&内核版本控制解析
- 解析xml的几种方法,他们的原理,比较 以及JAVA源码
- jquery源码解析:jQuery队列操作queue方法实现的原理
- Struts2原理解析(结合源码)
- spring源码(2)之解析配置文件原理
- Spring IOC原理源码解析(@Autowired原理详解 :标识属性与方法)(二 )
- Android源码解析之在Activity中调用measure方法测量宽高的原理
- java环境变量配置原理解析以及eclipse导入外包的方法
- Struts2 日志原理及配置方法(结合Log4j)
- 解析xml的几种方法,他们的原理,比较 以及JAVA源码
- 解析xml的几种方法,他们的原理,比较 以及JAVA源码