use of org.graylog2.log4j.MemoryAppender in project graylog2-server by Graylog2.
the class LoggersResource method messages.
@GET
@Timed
@ApiOperation(value = "Get recent internal log messages")
@ApiResponses(value = { @ApiResponse(code = 404, message = "Memory appender is disabled."), @ApiResponse(code = 500, message = "Memory appender is broken.") })
@Path("/messages/recent")
@Produces(MediaType.APPLICATION_JSON)
public LogMessagesSummary messages(@ApiParam(name = "limit", value = "How many log messages should be returned", defaultValue = "500", allowableValues = "range[0, infinity]") @QueryParam("limit") @DefaultValue("500") @Min(0L) int limit, @ApiParam(name = "level", value = "Which log level (or higher) should the messages have", defaultValue = "ALL", allowableValues = "[OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE, ALL]") @QueryParam("level") @DefaultValue("ALL") @NotEmpty String level) {
final Appender appender = getAppender(MEMORY_APPENDER_NAME);
if (appender == null) {
throw new NotFoundException("Memory appender is disabled. Please refer to the example log4j.xml file.");
}
if (!(appender instanceof MemoryAppender)) {
throw new InternalServerErrorException("Memory appender is not an instance of MemoryAppender. Please refer to the example log4j.xml file.");
}
final Level logLevel = Level.toLevel(level, Level.ALL);
final MemoryAppender memoryAppender = (MemoryAppender) appender;
final List<InternalLogMessage> messages = new ArrayList<>(limit);
for (LogEvent event : memoryAppender.getLogMessages(limit)) {
final Level eventLevel = event.getLevel();
if (!eventLevel.isMoreSpecificThan(logLevel)) {
continue;
}
final ThrowableProxy thrownProxy = event.getThrownProxy();
final String throwable;
if (thrownProxy == null) {
throwable = null;
} else {
throwable = thrownProxy.getExtendedStackTraceAsString();
}
final Marker marker = event.getMarker();
messages.add(InternalLogMessage.create(event.getMessage().getFormattedMessage(), event.getLoggerName(), eventLevel.toString(), marker == null ? null : marker.toString(), new DateTime(event.getTimeMillis(), DateTimeZone.UTC), throwable, event.getThreadName(), event.getContextData().toMap()));
}
return LogMessagesSummary.create(messages);
}
use of org.graylog2.log4j.MemoryAppender in project graylog2-server by Graylog2.
the class MemoryAppenderTest method appenderIsThreadSafe.
@Test
public void appenderIsThreadSafe() throws Exception {
final int bufferSize = 1;
final MemoryAppender appender = MemoryAppender.createAppender(null, null, "memory", String.valueOf(bufferSize), "false");
assertThat(appender).isNotNull();
final LogEvent logEvent = Log4jLogEvent.newBuilder().setLevel(Level.INFO).setLoggerName("test").setLoggerFqcn("com.example.test").setMessage(new SimpleMessage("Message")).build();
final int threadCount = 48;
final Thread[] threads = new Thread[threadCount];
final TestAwareThreadGroup threadGroup = new TestAwareThreadGroup("memory-appender-test");
final CountDownLatch latch = new CountDownLatch(1);
for (int i = 0; i < threadCount; i++) {
final Runnable runner = () -> {
try {
latch.await();
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < TimeUnit.SECONDS.toMillis(4L)) {
appender.append(logEvent);
}
} catch (InterruptedException ie) {
// Do nothing
}
};
final Thread thread = new Thread(threadGroup, runner, "TestThread-" + i);
threads[i] = thread;
thread.start();
}
latch.countDown();
for (int i = 0; i < threadCount; i++) {
threads[i].join(TimeUnit.SECONDS.toMillis(5L));
}
assertThat(threadGroup.getExceptionsInThreads().get()).isEqualTo(0);
}
use of org.graylog2.log4j.MemoryAppender in project graylog2-server by Graylog2.
the class MemoryAppenderTest method appenderCanConsumeMoreMessagesThanBufferSize.
@Test
public void appenderCanConsumeMoreMessagesThanBufferSize() {
final int bufferSize = 10;
final MemoryAppender appender = MemoryAppender.createAppender(null, null, "memory", String.valueOf(bufferSize), "false");
assertThat(appender).isNotNull();
for (int i = 1; i <= bufferSize + 1; i++) {
final LogEvent logEvent = Log4jLogEvent.newBuilder().setLevel(Level.INFO).setLoggerName("test").setLoggerFqcn("com.example.test").setMessage(new SimpleMessage("Message " + i)).build();
appender.append(logEvent);
}
final List<LogEvent> messages = appender.getLogMessages(bufferSize);
for (int i = 0; i < messages.size(); i++) {
assertThat(messages.get(i).getMessage().getFormattedMessage()).isEqualTo("Message " + (bufferSize - i + 1));
}
}
use of org.graylog2.log4j.MemoryAppender in project graylog2-server by Graylog2.
the class MemoryAppenderTest method testGetLogMessages.
@Test
public void testGetLogMessages() {
final int bufferSize = 10;
final MemoryAppender appender = MemoryAppender.createAppender(null, null, "memory", String.valueOf(bufferSize), "false");
assertThat(appender).isNotNull();
for (int i = 1; i <= bufferSize; i++) {
final LogEvent logEvent = Log4jLogEvent.newBuilder().setLevel(Level.INFO).setLoggerName("test").setLoggerFqcn("com.example.test").setMessage(new SimpleMessage("Message " + i)).build();
appender.append(logEvent);
}
assertThat(appender.getLogMessages(bufferSize * 2)).hasSize(bufferSize);
assertThat(appender.getLogMessages(bufferSize)).hasSize(bufferSize);
assertThat(appender.getLogMessages(bufferSize / 2)).hasSize(bufferSize / 2);
assertThat(appender.getLogMessages(0)).isEmpty();
final List<LogEvent> messages = appender.getLogMessages(5);
for (int i = 0; i < messages.size(); i++) {
assertThat(messages.get(i).getMessage().getFormattedMessage()).isEqualTo("Message " + (bufferSize - i));
}
}
Aggregations