Log4j+Spring配置

0 评论  

    现在的公司项目原有的log4j是采用的最传统的方式,即在classpath下面新建一个log4j.properties文件,待Tomcat启动的时候log4j.jar会自动扫描这个路径,如果发现这个文件,则加载它,如果没有,打印警告信息并采用默认配置。 这样的配置应该是最简单的,但却很难实现一些比较实在的需求,比如日志输出文件路径采用相对路径,对日志配置文件的监听和动态加载。


    Spring看到了这些需求,发挥其无所不包的特性,对log4做了封装,实现了上述的功能。具体配置如下:
    在web.xml 添加

    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>webName.root</param-value>
    </context-param>
    <context-param>
  <param-name>log4jExposeWebAppRoot</param-name>
  <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>WEB-INF/log4j.properties</param-value>
    </context-param>

    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>60000</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

  1. 这里的webAppRootKey是保存整个web应用的相对路径的Key,在你的log4j.properties文件中引用这个路径的时候只需要类似 ${webName.root}就可以了,
  2. log4jExposeWebAppRoot则是表示是否需要把Web应用的根路径导出到webAppRootKey中
  3. log4jConfigLocation,没的说,你的配置文件,这里之所以要你指明,还是有一点玄机的
  4. log4jRefreshInterval,对日志配置文件的监听线程刷新间隔,毫秒为单位
  5. org.springframework.web.util.Log4jConfigListener,上述的context-param最终都是被这个Listener读取并借此初始化以及动态修改log4j配置的

配置算是相当简单了,但 有两个需要值得注意的地方

  1. webAppRootKey不是必须的,如果不填,会自动默认会webapp.root,但如果你有多个web应用运行在同一个JVM中,则必须要指定,不然大家都是webapp.root,所有的webapp.root会指向JVM加载的最后一个web应用的根路径。
  2. log4jConfigLocation这个路径很重要,如果直接沿用传统的方式的路径,WEB-INF/classes/log4j.properties或者classpath:log4j.properties,虽然一样能加载,但是由于log4j自身会自动扫描这个路径,所以应用启动的时候会先抛出多个找不到路径的异常(java.io.FileNotFoundException:),因为你所指定的,根据${webapp.root}来的相对路径log4j本身是不认识的。

Py2exe Bad file Descriptor

0 评论  

       前段时间用python做的上传工具,是用wxPython做UI的,再结合py2exe打包成直接可以运行的exe,虽然打包的时候遇到了乱码的问题,但误打乱撞的也解决了这个问题,不过经验告诉我们,用一个新的东西的时候,问题总是会有的,果然,后来一直遇到一个很奇怪的问题,代码在IDE里面运行得好好的,打包成exe后就经常会报一个 error, bad file descriptor的错误。 而且最离奇的就是这个错误好像是随机出现的,一会有,一会又没有,google一下这个错误,它本身的意思就是打开文件或者读写文件的时候出错了,类似共享冲突,锁 之类。


       这个问题困扰了我很久,我也尝试过很多种方法,后来偶然一次把日志输出的功能关掉,问题暂时得到了解决,但也只是出现的频率少了,还是会出现,真是吐血,关键是搞了这么久也不知道是啥原因啊。。。


       今天又Google了一下,不经意间看到一行文字[Errno 9] Bad file descriptor. 39, #. 40, # In other words, after printing a certain number of bytes to the。。。。 突然想起,难道是因为打包过后 print 函数输出的东西没地方去了,原本是到标准输出的,现在是GUI了,没有命令行窗口了,就会出错了? 一念及此,立马把所有的print都注释掉,再重新打包,运行,呵呵,还真是这个问题


       看来编程序不能马虎啊,当初为省力,一开始没配日志模块,全用print了,方便,也就是祸根了。 另一方面,要想很快的解决问题,多学点基础,原理才是正理啊