一般情况我们无需特意设计日志系统, 有许多成熟的日志工具,例如用日志门面slf4j 、日志log4j等,在代码中直接使用即可。但为了灵活和方便,我们还是设计了日志模块——TLLog,模块是对这些工具的一个封装,主要是封装了slf4j,利用log4j2来记录日志。一般的日志工具只是对日志的级别可控,由TLLog来控制日志的输出更加的灵活,不仅可以控制日志输出的级别,还能对日志输出的类(模块)、日志输出点(tag)进行控制。例如一个模块里面有5个地方输出日志,我们可以做到是否允许这个模块输出,或者只允许某个点输出。下面看日志模块的配置文件来说明:
<moduleConfig>
<params>
<ifLog value="true" />
<level value="info" />
<logModules value=""/>
<noLogModules value="httpClient;myserviceRegistTask;HttpJsonClientHandler;
viewfindReceivers1;info_waiting_transmit_2;info_waiting_transmit_1;stream_receiver"/>
</params>
<moduleSetting>
<module name="HSServer" levels="info;warn;debug" tags="" ></module>
<module name="myTaskManger" levels="info;warn;error" tags="" ></module>
</moduleSetting>
</moduleConfig>
params项中:
iflog :定义是否输出日志
level:定义全局输出级别
logModules:定义允许输出日志的模块
noLogModules ;定义禁止输出日志的模块
logModule 比noLogModules 优先,如果定义了logModule,则noLogModules无效。上面配置中logModule为空,则只检查禁止模块。
moduleSetting 项可单独定义某个模块的日志输出级别及输出点(tags配置项)。
在日志输出使用中,为了方便,在基本模块类TLBaseModule中定义了日志输出方法 putLog,因此任何继承类都可使用、方便的输出日志而不用考虑日志的配置。我们看putLog方法:
protected void putLog(String content , LogLevel logLevel, String tag){
if(params!=null )
{
String ifLog=params.get("ifLog");
if( ifLog!=null && ifLog.equals("false"))
return ;
}
putMsg("log", createMsg().setAction("setLog")
.setParam("module",name)
.setParam("logLevel",logLevel)
.setParam("tag",tag)
.setParam("content",content) );
}
如果该类的参数ifLog设置了false则不日志输出,也就是每个模块可自行决定日志是否输出。
tag 参数定义输出点,日志配置中可以对不同的tag点进行输出控制。
方法里通过直接给日志模块log发送消息来输出日志。日志模块log在工厂配置中指向了TLlog,这意味着我们也可以通过更改工厂配置来更换日志模块。工厂配置中日志模块:
<module name="log" classfile="cn.tianlong.tlobjcet.modules.TLLog" configfile="log_config.xml"/>
在android环境下就是通过工厂配置来更换了日志模块。
目前日志输出工具类使用log4j2,因此在入口程序中需首先指定log4j2的配置文件路径:
String configdir = "/person/"; String path =Main.class.getResource(configdir).getPath(); System.setProperty("log4j.configurationFile", path+"log4j2.xml");
由于框架的动态配置功能(启用配置文件监听模块),因此在运行中我们可以动态的更改日志配置文件来灵活日志控制。