Java 类org.apache.log4j.pattern.LogEvent 实例源码

项目:daq-eclipse    文件:MDCKeySetExtractor.java   
public Set getPropertyKeySet(final LoggingEvent event) throws Exception {
    //
    //  MDC keys are not visible prior to log4j 1.2.15
    //
    Set keySet = null;
    if (getKeySetMethod != null) {
          keySet = (Set) getKeySetMethod.invoke(event, null);
    } else {
        //
        //  for 1.2.14 and earlier could serialize and
        //    extract MDC content
          ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
          ObjectOutputStream os = new ObjectOutputStream(outBytes);
          os.writeObject(event);
          os.close();

          byte[] raw = outBytes.toByteArray();
          //
          //   bytes 6 and 7 should be the length of the original classname
          //     should be the same as our substitute class name
          final String subClassName = LogEvent.class.getName();
          if (raw[6] == 0 || raw[7] == subClassName.length()) {
              //
              //  manipulate stream to use our class name
              //
              for (int i = 0; i < subClassName.length(); i++) {
                  raw[8 + i] = (byte) subClassName.charAt(i);
              }
              ByteArrayInputStream inBytes = new ByteArrayInputStream(raw);
              ObjectInputStream is = new ObjectInputStream(inBytes);
              Object cracked = is.readObject();
              if (cracked instanceof LogEvent) {
                  keySet = ((LogEvent) cracked).getPropertyKeySet();
              }
              is.close();
          }
    }
    return keySet;        
}