“apache.org里面很多都是用commons-logging作log,commons-logging会自己寻找,用户到底是在使用log4j还是java.util.logging,并使用用户配置的log。所以你配置了log4j,虽然没有为tomcat/struts/validator作配置,但是它也找到了你的配置并采用之。所以,你最好在commons-logging层(而非log4j/java.util.logging层)把它的level级别提高,甚至彻底关闭。”请问大侠:
commons-logging  是什么?是一个写日志的class吗?它和log4j是什么关系?
我现在的问题确实是:validator擅自使用了我非为它而配置的log4j在输出信息。可是我看不懂这句话:“你最好在commons-logging层(而非log4j/java.util.logging层)把它的level级别提高,甚至彻底关闭”,请问我该怎样做?请一定要告诉我!
还有,在server.xml中为一个web配置了: <Logger className="org.apache.catalina.logger.FileLogger"
             prefix="localhost_admin_log." suffix=".txt"
          timestamp="true"/>,这个logger会为这个web记录一些什么信息呢?是否会和我自己配的另外一个log4j冲突呢?
(^_^,上一个和这个问题相关的帖子我已经结了,可是问题还没搞清楚,所以再发一贴)

解决方案 »

  1.   

    首先commons-logging也是用来记日志的,但是,它和log4j/java.util.logging不同,一般它不涉及底层的I/O操作(当然,它也有自己的),而是利用了用户所配置的log4j/java.util.logging或者其他类似log工具来代劳。默认情况下,它主要是通过判断当前的java系统有无加载过log4j/java.util.logging这样的logger,比如是否已经加载了org.apache.log4j.Logger或者java.util.logging.Logger这样的class,如果有,所有的log输出,最终都是由这个它们来完成的。之所以让你在commons-logging层面控制,将commons-logging设置为不使用log4j/java.util.logging,而是只用自己的(org.apache.commons.logging.impl.SimpleLog),并且限制level。这样,不管你之后log4j的配置如何变更,哪怕是输出ALL,它都会乖乖地闭嘴:P
      

  2.   

    上面那个是Server.xml里面的,应该是Tomcat 4的,Tomcat 5的配置样式已经有略微变化这个主要是Tomcat的全局Logger,主要用来记录一些和服务器相关的信息,比如,服务器启动/停止,某个war的发布,解除配备,当然还有最近常看到的jsp出错的信息
      

  3.   

    至于你怎么做,就是我在另一个帖子里写的,在WEB-INF\classes下面放两个properties
      

  4.   

    第一个commons-logging,强制使用org.apache.commons.logging.impl.SimpleLog,而不是log4j第二个SimpleLog设置刚才那个org.apache.commons.logging.impl.SimpleLog的全局level
      

  5.   

    commons-logging  大致就是一个专门用来记录日志的包了? 其作用地位就和log4j一样,只是没有使用得这么广泛了吧?
    log4j一经配置,是否就是整个jvm共用的?因为你说“它主要是通过判断当前的java系统有无加载过log4j/java.util.logging这样的logger,比如是否已经加载了org.apache.log4j.Logger或者java.util.logging.Logger这样的class”,而一个class在jvm一次生存期间只加载一次(或者多次,但是某个时刻肯定只有一个),那么,是否我的一个web里是否可用别的web应用里配置的logger?(当然我不会这样做罗,呵呵,只是想搞清楚这个道理)
      

  6.   

    不是JVM,而是ClassLoader,简单点说,ClassLoader就是class的容器和加载器你的web和其他的,比如root,classloader不同,可以保存同一个class多次(甚至是不同版本)