struts2源码解析一 Struts2 日记原理及配置方法

转自: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方法中,初始化日志对象,如下:

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值