1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.neo4j.server.logging;
21
22 import java.io.StringWriter;
23 import java.lang.reflect.Field;
24
25 import org.apache.log4j.Layout;
26 import org.apache.log4j.Level;
27 import org.apache.log4j.SimpleLayout;
28 import org.apache.log4j.WriterAppender;
29
30 public class InMemoryAppender {
31 private StringWriter stringWriter = new StringWriter();
32 private WriterAppender appender = new WriterAppender(new SimpleLayout(), stringWriter);
33 private final org.apache.log4j.Logger log4jLogger;
34 private final Level level;
35 private Layout layout;
36
37 public InMemoryAppender(Logger logger) {
38 this(logger, new SimpleLayout());
39 }
40
41 public InMemoryAppender(Logger logger, Layout layout) {
42 this(logger, Level.ALL, layout);
43 }
44
45 private InMemoryAppender(Logger logger, Level level, Layout layout) {
46 this.level = level;
47 this.layout = layout;
48 log4jLogger = org.apache.log4j.Logger.getLogger(this.getClass());
49 changeLogger(logger, log4jLogger);
50 reset();
51
52 }
53
54 private void changeLogger(Logger logger, org.apache.log4j.Logger log4jLogger) {
55 Field loggerField = findLoggerField(logger);
56 try {
57 loggerField.setAccessible(true);
58 loggerField.set(logger, log4jLogger);
59 } catch (Exception e) {
60 throw new RuntimeException(e);
61 }
62 }
63
64 private Field findLoggerField(Logger logger) {
65 try {
66 return logger.getClass().getDeclaredField("logger");
67 } catch (Exception e) {
68 throw new RuntimeException("The field [logger] must be present for testing", e);
69 }
70 }
71
72 public void removeAppender() {
73 org.apache.log4j.Logger log4jLogger = org.apache.log4j.Logger.getLogger(this.getClass());
74 log4jLogger.removeAppender(appender);
75 }
76
77 public String toString() {
78 return stringWriter.toString();
79 }
80
81 public void reset() {
82 stringWriter = new StringWriter();
83 appender = new WriterAppender(layout, stringWriter);
84 log4jLogger.addAppender(appender);
85 log4jLogger.setLevel(level);
86 }
87 }