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; }