系统使用的是log4j,在log文档里,记录了进入的action和sql,可是具体是哪个用户的操作痕迹,无法得知,现在正在调查一个不能再现的逻辑bug,所以需要清晰的跟踪用户的操作,我现在想在每个log里,加入用户id,可是,并不是那个方法里都能得到session,我该怎么做呢,谢谢大家

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【moodoasis】截止到2008-07-11 15:33:29的历史汇总数据(不包括此帖):
    发帖的总数量:39                       发帖的总分数:1642                     每贴平均分数:42                       
    回帖的总数量:274                      得分贴总数量:98                       回帖的得分率:35%                      
    结贴的总数量:39                       结贴的总分数:1642                     
    无满意结贴数:8                        无满意结贴分:260                      
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:20.51 %               无满意结分率:15.83 %                  
    敬礼!
      

  2.   

    不是很明白LZ的意思,描述详细点,如果需要,可以发邮件给我[email protected]
      

  3.   

    在你的servlet中得到id然后打印出来,并做标记为begin,然后调用你的数据访问曾的代码,并在数据访问层打印其他信息(如sql语句),等从数据访问层返回后在打印id并做标记为end,这样在idbegin和idend之间的就是这个用户这次的完整访问信息。
    但是这样也有问题,就是多用户访问的时候会产生多个用户日志信息交叉的情况
      

  4.   

    当然你也可以将session传递到你的业务层、数据访问层,但是不建议这样做,这样会增加你程序代码的耦合度
      

  5.   

    有一个办法,楼主,你打印的日志配置文件,配置的时候要求打印出线程号,能打印出用户ID的时候就打印用户ID,这个时候你可以对照用户ID的线程号直接搜索和他相同的线程号就OK了。呵呵。比较简单。
      

  6.   

    5楼,log4j,已经制动打出线程号了,可是,它是变的阿,我也不知道为啥它变
      

  7.   

    你可以在servlet中打印除idbeging,并在此时将当前的线程号或者当前时间传递给业务层和数据访问层,这样就能够区分了
      

  8.   

    在业务层和数据访问层每次的日志输出都将servlet传递过来的线程号或时间放到前面
      

  9.   

    怎么去呢,能不能具体点,您的意识是,加参数吗,不是吧,我看log4j能打出来线程号,可是,它变啊,不是因为用户多变,我自己跑,它也变
      

  10.   

    log4j的配置里面就有选择是否打印线程号的东西啊,就是输出格式的时候,添加一个线程号的输出就可以了啊。线程肯定是在变的,但是跟踪一个用户session啊,在一次调用中一般是不会变的,所以这个有助于调试。
      

  11.   

    取得当前的线程名:Thread.currentThread().getName()
    将这个得到的线程名作为参数传递到业务层和数据访问层log4j自身打印的线程号是不行的,根本不是一个线程,线程号或者线程名当然不一样
      

  12.   

    其实你根本不需要在业务层和数据访问层做日志记录。因为你的程序暴露给用户的就是servlet,只要在servlet中做好日志记录就可以了,每个servlet的每个方法都是一个原子组的操作,比如,用户访问了一个login的servlet,那么你就完全可以断定用户执行了登陆操作,至于登陆操作需要哪些业务和数据库访问,通过程序逻辑就可以知道了。所以只要在servlet中做好日志记录(什么时间开始、什么时间结束、是否正常结束、发生了什么样的异常情况)就可以了
      

  13.   

    可能是各位没有理解我的意思。我的意思是直接修改log4j的配置文件就可以了,原来出现log4j的打印信息的地方都会打印出线程号来。
    #文件输出:RollingFileAppender
    #log4j.rootLogger = INFO,logfile
    log4j.appender.logfile = org.apache.log4j.RollingFileAppender
    log4j.appender.logfile.Threshold = INFO   
    # 输出以上的INFO信息 
    log4j.appender.logfile.File = INFO_log.html     
    #保存log文件路径 
    log4j.appender.logfile.Append = true    
    # 默认为true,添加到末尾,false在每次启动时进行覆盖 
    log4j.appender.logfile.MaxFileSize = 1MB 
    # 一个log文件的大小,超过这个大小就又会生成1个日志 # KB ,MB,GB 
    log4j.appender.logfile.MaxBackupIndex = 3   
    # 最多保存3个文件备份 
    log4j.appender.logfile.layout = org.apache.log4j.HTMLLayout 
    # 输出文件的格式 
    log4j.appender.logfile.layout.LocationInfo = true 
    #是否显示类名和行数
    log4j.appender.logfile.layout.Title =title:\u63d0\u9192\u60a8\uff1a\u7cfb\u7edf\u53d1\u751f\u4e86\u4e25\u91cd\u9519\u8bef 
    #html页面的 < title > 
    ############################## SampleLayout ####################################
    # log4j.appender.logfile.layout = org.apache.log4j.SampleLayout
    ############################## PatternLayout ###################################
    # log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
    # log4j.appender.logfile.layout.ConversionPattern =% d % p [ % c] -   % m % n % d
    ############################## XMLLayout #######################################
    # log4j.appender.logfile.layout = org.apache.log4j.XMLLayout
    # log4j.appender.logfile.layout.LocationInfo = true #是否显示类名和行数
    ############################## TTCCLayout ######################################
    # log4j.appender.logfile.layout = org.apache.log4j.TTCCLayout
    # log4j.appender.logfile.layout.DateFormat = ISO8601
    #NULL, RELATIVE, ABSOLUTE, DATE or ISO8601.
    # log4j.appender.logfile.layout.TimeZoneID = GMT - 8 : 00 
    # log4j.appender.logfile.layout.CategoryPrefixing = false ##默认为true 打印类别名
    # log4j.appender.logfile.layout.ContextPrinting = false ##默认为true 打印上下文信息
    # log4j.appender.logfile.layout.ThreadPrinting = false ##默认为true 打印线程名
    # 打印信息如下:
    #2007 - 09 - 13   14 : 45 : 39 , 765 [http - 8080 - 1 ] ERROR com.poxool.test.test - error成功关闭链接
      

  14.   

    imAさん、让我加个参数,是不是,有点过了,我现在想,是不是可以把userid,或是sessionid保存一个什么里面呢,可是,,行不通,大家取得都一样了
      

  15.   

    王子,我这好像和你那不一样啊,你看看
    INFO 2008-07-11 17:24:29,531 [Thread-3] INFO  (RecognitionAction.java:62) - common.actions.RecognitionAction  openRecog
    INFO 2008-07-11 17:24:29,578 [Thread-3] INFO  (Recognition.java:45) - Start:common.Recognition
    DEBUG 2008-07-11 17:24:29,671 [Thread-3] DEBUG (Recognition.java:66) - SELECT RECOGNITION_METHOD FROM REQUEST_CLASS 
      

  16.   

    你可以把userId取出来,然后保存到本地线程ThreadLocal中
      

  17.   

    真的,我还第一次用ThreadLocal呢,我这就学学实试试,这个活弄疯我了,我还是第一次遇到不能再现的bug,4年一共出现3回,大家周末愉快,我还得加会班,我都调,俩星期了,555555
      

  18.   

    最后决定,在业务层不打印用户ID,, 
    但是要在servlet里打印FORM里面的所有字段值,以跟踪用户入力结