我们小组在测试环境调试的时候啊,大家互相的log4j控制台输出信息都很多!不太方便各自观察! 
能否每个人都只看到自己输出的调试信息啊? 我查了一下好像说可以按包设置。可是log4j一共就6个级别。那最多也只能6个人约定好一人用一个级别?
这样开发人员A调试A包的同时,开发人员B调试B包,控制台也会出现A,B分别级别的输出信息啊!还不是一样互相冲啊!
只不过输出信息的前缀有的是debug 有的是 error好分辨一些而已.还是治标不治本啊!不知道大家有没有什么好的方法
还是我的理解有问题啊? 
怎么能做到:每个人都只看到自己输出的调试信息啊? 

解决方案 »

  1.   

    log4j的layout的配置
    a. %m  输出代码中的指定消息
    b. %p   输出优先级, 即DEBUG, INFO, WARN, ERROR, FATAL
    c. %r   输出自应用启动到输出该log信息耗费的毫秒数
    d. %c   输出所属的类目, 通常就是所在类的全名
    e. %t    输出产生该日志时间的线程名
    f. %n   输出一个回车换行符, windows平台为”\r\n”, unix为”\n”
    g. %d   输出日志时间点的日期或时间, 默认格式为ISO8601, 也可以在其后指定格式, 比如%d{yyyy MM dd HH:mm:ss, SSS}
    h. %1   输出日志时间的发生位置, 包括类目名, 发生的线程, 以及在代码中的行数.
      

  2.   

    可以自己实现common-loggin的接口。
      

  3.   

    up
    ==============================
    Log log = LogFactory.getLog( "com.discursive.jccook.SomeApp" ); if( log.isTraceEnabled( ) ) {
        log.trace( "This is a trace message" );
    }
      

  4.   


    common-loggin我觉得没有log4j好用啊.自己在那里面写来写去的,楼下的可以提供下直接用common-logging和使用log4j的优劣吗?
      

  5.   

    多写几个fileappender每个人都用自己的fileappender
      

  6.   

    请问:写代码的人A知道自己写了一行logger.debug(...);
    可是程序如何知道这一行是A写的呢?正常情况下靠Log4j是做不到这种需求的,除非你们在不同的工程下开发,那还可以每个工程配置一个监听器。否则只能想别的办法比如每个人写Log时候加上自己的签名,比如A写的就以A-开头
    然后自己写一个文件内容过滤程序,保留各自匹配签名的Log内容仅仅提供一个思路而已
      

  7.   

    如果每个人用的log4j的实例变量是不一样的,
    那么可以在加上取log4j的时候加上自己的标识符, 如:
    public final static Logger log4j = Logger.getLogger("老张的LOG");
      

  8.   

    在你的logger class中写一个这样的方法:
     public static void configureRootCategory(int workon) {
            String appenderName = null;
            synchronized (Logger.class) {
    String path = "";
    if (workon == 1) {
    appenderName = "Logger1";
    } else if (workon == 2) {
    appenderName = "Logger2";
    } URL url = Logger.class.getResource("log4j.properties");
    if (url == null) {
    url = Logger.class.getResource("/log4j.properties");
    }
    if (url == null) {
    System.err.println(Logger.class.getName() + ":"
    + MESS_FAIL_READ_PROPERTY);
    } else {
    PropertyConfigurator.configure(url);
    }
    List list = getRootCategoryNames();
    for (Iterator it = list.iterator(); it.hasNext();) {
    String aRootCategory = (String) it.next();
    if (!(appenderName.equals(aRootCategory))) {
    removeAppenderFromRootCategory(aRootCategory);
    }
    }
    }
        }然后:
     static {
            configureRootCategory(WORK_ON_BATCH);//WORK_ON_BATCH从配置在一个属性文.
        }Log4j.propertis中:
    log4j.rootCategory=DEBUG, Logger1, Logger2log4j.appender.Logger1 =org.apache.log4j.RollingFileAppender
    log4j.appender.Logger1.File=/Log/Logger1.log
    log4j.appender.Logger1.MaxFileSize=20MB
    log4j.appender.Logger1.MaxBackupIndex=100
    log4j.appender.Logger1.layout=org.apache.log4j.PatternLayout
    log4j.appender.Logger1.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss:SSS} %-5p [%t] %m (%c{3}%x)%n
    log4j.additivity.Logger1 =falselog4j.appender.Logger2 =org.apache.log4j.RollingFileAppender
    log4j.appender.Logger2.File=/Log/Logger2.log
    log4j.appender.Logger2.MaxFileSize=20MB
    log4j.appender.Logger2.MaxBackupIndex=100
    log4j.appender.Logger2.layout=org.apache.log4j.PatternLayout
    log4j.appender.Logger2.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss:SSS} %-5p [%t] %m (%c{3}%x)%n
    log4j.additivity.Logger2=false
      

  9.   

    这样开发人员A调试A包的同时,开发人员B调试B包,控制台也会出现A,B分别级别的输出信息啊!还不是一样互相冲啊! 
    只不过输出信息的前缀有的是debug 有的是 error好分辨一些而已.还是治标不治本啊!不知道大家有没有什么好的方法 
    还是我的理解有问题啊? 
    怎么能做到:每个人都只看到自己输出的调试信息啊? 
      

  10.   

    这样开发人员A调试A包的同时,开发人员B调试B包,控制台也会出现A,B分别级别的输出信息啊!还不是一样互相冲啊! 
    只不过输出信息的前缀有的是debug 有的是 error好分辨一些而已.还是治标不治本啊!不知道大家有没有什么好的方法 
    还是我的理解有问题啊? 
    怎么能做到:每个人都只看到自己输出的调试信息啊? 
      

  11.   

    这样开发人员A调试A包的同时,开发人员B调试B包,控制台也会出现A,B分别级别的输出信息啊!还不是一样互相冲啊! 
    只不过输出信息的前缀有的是debug 有的是 error好分辨一些而已.还是治标不治本啊!不知道大家有没有什么好的方法 
    还是我的理解有问题啊? 
    怎么能做到:每个人都只看到自己输出的调试信息啊? 
      

  12.   

    这个可以实现,还可以每个人定制风格不同的log.
      

  13.   

    本人写的那种方式,那是120人同时开发,500W的代码量,都没有问题,不知道各位是否对如此海量的代码中的LOG的配置还有何高见????
      

  14.   


    在你的logger class中写一个这样的方法: 
    public static void configureRootCategory(int workon) { 
            String appenderName = null; 
            synchronized (Logger.class) { 
    String path = ""; 
    if (workon == 1) { 
    appenderName = "Logger1"; 
    } else if (workon == 2) { 
    appenderName = "Logger2"; 
    } URL url = Logger.class.getResource("log4j.properties"); 
    if (url == null) { 
    url = Logger.class.getResource("/log4j.properties"); 

    if (url == null) { 
    System.err.println(Logger.class.getName() + ":" 
    + MESS_FAIL_READ_PROPERTY); 
    } else { 
    PropertyConfigurator.configure(url); 

    List list = getRootCategoryNames(); 
    for (Iterator it = list.iterator(); it.hasNext();) { 
    String aRootCategory = (String) it.next(); 
    if (!(appenderName.equals(aRootCategory))) { 
    removeAppenderFromRootCategory(aRootCategory); 



        } 然后: 
    static { 
            configureRootCategory(WORK_ON_BATCH);//WORK_ON_BATCH从配置在一个属性文. 
        } Log4j.propertis中: 
    log4j.rootCategory=DEBUG, Logger1, Logger2 log4j.appender.Logger1 =org.apache.log4j.RollingFileAppender 
    log4j.appender.Logger1.File=/Log/Logger1.log 
    log4j.appender.Logger1.MaxFileSize=20MB 
    log4j.appender.Logger1.MaxBackupIndex=100 
    log4j.appender.Logger1.layout=org.apache.log4j.PatternLayout 
    log4j.appender.Logger1.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss:SSS} %-5p [%t] %m (%c{3}%x)%n 
    log4j.additivity.Logger1 =false log4j.appender.Logger2 =org.apache.log4j.RollingFileAppender 
    log4j.appender.Logger2.File=/Log/Logger2.log 
    log4j.appender.Logger2.MaxFileSize=20MB 
    log4j.appender.Logger2.MaxBackupIndex=100 
    log4j.appender.Logger2.layout=org.apache.log4j.PatternLayout 
    log4j.appender.Logger2.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss:SSS} %-5p [%t] %m (%c{3}%x)%n 
    log4j.additivity.Logger2=false 能给出一个具体例子吗?分都给你啊!谢谢你啊