怎样在log4j.xml配置文件中引入变量:小公司经验较多的我和阿里UC等大公司经验较多的Boss,一些技术交流和探讨

阅读:375 2019-03-19 14:41:56 来源:新网

从最初学习使用log4j的时候,网上和书本上主要都是使用“log4j.properties”这种属性格式,配置日志。多年以来,一直使用这种格式,总的来说,简单、够用。而有十多年经验的boss,不建议使用properties格式配置,而是用xml格式配置。boss之前在阿里(支付宝、淘宝)、uc等大公司工作过。

我们有个很明显的不同:我比较注重,简单、快速。boss比较注重,规范、严谨。我的观点:没有对与错,只有适用与不适用。每个人都是根据自己的经历和追求,做出的技术选择。对于技术使用者来讲,明白不同配置的好处和坏处,才是需要注意的。就log4j.xml这种配置来说,功能确实可能更多一些,可以单独把业务日志和普通的系统日志分离,运维过程中,很容易看到业务错误,从而更快的解决问题。------------------------------------------------------------------------------------------------------------另外,boss觉得需要把log4j的输出目录配置成变量。比如:,log4joutputpath可以是“c:/log4j/”。boss根据之前在阿里的工作经验,开发和运维可能完全是2拨人。开发只管写代码,把代码写好,没有功能和业务问题。运维,负责把代码部署好,域名解析、nginx、tomcat、日志配置。运维导致的问题,运维背锅。功能问题,开发背锅。职责分明,流水化作业。我对这种流水化的作业是非常认同的,这样的企业生产效率才高,才能为国家和社会创造更多的价值。而象武汉一起好等很多在技术方面,偏向中小型规模的企业来说,开发和运维很可能就是“同一拨人”。这个时候,系统配置要怎么做,就是个值得探讨的问题了。------------------------------------------------------------------------------------------------------------boss最初建议,修改tomcat的启动脚本,在里面增加变量配置,比如“-dlog4joutputpath=c:/log4j”。我一听,就不太赞成这种做法了。对于开发与运维都是一拨人,经常需要和其它开发人员交流的情况,修改tomcat自身的配置比较麻烦。为什么这么说呢?tomcat是系统级的程序,而我们的代码是应用级的程序。开发者,对自己的应用程序,一般是掌控度非常高的,但是对于tomcat等不是自己写的系统程序,把控度比较低。tomcat的随便一行启动代码,不小心改错了,就启动不了了。修改tomcat还有坏处,本地开发、线上部署、交接给其它客户,还得让客户去修改tomcat这个和咱们的程序无关的配置,是不科学的。我的建议是,把这些配置,放在外围,写入个文件,比如startuptomcat.sh,在启动的时候指定参数。每个人都可以很灵活地修改log4j等配置参数。初步商议,我们采用这种做法。总结下:

log4j配置可在web.xml中配置log4j.xml的位置,参数名称为:log4jxmlpath。

也可以,配置log4j的日志输出位置的目录,参数名称为:log4joutputpath。

log4jinitcn.fansunion.common.web.log4jinitlog4jxmlpathc:/log4j.xmllog4joutputpathc:/log4j/xiaolei20注意:这2个参数都必须输入绝对地址,如果log4jxmlpath没有值,或者对应的文件不存在,将把classpath下的log4j.xml作为默认配置文件。如果再找不到,将报错,log4j配置失败。

如果log4joutputpath没有值,或者对应的文件不存在,将把classpath下的log4j文件夹作为默认的输出目录。

publicclasslog4jinitextendshttpservlet{privatestaticfinallongserialversionuid=1l;publicvoidinit(servletconfigconfig)throwsservletexception{//从web.xml中找到log4j的输出目录stringlog4joutputpath=config.getinitparameter("log4joutputpath");//默认的日志输出位置if(stringutils.isblank(log4joutputpath)){log4joutputpath=log4jinit.class.getclassloader().getresource("").getfile()+"/log4j";}filelog4joutputpathfile=newfile(log4joutputpath);//如果输出文件不存在,手动创建booleanlog4xmlfileexists=log4joutputpathfile.exists();if(!log4xmlfileexists){system.out.println(log4joutputpathfile.mkdirs());}//log4j.xml文件中的变量是在这里设置的system.setproperty("log4joutputpath",log4joutputpath);//从web.xml中找到log4j.xml的输出目录stringlog4jxmlpath=config.getinitparameter("log4jxmlpath");booleanexist=false;//如果在web.xml手动配置,log4jxmlpath应该使用绝对地址,否则,就使用默认的位置和文件名就行if(stringutils.isnotblank(log4jxmlpath)){filefile=newfile(log4jxmlpath);exist=file.exists();}//log4jxmlpath默认位于classpath下log4j.xmlif(!exist){urlresource=log4jinit.class.getclassloader().getresource("log4j.xml");if(resource!=null){log4jxmlpath=resource.getfile();}}domconfigurator.configure(log4jxmlpath);}}

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服