2019独角兽企业重金招聘Python工程师标准>>>

从最初学习使用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>

启动的时候,增加VM参数,-Dlog4jOutputPath=c:/log4j

----------------------------------------------------------------------------------------------------------
第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.xmlif (!exist) {URL resource = Log4jInit.class.getClassLoader().getResource("log4j.xml");if (resource != null) {log4jXmlPath = resource.getFile();}}DOMConfigurator.configure(log4jXmlPath);}
}

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

怀揣梦想的我,也不可能委身于阿里。

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

2015年1月25日

湖北-武汉-循礼门

转载于:https://my.oschina.net/jiutianniao/blog/400279

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

  1. C#架构设计-程序运行时从xml配置文件中加载配置项并设置为全局变量

    场景 C#中全局作用域的常量.字段.属性.方法的定义与使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102550025 在 ...

  2. XML配置文件中的Spring配置文件

    我的上一个博客非常简单,因为它涵盖了我从Spring 3.0.x到Spring 3.1.x的轻松升级,最后我提到可以将Spring模式升级到3.1,以利用Spring的最新功能. 在今天的博客中,我将 ...

  3. spring中的注解和xml配置文件中配置对应总结

    spring中的注解和xml配置文件中配置对应 需要导入的jar spring-context spring-context-support spring-test commons-logging b ...

  4. Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件...

    1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...

  5. Spring的xml配置文件中tx命名空间

    Spring的xml配置文件中tx命名空间 一,spring配置文件的tx命名空间 引入tx命名空间 <?xml version="1.0" encoding="U ...

  6. struts.xml配置文件中result的语法

    struts.xml配置文件中result的语法:xxxxx Struts2支持的不同类型的返回结果为: Chain Result-->type="chain" 用来处理Ac ...

  7. Linux下sed命令替换配置文件中某个变量的值(改变包含字符的一行的值)之二——只改变第一出现的那一行

    一.背景 在之前的文章中有介绍过<Linux下sed命令替换配置文件中某个变量的值(改变包含字符的一行的值)> 但是这种方法存在一定的问题,就是假如某个变量在一个文件中出现两次,却只想更改 ...

  8. Linux下sed命令替换配置文件中某个变量的值(改变包含字符的一行的值)

    背景 项目初期,创业初期,对于部署还停留在比较简单的时期等等...部署代码需要脚本部署,那么不同环境部署代码的配置也不一样,同一个环境下,多个节点的配置不一样.同一个节点中,多个服务会用到同一个配置项 ...

  9. Spring配置文件中引入properties文件

    jdbc.properties文件中有信息如下: username=root url=jdbc:mysql://localhost:3306/qw?characterEncoding=utf8 dri ...

最新文章

  1. 如何在C中为一个数组分配空间?
  2. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波13 - 平滑低通滤波器 -盒式滤波器核
  3. CVPR 2021 | 微软提出解构式关键点回归, 刷新COCO自底向上多人姿态检测记录!...
  4. java web文件上传详解_java web图片上传和文件上传实例详解
  5. mysql代码的核心类_mysql源码---核心类 (1)线程类
  6. Simhash算法原理和网页查重应用
  7. HTTP权威指南(浓缩版)
  8. 2019年电赛之路——2015年电子设计竞赛A题任务设计
  9. Exception in thread main java.lang.NoSuchMethodException: xxx.main([Ljava.lang.String;)
  10. 怎么把磁盘合并成一个?两个硬盘分区合并,如何硬盘分区合并
  11. 数据结构 队列顺序储存 医院叫号系统
  12. 两个苹果手机共享步数_实测:iPhone上“微信运动”步数可以作弊
  13. PyQt:桌面程序设计的饕餮盛宴
  14. 哪位仁兄在狂顶精华贴?
  15. C++学习之boost安装及thread使用
  16. java里人带狗散步,不想带狗狗出门散步,告诉你5个遛狗的好处,不仅仅只有狗狗受益...
  17. PyTorch:The “freeze_support()” line can be omitted if the program is not going to be frozen
  18. Fedora 10 下载地址
  19. 云计算作者姚宏宇1月26日中关村图书大厦讲座
  20. 玩转console.log 如何在console.log里面插入图片

热门文章

  1. spring 改变url
  2. React入门教程第三课--gulp编译优化
  3. GRUB中硬盘和分区编号,UUID
  4. AD服务器不愿意处理该请求
  5. 使用Discuz!自带参数防御CC攻击以及原理,修改Discuz X 开启防CC攻击后,不影响搜索引擎收录的方法...
  6. PHP iconv 解决utf-8和gb2312编码转换问题
  7. 查看.Net Framework版本的方法
  8. 【摘录】《程序设计导引及在线实践》之排列
  9. IEnumerable
  10. 通过Python让数据产生价值,做到这4个字就够了