1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.layout;
18
19 import java.io.ByteArrayOutputStream;
20 import java.io.IOException;
21 import java.io.ObjectOutputStream;
22 import java.io.OutputStream;
23
24 import org.apache.logging.log4j.core.Layout;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.config.Node;
27 import org.apache.logging.log4j.core.config.plugins.Plugin;
28 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
29
30
31
32
33 @Plugin(name = "SerializedLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
34 public final class SerializedLayout extends AbstractLayout<LogEvent> {
35
36 private static final long serialVersionUID = 1L;
37
38 private static byte[] serializedHeader;
39
40 static {
41 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
42 try {
43 new ObjectOutputStream(baos).close();
44 serializedHeader = baos.toByteArray();
45 } catch (final Exception ex) {
46 LOGGER.error("Unable to generate Object stream header", ex);
47 }
48 }
49
50 private SerializedLayout() {
51 super(null, null);
52 }
53
54
55
56
57
58
59
60 @Override
61 public byte[] toByteArray(final LogEvent event) {
62 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
63 try (final ObjectOutputStream oos = new PrivateObjectOutputStream(baos)) {
64 oos.writeObject(event);
65 oos.reset();
66 } catch (final IOException ioe) {
67 LOGGER.error("Serialization of LogEvent failed.", ioe);
68 }
69 return baos.toByteArray();
70 }
71
72
73
74
75
76
77
78 @Override
79 public LogEvent toSerializable(final LogEvent event) {
80 return event;
81 }
82
83
84
85
86
87 @PluginFactory
88 public static SerializedLayout createLayout() {
89 return new SerializedLayout();
90 }
91
92 @Override
93 public byte[] getHeader() {
94 return serializedHeader;
95 }
96
97
98
99
100
101 @Override
102 public String getContentType() {
103 return "application/octet-stream";
104 }
105
106
107
108
109 private class PrivateObjectOutputStream extends ObjectOutputStream {
110
111 public PrivateObjectOutputStream(final OutputStream os) throws IOException {
112 super(os);
113 }
114
115 @Override
116 protected void writeStreamHeader() {
117 }
118 }
119 }