1 2 3 4 5 6 7 8 9 10 11 12 13 14 package ch.qos.logback.classic.spi; 15 16 import java.io.IOException; 17 import java.io.InvalidObjectException; 18 import java.io.ObjectInputStream; 19 import java.io.ObjectOutputStream; 20 import java.io.Serializable; 21 import java.time.Instant; 22 import java.util.List; 23 import java.util.Map; 24 25 import org.slf4j.Marker; 26 import org.slf4j.event.KeyValuePair; 27 import org.slf4j.helpers.MessageFormatter; 28 29 import ch.qos.logback.classic.Level; 30 31 32 33 34 35 36 37 38 39 40 public class LoggingEventVO implements ILoggingEvent, Serializable { 41 42 private static final long serialVersionUID = 6553722650255690312L; 43 44 private static final int NULL_ARGUMENT_ARRAY = -1; 45 private static final String NULL_ARGUMENT_ARRAY_ELEMENT = "NULL_ARGUMENT_ARRAY_ELEMENT"; 46 private static final int ARGUMENT_ARRAY_DESERIALIZATION_LIMIT = 128; 47 48 private String threadName; 49 private String loggerName; 50 private LoggerContextVO loggerContextVO; 51 52 private transient Level level; 53 private String message; 54 55 56 57 58 private transient String formattedMessage; 59 60 private transient Object[] argumentArray; 61 62 private ThrowableProxyVO throwableProxy; 63 private StackTraceElement[] callerDataArray; 64 private List<Marker> markerList; 65 private List<KeyValuePair> keyValuePairList; 66 private Map<String, String> mdcPropertyMap; 67 68 private long timestamp; 69 private int nanoseconds; 70 71 private long sequenceNumber; 72 73 public static LoggingEventVO build(ILoggingEvent le) { 74 LoggingEventVO ledo = new LoggingEventVO(); 75 ledo.loggerName = le.getLoggerName(); 76 ledo.loggerContextVO = le.getLoggerContextVO(); 77 ledo.threadName = le.getThreadName(); 78 ledo.level = (le.getLevel()); 79 ledo.message = (le.getMessage()); 80 ledo.argumentArray = (le.getArgumentArray()); 81 ledo.markerList = le.getMarkerList(); 82 ledo.keyValuePairList = le.getKeyValuePairs(); 83 ledo.mdcPropertyMap = le.getMDCPropertyMap(); 84 ledo.timestamp = le.getTimeStamp(); 85 ledo.nanoseconds = le.getNanoseconds(); 86 ledo.sequenceNumber = le.getSequenceNumber(); 87 ledo.throwableProxy = ThrowableProxyVO.build(le.getThrowableProxy()); 88 89 90 if (le.hasCallerData()) { 91 ledo.callerDataArray = le.getCallerData(); 92 } 93 return ledo; 94 } 95 96 public String getThreadName() { 97 return threadName; 98 } 99 100 public LoggerContextVO getLoggerContextVO() { 101 return loggerContextVO; 102 } 103 104 public String getLoggerName() { 105 return loggerName; 106 } 107 108 public Level getLevel() { 109 return level; 110 } 111 112 public String getMessage() { 113 return message; 114 } 115 116 public String getFormattedMessage() { 117 if (formattedMessage != null) { 118 return formattedMessage; 119 } 120 121 if (argumentArray != null) { 122 formattedMessage = MessageFormatter.arrayFormat(message, argumentArray).getMessage(); 123 } else { 124 formattedMessage = message; 125 } 126 127 return formattedMessage; 128 } 129 130 public Object[] getArgumentArray() { 131 return argumentArray; 132 } 133 134 public IThrowableProxy getThrowableProxy() { 135 return throwableProxy; 136 } 137 138 public StackTraceElement[] getCallerData() { 139 return callerDataArray; 140 } 141 142 public boolean hasCallerData() { 143 return callerDataArray != null; 144 } 145 146 public List<Marker> getMarkerList() { 147 return markerList; 148 } 149 150 @Override 151 public long getTimeStamp() { return timestamp; } 152 153 @Override 154 public int getNanoseconds() { return nanoseconds; } 155 156 public long getSequenceNumber() { 157 return sequenceNumber; 158 } 159 160 public long getContextBirthTime() { 161 return loggerContextVO.getBirthTime(); 162 } 163 164 public LoggerContextVO getContextLoggerRemoteView() { 165 return loggerContextVO; 166 } 167 168 public Map<String, String> getMDCPropertyMap() { 169 return mdcPropertyMap; 170 } 171 172 public Map<String, String> getMdc() { 173 return mdcPropertyMap; 174 } 175 176 @Override 177 public List<KeyValuePair> getKeyValuePairs() { 178 return this.keyValuePairList; 179 } 180 181 public void prepareForDeferredProcessing() { 182 } 183 184 private void writeObject(ObjectOutputStream out) throws IOException { 185 out.defaultWriteObject(); 186 out.writeInt(level.levelInt); 187 if (argumentArray != null) { 188 int len = argumentArray.length; 189 out.writeInt(len); 190 for (int i = 0; i < argumentArray.length; i++) { 191 if (argumentArray[i] != null) { 192 out.writeObject(argumentArray[i].toString()); 193 } else { 194 out.writeObject(NULL_ARGUMENT_ARRAY_ELEMENT); 195 } 196 } 197 } else { 198 out.writeInt(NULL_ARGUMENT_ARRAY); 199 } 200 201 } 202 203 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 204 in.defaultReadObject(); 205 int levelInt = in.readInt(); 206 level = Level.toLevel(levelInt); 207 208 int argArrayLen = in.readInt(); 209 210 211 if (argArrayLen < NULL_ARGUMENT_ARRAY || argArrayLen > ARGUMENT_ARRAY_DESERIALIZATION_LIMIT) { 212 throw new InvalidObjectException("Argument array length is invalid: " + argArrayLen); 213 } 214 215 if (argArrayLen != NULL_ARGUMENT_ARRAY) { 216 argumentArray = new String[argArrayLen]; 217 for (int i = 0; i < argArrayLen; i++) { 218 Object val = in.readObject(); 219 if (!NULL_ARGUMENT_ARRAY_ELEMENT.equals(val)) { 220 argumentArray[i] = val; 221 } 222 } 223 } 224 } 225 226 @Override 227 public int hashCode() { 228 final int prime = 31; 229 long millis = getTimeStamp(); 230 231 int result = 1; 232 result = prime * result + ((message == null) ? 0 : message.hashCode()); 233 result = prime * result + ((threadName == null) ? 0 : threadName.hashCode()); 234 result = prime * result + (int) (millis ^ (millis >>> 32)); 235 return result; 236 } 237 238 @Override 239 public boolean equals(Object obj) { 240 if (this == obj) 241 return true; 242 if (obj == null) 243 return false; 244 if (getClass() != obj.getClass()) 245 return false; 246 final LoggingEventVO other = (LoggingEventVO) obj; 247 if (message == null) { 248 if (other.message != null) 249 return false; 250 } else if (!message.equals(other.message)) 251 return false; 252 253 if (loggerName == null) { 254 if (other.loggerName != null) 255 return false; 256 } else if (!loggerName.equals(other.loggerName)) 257 return false; 258 259 if (threadName == null) { 260 if (other.threadName != null) 261 return false; 262 } else if (!threadName.equals(other.threadName)) 263 return false; 264 if (getTimeStamp() != other.getTimeStamp()) 265 return false; 266 267 if (markerList == null) { 268 if (other.markerList != null) 269 return false; 270 } else if (!markerList.equals(other.markerList)) 271 return false; 272 273 if (mdcPropertyMap == null) { 274 if (other.mdcPropertyMap != null) 275 return false; 276 } else if (!mdcPropertyMap.equals(other.mdcPropertyMap)) 277 return false; 278 return true; 279 } 280 281 }