velocity源码分析:初始化之日志系统

本文深入探讨Velocity框架的日志系统初始化过程,包括类图分析、系统扩展性和日志记录方式的灵活性。通过Log和LogManager关注日志操作,通过LogChute接口实现日志系统的拓展。在初始化时,RuntimeInstance使用反射根据配置信息创建LogChute实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在“velocity源码分析:velocity初始化”文章中粗略地介绍了velocity整体的初始化过程,包括各个系统的初始化,本文主要介绍日志系统初始化。


日志系统类图:



概要:

1.调用:velocity源码中这种封装方式我个人是比较赞同的,也是相当容易扩展,对于日志系统之外的内容只需要关注Log(进行日志操作),LogManager(日志系统初始化)即可;

2.日志系统扩展:目前该套代码包含了大部分的日志记录方式,假设以后新增一种记录方式,只要添加对应的Chute并实现LogChute接口即可;

3.日志记录方式扩展:LogDisplayWrapper已经很好的实现了扩展,对于日志,新增一些标识,该类完全足够;


说明:

Velocity在初始化时调用RuntimeInstance.initializeLog()进行日志系统的初始化。

该方法调用如下代码,传入日志系统接口类和配置信息初始化。

LogManager.updateLog(this.log, this);

方法具体实现:

 public static void updateLog(Log log, RuntimeServices rsvc) throws Exception
    {
        // create a new LogChute using the RuntimeServices
        LogChute newLogChute = createLogChute(rsvc);
        LogChute oldLogChute = log.getLogChute();

        // pass the new LogChute to the log first,
        // (if the old was a HoldingLogChute, we don't want it
        //  to accrue new messages during the transfer below)
        log.setLogChute(newLogChute);

        // If the old LogChute was the pre-Init logger,
        // dump its messages into the new system.
        if (oldLogChute instanceof HoldingLogChute)
        {
            HoldingLogChute hlc = (HoldingLogChute)oldLogChute;
            hlc.transferTo(newLogChute);
        }
    }

1.创建LogChute:

LogChute的创建采用反射的方式初始化配置文件中定义

runtime.log.logsystem
和
runtime.log.logsystem.class

的内容。看看一下velocity自带的配置文件:

runtime.log.logsystem.class = org.apache.velocity.runtime.log.Log4JLogChute,org.apache.velocity.slf4j.Slf4jLogChute,org.apache.velocity.runtime.log.CommonsLogLogChute,org.apache.velocity.runtime.log.ServletLogChute,org.apache.velocity.runtime.log.JdkLogChute

# ---------------------------------------------------------------------------
# This is the location of the Velocity Runtime log.
# ----------------------------------------------------------------------------

runtime.log = velocity.log


默认不配置runtime.log.losystem,但配置了对应class列表,该列表的初始化顺序是:

org.apache.velocity.runtime.log.Log4JLogChute,
org.apache.velocity.slf4j.Slf4jLogChute,
org.apache.velocity.runtime.log.CommonsLogLogChute,
org.apache.velocity.runtime.log.ServletLogChute,org.
apache.velocity.runtime.log.JdkLogChute
默认初始化log4日志。 当一个日志系统能获取后就丢弃其他信息

2.替换日志系统:

RuntimeInstance代码中有成员变量:private Log log = new Log();初始化默认的日志系统。

Log()代码:

public Log()
    {
        setLogChute(new HoldingLogChute());
    }

可以发现,RuntimeInstance在初始化日志系统之前,默认使用HoldingLogChute()。

再看初始化LogManager.updateLog方法,该方法在初始化log系统之后先把原先的日志信息记录下来,如果原先采用的是HoldingLogChute,则把原先记录的信息写到新的日志系统中

这是个很简单但很有用的日志系统信息交换的方式。


至此:RuntimeInstance中:
 
private Log log = new Log();
初始化好了,至于
private  ExtendedProperties overridingProperties = null;
在调用时作初始化







                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值