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.util.HashMap;
20 import java.util.Map;
21 import org.apache.logging.log4j.core.LogEvent;
22 import org.apache.logging.log4j.core.config.plugins.Plugin;
23 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
24
25 import java.io.ByteArrayOutputStream;
26 import java.io.IOException;
27 import java.io.ObjectOutputStream;
28 import java.io.OutputStream;
29
30
31
32
33 @Plugin(name = "SerializedLayout", type = "Core", elementType = "layout", printObject = true)
34 public final class SerializedLayout extends AbstractLayout<LogEvent> {
35
36 private static byte[] header;
37
38 static {
39 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
40 try {
41 final ObjectOutputStream oos = new ObjectOutputStream(baos);
42 oos.close();
43 header = baos.toByteArray();
44 } catch (final Exception ex) {
45 LOGGER.error("Unable to generate Object stream header", ex);
46 }
47 }
48
49 private SerializedLayout() {
50 }
51
52
53
54
55
56
57
58 public byte[] toByteArray(final LogEvent event) {
59 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
60 try {
61 final ObjectOutputStream oos = new PrivateObjectOutputStream(baos);
62 try {
63 oos.writeObject(event);
64 oos.reset();
65 } finally {
66 oos.close();
67 }
68 } catch (final IOException ioe) {
69 LOGGER.error("Serialization of LogEvent failed.", ioe);
70 }
71 return baos.toByteArray();
72 }
73
74
75
76
77
78
79
80 public LogEvent toSerializable(final LogEvent event) {
81 return event;
82 }
83
84
85
86
87
88 @PluginFactory
89 public static SerializedLayout createLayout() {
90
91 return new SerializedLayout();
92 }
93
94 @Override
95 public byte[] getHeader() {
96 return header;
97 }
98
99
100
101
102
103 public Map<String, String> getContentFormat() {
104 return new HashMap<String, String>();
105 }
106
107
108
109
110
111 public String getContentType() {
112 return "application/octet-stream";
113 }
114
115
116
117
118 private class PrivateObjectOutputStream extends ObjectOutputStream {
119
120 public PrivateObjectOutputStream(final OutputStream os) throws IOException {
121 super(os);
122 }
123
124 @Override
125 protected void writeStreamHeader() {
126 }
127 }
128 }