Skip to content

Commit

Permalink
add SequenceNumberGenerator support in logback-*
Browse files Browse the repository at this point in the history
  • Loading branch information
ceki committed Feb 11, 2018
1 parent e339841 commit b633038
Show file tree
Hide file tree
Showing 17 changed files with 195 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ public RequestLogImpl() {
@Override
public void log(Request jettyRequest, Response jettyResponse) {
JettyServerAdapter adapter = new JettyServerAdapter(jettyRequest, jettyResponse);
IAccessEvent accessEvent = new AccessEvent(jettyRequest, jettyResponse, adapter);
IAccessEvent accessEvent = new AccessEvent(this, jettyRequest, jettyResponse, adapter);
if (getFilterChainDecision(accessEvent) == FilterReply.DENY) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import ch.qos.logback.access.AccessConstants;
import ch.qos.logback.access.pattern.AccessConverter;
import ch.qos.logback.access.servlet.Util;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.spi.SequenceNumberGenerator;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
Expand Down Expand Up @@ -85,10 +87,17 @@ public class AccessEvent implements Serializable, IAccessEvent {
*/
private long timeStamp = 0;

public AccessEvent(HttpServletRequest httpRequest, HttpServletResponse httpResponse, ServerAdapter adapter) {
private long sequenceNumber = 0;

public AccessEvent(Context context, HttpServletRequest httpRequest, HttpServletResponse httpResponse, ServerAdapter adapter) {
this.httpRequest = httpRequest;
this.httpResponse = httpResponse;
this.timeStamp = System.currentTimeMillis();

SequenceNumberGenerator sng = context.getSequenceNumberGenerator();
if (sng != null) {
this.sequenceNumber = sng.nextSequenceNumber();
}
this.serverAdapter = adapter;
this.elapsedTime = calculateElapsedTime();
}
Expand Down Expand Up @@ -128,6 +137,14 @@ public void setTimeStamp(long timeStamp) {
}
}

public long getSequenceNumber() {
return sequenceNumber;
}

public void setSequenceNumber(long sequenceNumber) {
this.sequenceNumber = sequenceNumber;
}

/**
* @param threadName The threadName to set.
*/
Expand Down Expand Up @@ -374,10 +391,10 @@ private void copyAttributeMap() {
}

// attributeMap has been copied already. See also LOGBACK-1189
if(attributeMap != null) {
if (attributeMap != null) {
return;
}

attributeMap = new HashMap<String, Object>();

Enumeration<String> names = httpRequest.getAttributeNames();
Expand Down Expand Up @@ -408,14 +425,14 @@ private boolean shouldCopyAttribute(String name, Object value) {
@Override
public String[] getRequestParameter(String key) {
String[] value = null;
if(requestParameterMap != null) {

if (requestParameterMap != null) {
value = requestParameterMap.get(key);
} else if (httpRequest != null) {
value = httpRequest.getParameterValues(key);
value = httpRequest.getParameterValues(key);
}

return (value != null) ? value: NA_STRING_ARRAY;
return (value != null) ? value : NA_STRING_ARRAY;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ public interface IAccessEvent extends DeferredProcessingAware {
*/
long getTimeStamp();

/**
* The sequence number associated with this event.
*
* <p>Sequence numbers, if present, should be increasing monotonically.
*
* @since 1.3.0
*/

long getSequenceNumber();

/**
* The time elapsed between receiving the request and logging it in milliseconds.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import ch.qos.logback.core.spi.FilterReply;
import ch.qos.logback.core.spi.LifeCycle;
import ch.qos.logback.core.spi.LogbackLock;
import ch.qos.logback.core.spi.SequenceNumberGenerator;
import ch.qos.logback.core.status.ErrorStatus;
import ch.qos.logback.core.status.InfoStatus;
import ch.qos.logback.core.status.OnConsoleStatusListener;
Expand Down Expand Up @@ -90,6 +91,8 @@ public class LogbackValve extends ValveBase implements Lifecycle, Context, Appen
private final LifeCycleManager lifeCycleManager = new LifeCycleManager();

private long birthTime = System.currentTimeMillis();


LogbackLock configurationLock = new LogbackLock();

// Attributes from ContextBase:
Expand All @@ -107,6 +110,8 @@ public class LogbackValve extends ValveBase implements Lifecycle, Context, Appen
boolean quiet;
boolean started;
boolean alreadySetLogbackStatusManager = false;
private SequenceNumberGenerator sequenceNumberGenerator;


private ScheduledExecutorService scheduledExecutorService;

Expand Down Expand Up @@ -256,7 +261,7 @@ public void invoke(Request request, Response response) throws IOException, Servl
getNext().invoke(request, response);

TomcatServerAdapter adapter = new TomcatServerAdapter(request, response);
IAccessEvent accessEvent = new AccessEvent(request, response, adapter);
IAccessEvent accessEvent = new AccessEvent(this, request, response, adapter);

addThreadName(accessEvent);

Expand Down Expand Up @@ -455,4 +460,12 @@ public ScheduledExecutorService getScheduledExecutorService() {
public void addScheduledFuture(ScheduledFuture<?> scheduledFuture) {
throw new UnsupportedOperationException();
}

public SequenceNumberGenerator getSequenceNumberGenerator() {
return sequenceNumberGenerator;
}

public void setSequenceNumberGenerator(SequenceNumberGenerator sequenceNumberGenerator) {
this.sequenceNumberGenerator = sequenceNumberGenerator;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,34 +13,35 @@
*/
package ch.qos.logback.access.boolex;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import org.junit.Before;
import org.junit.Test;

import ch.qos.logback.access.dummy.DummyRequest;
import ch.qos.logback.access.dummy.DummyResponse;
import ch.qos.logback.access.dummy.DummyServerAdapter;
import ch.qos.logback.access.spi.AccessContext;
import ch.qos.logback.access.spi.AccessEvent;
import ch.qos.logback.access.spi.IAccessEvent;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.boolex.EvaluationException;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

public class JaninoEventEvaluatorTest {

final String expectedURL1 = "testUrl1";
final String expectedURL2 = "testUrl2";
Context context = new ContextBase();
//Context context = new ContextBase();
JaninoEventEvaluator evaluator;
DummyRequest request;
DummyResponse response;
DummyServerAdapter serverAdapter;

AccessContext accessContext = new AccessContext();

@Before
public void setUp() throws Exception {
evaluator = new JaninoEventEvaluator();
evaluator.setContext(context);
evaluator.setContext(accessContext);
request = new DummyRequest();
response = new DummyResponse();
serverAdapter = new DummyServerAdapter(request, response);
Expand All @@ -50,23 +51,23 @@ public void setUp() throws Exception {
public void smoke() throws EvaluationException {
evaluator.setExpression("event.getProtocol().equals(\"testProtocol\")");
evaluator.start();
IAccessEvent ae = new AccessEvent(request, response, serverAdapter);
IAccessEvent ae = new AccessEvent(accessContext, request, response, serverAdapter);
assertTrue(evaluator.evaluate(ae));
}

@Test
public void block() throws EvaluationException {
evaluator.setExpression("String protocol = event.getProtocol();" + "return protocol.equals(\"testProtocol\");");
evaluator.start();
IAccessEvent ae = new AccessEvent(request, response, serverAdapter);
IAccessEvent ae = new AccessEvent(accessContext, request, response, serverAdapter);
assertTrue(evaluator.evaluate(ae));
}

@Test
public void invalidExpression() throws EvaluationException {
evaluator.setExpression("return true");
evaluator.start();
IAccessEvent ae = new AccessEvent(request, response, serverAdapter);
IAccessEvent ae = new AccessEvent(accessContext, request, response, serverAdapter);
try {
evaluator.evaluate(ae);
fail("Was expecting an exception");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,6 @@ private IAccessEvent createAccessEvent(String uri) {
DummyResponse response = new DummyResponse();
DummyServerAdapter adapter = new DummyServerAdapter(request, response);

return new AccessEvent(request, response, adapter);
return new AccessEvent(context, request, response, adapter);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
*/
package ch.qos.logback.access.dummy;

import ch.qos.logback.access.spi.AccessContext;
import ch.qos.logback.access.spi.AccessEvent;
import ch.qos.logback.access.spi.IAccessEvent;

Expand All @@ -22,8 +23,9 @@ static public IAccessEvent buildNewAccessEvent() {
DummyRequest request = new DummyRequest();
DummyResponse response = new DummyResponse();
DummyServerAdapter adapter = new DummyServerAdapter(request, response);

return new AccessEvent(request, response, adapter);
AccessContext accessContext = new AccessContext();

return new AccessEvent(accessContext, request, response, adapter);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,26 +13,26 @@
*/
package ch.qos.logback.access.net;

import static org.junit.Assert.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import ch.qos.logback.access.spi.IAccessEvent;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import ch.qos.logback.access.dummy.DummyRequest;
import ch.qos.logback.access.dummy.DummyResponse;
import ch.qos.logback.access.dummy.DummyServerAdapter;
import ch.qos.logback.access.spi.AccessContext;
import ch.qos.logback.access.spi.AccessEvent;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.access.spi.IAccessEvent;
import ch.qos.logback.core.boolex.EvaluationException;

public class URLEvaluatorTest {

final String expectedURL1 = "testUrl1";
final String expectedURL2 = "testUrl2";
Context context = new ContextBase();
AccessContext accessContext = new AccessContext();
URLEvaluator evaluator;
DummyRequest request;
DummyResponse response;
Expand All @@ -41,7 +41,7 @@ public class URLEvaluatorTest {
@Before
public void setUp() throws Exception {
evaluator = new URLEvaluator();
evaluator.setContext(context);
evaluator.setContext(accessContext);
evaluator.addURL(expectedURL1);
evaluator.start();
request = new DummyRequest();
Expand All @@ -56,28 +56,28 @@ public void tearDown() throws Exception {
request = null;
response = null;
serverAdapter = null;
context = null;
accessContext = null;
}

@Test
public void testExpectFalse() throws EvaluationException {
request.setRequestUri("test");
IAccessEvent ae = new AccessEvent(request, response, serverAdapter);
IAccessEvent ae = new AccessEvent(accessContext, request, response, serverAdapter);
assertFalse(evaluator.evaluate(ae));
}

@Test
public void testExpectTrue() throws EvaluationException {
request.setRequestUri(expectedURL1);
IAccessEvent ae = new AccessEvent(request, response, serverAdapter);
IAccessEvent ae = new AccessEvent(accessContext, request, response, serverAdapter);
assertTrue(evaluator.evaluate(ae));
}

@Test
public void testExpectTrueMultiple() throws EvaluationException {
evaluator.addURL(expectedURL2);
request.setRequestUri(expectedURL2);
IAccessEvent ae = new AccessEvent(request, response, serverAdapter);
IAccessEvent ae = new AccessEvent(accessContext, request, response, serverAdapter);
assertTrue(evaluator.evaluate(ae));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,18 @@
import ch.qos.logback.access.dummy.DummyRequest;
import ch.qos.logback.access.dummy.DummyResponse;
import ch.qos.logback.access.dummy.DummyServerAdapter;
import ch.qos.logback.access.spi.AccessContext;
import ch.qos.logback.access.spi.AccessEvent;

public class ConverterTest {

IAccessEvent event;
DummyRequest request;
DummyResponse response;

DummyRequest request = new DummyRequest();
DummyResponse response = new DummyResponse();
AccessContext accessContext = new AccessContext();

@Before
public void setUp() throws Exception {
request = new DummyRequest();
response = new DummyResponse();
event = createEvent();
}

Expand Down Expand Up @@ -193,7 +193,7 @@ public void testStatusCodeConverter() {

private IAccessEvent createEvent() {
DummyServerAdapter dummyAdapter = new DummyServerAdapter(request, response);
return new AccessEvent(request, response, dummyAdapter);
return new AccessEvent(accessContext, request, response, dummyAdapter);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,9 @@ public void testAttributesAreNotTakenFromRecycledRequestWhenProcessingDeferred()
DummyRequest request = new DummyRequest();
DummyResponse response = new DummyResponse();
DummyServerAdapter adapter = new DummyServerAdapter(request, response);

IAccessEvent event = new AccessEvent(request, response, adapter);
AccessContext accessContext = new AccessContext();

IAccessEvent event = new AccessEvent(accessContext, request, response, adapter);

request.setAttribute("testKey", "ORIGINAL");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@
import ch.qos.logback.classic.spi.LoggerComparator;
import ch.qos.logback.classic.spi.LoggerContextListener;
import ch.qos.logback.classic.spi.LoggerContextVO;
import ch.qos.logback.classic.spi.SequenceNumberGenerator;
import ch.qos.logback.classic.spi.TurboFilterList;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.classic.util.LoggerNameUtil;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.boolex.EventEvaluator;
import ch.qos.logback.core.spi.FilterReply;
import ch.qos.logback.core.spi.LifeCycle;
import ch.qos.logback.core.spi.SequenceNumberGenerator;
import ch.qos.logback.core.status.StatusListener;
import ch.qos.logback.core.status.StatusManager;
import ch.qos.logback.core.status.WarnStatus;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.util.LogbackMDCAdapter;
import ch.qos.logback.core.spi.SequenceNumberGenerator;

import org.slf4j.spi.MDCAdapter;

Expand Down
Loading

0 comments on commit b633038

Please sign in to comment.