文档章节

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

FansUnion
 FansUnion
发布于 2015/05/03 01:27
字数 1403
阅读 3
收藏 0
    从最初学习使用log4j的时候,网上和书本上主要都是使用“log4j.properties”这种属性格式,配置日志。多年以来,一直使用这种格式,总的来说,简单、够用。
 
   而有十多年经验的Boss,不建议使用properties格式配置,而是用xml格式配置。Boss之前在阿里(支付宝、淘宝)、UC等大公司工作过。

   我们有个很明显的不同:  我比较注重,简单、快速。Boss比较注重,规范、严谨。

  我的观点:没有对与错,只有适用与不适用。每个人都是根据自己的经历和追求,做出的技术选择。对于技术使用者来讲,明白不同配置的好处和坏处,才是需要注意的。

  就log4j.xml这种配置来说,功能确实可能更多一些,可以单独把 业务日志和普通的系统日志分离,运维过程中,很容易看到业务错误,从而更快的解决问题。
 ------------------------------------------------------------------------------------------------------------
     另外,Boss觉得需要把log4j的输出目录配置成变量。比如:<param name="File" value="${log4jOutputPath}/front/default.log" />,log4jOutputPath可以是“C:/log4j/”。

      Boss根据之前在阿里的工作经验,开发和运维可能完全是2拨人。开发只管写代码,把代码写好,没有功能和业务问题。运维,负责把代码部署好,域名解析、Nginx、Tomcat、日志配置。运维导致的问题,运维背锅。功能问题,开发背锅。职责分明,流水化作业。
    我对这种流水化的作业是非常认同的,这样的企业生产效率才高,才能为国家和社会创造更多的价值。


   而象武汉一起好等很多在技术方面,偏向中小型规模的企业来说,开发和运维很可能就是“同一拨人”。这个时候,系统配置要怎么做,就是个值得探讨的问题了。
 ------------------------------------------------------------------------------------------------------------
   Boss最初建议,修改Tomcat的启动脚本,在里面增加变量配置,比如“-Dlog4jOutputPath=c:/log4j”。

    我一听,就不太赞成这种做法了。对于开发与运维都是一拨人,经常需要和其它开发人员交流的情况,修改Tomcat自身的配置比较麻烦。
为什么这么说呢?

    Tomcat是系统级的程序,而我们的代码是应用级的程序。开发者,对自己的应用程序,一般是掌控度非常高的,但是对于Tomcat等不是自己写的系统程序,把控度比较低。Tomcat的随便一行启动代码,不小心改错了,就启动不了了。
   修改Tomcat还有坏处,本地开发、线上部署、交接给其它客户,还得让客户去修改Tomcat这个和咱们的程序无关的配置,是不科学的。


   我的建议是,把这些配置,放在外围,写入个文件,比如startupTomcat.sh,在启动的时候指定参数。每个人都可以很灵活地修改log4j等配置参数。
   初步商议,我们采用这种做法。
 
   总结下:
<appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">    
<param name="File" value="${log4jOutputPath}/front/default.log" /><!-- 设置日志输出文件名 -->  
</appender>


Eclipse本地启动的时候,增加VM参数,-Dlog4jOutputPath=c:/log4j
Windows端Tomcat单独启动:
startupTomcat.bat
set JAVA_OPTS=%JAVA_OPTS% -Dlog4jOutputPath=c:/log4j -Dp2p.config_path=file:C:/apache-tomcat-7.0.37/
startup.bat

Linux端和Windows端类似~ 
----------------------------------------------------------------------------------------------------------
第2种做法,适合开发和运维都是同一人的情况,把log4j的变量,放在Web.xml里,部署的时候,需要手动修改这个变量。

log4j配置

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

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

<servlet>
     <servlet-name>Log4jInit</servlet-name>
     <servlet-class>cn.fansunion.common.web.Log4jInit</servlet-class> 
     <init-param> <param-name>log4jXmlPath</param-name> <param-value>C:/log4j.xml</param-value> </init-param> 
      <init-param> <param-name>log4jOutputPath</param-name> <param-value>C:/log4j/xiaolei2</param-value> </init-param> 
    <load-on-startup>0</load-on-startup> 
</servlet>



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

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

Author:
fansunion@qq.com 2015年1月8日

Java代码 Log4jInit.java

public class Log4jInit extends HttpServlet {

private static final long serialVersionUID = 1L;

public void init(ServletConfig config) throws ServletException {

// 从web.xml中找到log4j的输出目录
String log4jOutputPath = config.getInitParameter("log4jOutputPath");
// 默认的日志输出位置
if (StringUtils.isBlank(log4jOutputPath)) {
log4jOutputPath = Log4jInit.class.getClassLoader().getResource("")
.getFile()
+ "/log4j";
}
File log4jOutputPathFile = new File(log4jOutputPath);
// 如果输出文件不存在,手动创建
boolean log4xmlFileExists = log4jOutputPathFile.exists();
if (!log4xmlFileExists) {
System.out.println(log4jOutputPathFile.mkdirs());
}
// log4j.xml文件中的变量是在这里设置的
System.setProperty("log4jOutputPath", log4jOutputPath);

// 从web.xml中找到log4j.xml的输出目录
String log4jXmlPath = config.getInitParameter("log4jXmlPath");
boolean exist = false;
// 如果在web.xml手动配置,log4jXmlPath应该使用绝对地址,否则,就使用默认的位置和文件名就行
if (StringUtils.isNotBlank(log4jXmlPath)) {
File file = new File(log4jXmlPath);
exist = file.exists();
}
// log4jXmlPath默认位于classpath下log4j.xml
if (!exist) {
URL resource = Log4jInit.class.getClassLoader().getResource(
"log4j.xml");
if (resource != null) {
log4jXmlPath = resource.getFile();
}
}
DOMConfigurator.configure(log4jXmlPath);
}
}

----------------------------------------------------------------------------------------------------------
  从技术方面的学习,加入一起好,遇到Boss,是我人生的大幸。要不然,我很难这么快就了解阿里等大公司的一些实际做法。
  我决定扎根武汉,是不太可能去阿里系工作的。
  怀揣梦想的我,也不可能委身于阿里。

小雷FansUnion-博学的互联网技术工作者,全栈式多屏开发工程师

  2015年1月25日

  湖北-武汉-循礼门

© 著作权归作者所有

FansUnion
粉丝 60
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问
9102年了,你的简历里还是只有vue全家桶吗?

为什么都是两年经验的前端,会的东西也都是vue、react那一套,有些人的简历有面试机会,有些人的却没有? 我们组(深圳阿里lazada)由于业务扩张,一直在招人,但是由于简历较多,面试时间有限,...

hpoenixf
01/06
0
0
Kubernetes and Cloud Native Meetup Beijing

活动介绍 Kubernetes & Cloud Native Meetup是在CNCF的号召下,掀起的遍布全球的系列技术沙龙,聚焦分享与探讨以Kubernetes为代表的云原生技术的使用经验。越来越多的公司将容器和 Kubernet...

阿里云栖开发者沙龙
02/21
0
0
js事件在手机浏览器是否能够正常运行

公司的管理系统,现在需要自动适配手机版,bootstrap虽然可以适配,但是用户体验不太好,毕竟是管理系统,数据交互操作较多,和一般的网站性质不同. 现在有个疑问,在浏览器上能够正常运行的js事件,...

光石头
2013/03/29
1K
2
10年Java开发,应该是怎样的一个程度?

我是从事 Java 开发,期间还做了 ROR 辅助开发。会 Scala、HTML/CSS、Linux基础配置、Shell、Perl、Python 等 工作期间换了几个公司,做项目,使用的开源技术有:ElasticSearch、Docker 等 ...

AkataMoKa
2016/07/14
9.3K
44
阿里巴巴前架构师 360度无死角剖析微服务

▲活动介绍 微服务是当前软件架构领域非常热门的词汇,在社区中也有很多热烈的讨论。微服务是近年来备受关注的话题,它的出现让我们想起了十年前的 SOA(Service-Oriented Architecture,面向...

EKKOCHEN
2017/10/10
3
0

没有更多内容

加载失败,请刷新页面

加载更多

新手转行学java难吗?新手学java需要注意的6个方面!

新手转行在成都学java到底难不难,对于这个问题,我们专门做过一个调查,超过1000名已经在职的java从业者,其中有80%的程序员觉得学java不难,20%的程序员觉得前期有点难,其中对于50%自学的...

Java领航员
49分钟前
3
0
动态规划-硬币问题分析

什么是动态规划 上次对动态规划已经有了个大概的分析。引用维基百科的话就是: dynamic programming is a method for solving a complex problem by breaking it down into a collection of...

AI考拉
57分钟前
1
0
谈谈lucene的DocValues特性之SortedSetDocValuesField

SortedSetDocValuesField与SortedDocValuesField类似但它是一键多值的(注意:lucene的数据模型是支持一键多值的即key-values模型),lucene在实现时会判断是一键一值还是多值,如果单值就调...

FAT_mt
今天
1
0
生产者消费者模式

//尚学堂视频里,不是完整的 public class Movie { /** * 共同的资源 */ private String pic; //flay为true生产,false消费 private boolean flag=true; public synchronized void play(Str......

南桥北木
今天
1
0
使用阿里云镜像安装kubernetes

参考阿里云镜像 https://opsx.alibaba.com/mirror?lang=zh-CN 系统: CentOS / RHEL / Fedora cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https......

北漂的我
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部