我们知道,在一个软件项目中是少不了日志的,我们用它来输出系统运行的关键信息,开发人员用的调试信息,以及程序出错的错误信息等等。对于这么多重要程度不同的信息,日志系统通常都会为日志分几个等级,便于在软件的开发,上线,运维阶段开关日志提供便利。要控制日志的开关,除了等级以外,通常还会划分模块,拿游戏项目来说,大的模块有UI模块、场景管理模块、游戏逻辑模块等等。大的模块下面又会分一些小的模块比如游戏逻辑又分:坦克逻辑,飞机逻辑,步兵逻辑等等。在开发阶段,调试程序的时候通常我们只会关心自己开发的模块和相关模块的运行状态,为了不让其他模块的日志把自己关心的日志淹没掉,我们会把其他模块日志关掉。
日志等级我们在这不讨论,那么一个区分模块的日志函数接口大概是一般这样的:function log(module,...)
这样看起来没什么好谈的,我们程序员使用的时候,第一个参数写上模块名字,日志函数内部会根据配置来决定是否输出该日志。但是,事实是什么呢?很多情况是写log的时候不好确定有了哪些模块,我的这个功能确切属于哪个模块的,所以通常都会有一个集大成者的模块叫all,或者几个很大很大的模块logic, render,ui,other等等,这样就导致了,几个大模块的日志还是区分不出来,然后就是催促同事把一些调试日志注释掉。然后慢慢的,大家在开发完一个模块后开发日志都会自己注释掉或删除。这样虽然能解决一些问题,但是当我们再一次改动这个模块的时候,我们就要重新去一个一个的打开注释掉的日志,如果日志被删掉了,我们还要在必要的地方重写日志,这浪费掉了我们很多调试的时间。
为了解决这个痛苦的为模块起名字问题,我们可以把每个脚本文件名字作为一个模块名(这样不至于出现特别大的模块),通过重写require的方法,为每个脚本文件都新建一个环境,在环境里写一个log,将脚本名字作为模块名传进log函数里,重写require可以参考上一篇文章:重写require使lua文件模块化
local function require(name) --.... local env = { log = function (...) Common.log(name,...) end, } --引入全局表的环境 通过_G.xxxx形式访问全局变量 setmetatable(env,{__index = _G}) local loaderWithEnv = setfenv(loader,env) --设置环境,让加载的文件模块化 --.... end
require里自动为每个脚本模块都加了一个log函数,并且大家在使用的时候根本就感觉不到模块的存在,只需要使用最简单的形式 log("xxxxxxx") 。当大家在关心日志开关的时候再去关心配置就好了。
顺便说一下,如果大家觉得为每个脚本都加一个控制太麻烦,大家可以先设置一个全局默认的开关,如果单个模块没有定义开关,就使用全局开关,如果定义了,就是用模块开关。这样比较方便调试,默认关闭所有,打开自己关心的模块,因为是脚本名字,所以模块名很方便就知道有哪些。甚至如果你的脚本名字有一些规律,你也可以通过一些字符串规则来设置开关。
lua中让log的模块开关更人性化,布布扣,bubuko.com
原文:http://blog.csdn.net/oracleot/article/details/20248103