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