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 byte[] serializedHeader;
37
38 static {
39 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
40 try {
41 new ObjectOutputStream(baos).close();
42 serializedHeader = baos.toByteArray();
43 } catch (final Exception ex) {
44 LOGGER.error("Unable to generate Object stream header", ex);
45 }
46 }
47
48 private SerializedLayout() {
49 super(null, null, null);
50 }
51
52
53
54
55
56
57
58 @Override
59 public byte[] toByteArray(final LogEvent event) {
60 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
61 try (final ObjectOutputStream oos = new PrivateObjectOutputStream(baos)) {
62 oos.writeObject(event);
63 oos.reset();
64 } catch (final IOException ioe) {
65 LOGGER.error("Serialization of LogEvent failed.", ioe);
66 }
67 return baos.toByteArray();
68 }
69
70
71
72
73
74
75
76 @Override
77 public LogEvent toSerializable(final LogEvent event) {
78 return event;
79 }
80
81
82
83
84
85 @PluginFactory
86 public static SerializedLayout createLayout() {
87 return new SerializedLayout();
88 }
89
90 @Override
91 public byte[] getHeader() {
92 return serializedHeader;
93 }
94
95
96
97
98
99 @Override
100 public String getContentType() {
101 return "application/octet-stream";
102 }
103
104
105
106
107 private class PrivateObjectOutputStream extends ObjectOutputStream {
108
109 public PrivateObjectOutputStream(final OutputStream os) throws IOException {
110 super(os);
111 }
112
113 @Override
114 protected void writeStreamHeader() {
115 }
116 }
117 }