You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by ra...@apache.org on 2021/07/29 16:38:07 UTC

[trafficcontrol] branch master updated: Show delivery service ID in TR log output (#5941)

This is an automated email from the ASF dual-hosted git repository.

rawlin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new c5542ee  Show delivery service ID in TR log output (#5941)
c5542ee is described below

commit c5542eef3f3bf73c77cf223957ccf10d7ddbce9b
Author: Joshua Zenn <wo...@gmail.com>
AuthorDate: Thu Jul 29 12:37:56 2021 -0400

    Show delivery service ID in TR log output (#5941)
    
    * Show DeliveryService xml_id in log output
    
    * Fixed PMD violation
    
    * WIP Added SVC field to DNS requests
    
    * Fixed unit tests for svc tag
    
    * Fixed null svc string with '-'
    
    * Updated changelog
    
    * Included all CLIENT_STEERING targets in logging
---
 CHANGELOG.md                                           |  1 +
 .../traffic_router/core/dns/DNSAccessEventBuilder.java | 14 ++++++++++++--
 .../traffic_router/core/dns/DNSAccessRecord.java       | 12 ++++++++++++
 .../traffic_router/core/dns/ZoneManager.java           |  1 +
 .../core/http/HTTPAccessEventBuilder.java              |  8 ++++++--
 .../traffic_router/core/http/HTTPAccessRecord.java     | 12 ++++++++++++
 .../traffic_router/core/http/RouterFilter.java         |  7 +++++++
 .../traffic_router/core/router/HTTPRouteResult.java    |  5 +++++
 .../traffic_router/core/router/TrafficRouter.java      |  1 +
 .../core/dns/DNSAccessEventBuilderTest.java            | 18 +++++++++---------
 .../core/dns/protocol/AbstractProtocolTest.java        |  8 ++++----
 .../core/http/HTTPAccessEventBuilderTest.java          | 18 +++++++++---------
 12 files changed, 79 insertions(+), 26 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 06dc661..c46d174 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -51,6 +51,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
 - t3c: add flag to wait for parents in syncds mode
 - t3c: Change syncds so that it only warns on package version mismatch.
 - atstccfg: add ##REFETCH## support to regex_revalidate.config processing.
+- Traffic Router: Added `svc="..."` field to request logging output.
 - Added t3c caching Traffic Ops data and using If-Modified-Since to avoid unnecessary requests.
 - Added a Traffic Monitor integration test framework.
 - Added `traffic_ops/app/db/traffic_vault_migrate` to help with migrating Traffic Ops Traffic Vault backends
diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessEventBuilder.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessEventBuilder.java
index 118fe49..11ccdc8 100644
--- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessEventBuilder.java
+++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessEventBuilder.java
@@ -53,11 +53,13 @@ public class DNSAccessEventBuilder {
 
         final String routingInfo = "rtype=" + rType + " rloc=\"" + rloc +  "\" rdtl=" + rdtl + " rerr=\"-\"";
         String answer = "ans=\"-\"";
+        final String dsString = dnsAccessRecord.getDeliveryServiceXmlIds() == null ? "-" : dnsAccessRecord.getDeliveryServiceXmlIds();
+        final String dsInfo = "svc=\"" + dsString + "\"";
 
         if (dnsAccessRecord.getDnsMessage() != null) {
             answer = createTTLandAnswer(dnsAccessRecord.getDnsMessage());
         }
-        return event + " " + routingInfo + " " + answer;
+        return event + " " + routingInfo + " " + answer + " " + dsInfo;
     }
 
     private static String createEvent(final DNSAccessRecord dnsAccessRecord) {
@@ -113,6 +115,7 @@ public class DNSAccessEventBuilder {
     public static String create(final DNSAccessRecord dnsAccessRecord, final WireParseException wireParseException) {
         final String event = createEvent(dnsAccessRecord);
         final String rerr = "Bad Request:" + wireParseException.getClass().getSimpleName() + ":" + wireParseException.getMessage();
+        final String dsID = dnsAccessRecord.getDeliveryServiceXmlIds() == null ? "-" : dnsAccessRecord.getDeliveryServiceXmlIds();
         return new StringBuilder(event)
                 .append(" rtype=-")
                 .append(" rloc=\"-\"")
@@ -122,6 +125,9 @@ public class DNSAccessEventBuilder {
                 .append("\"")
                 .append(" ttl=\"-\"")
                 .append(" ans=\"-\"")
+                .append(" svc=\"")
+                .append(dsID)
+                .append("\"")
                 .toString();
     }
 
@@ -131,6 +137,7 @@ public class DNSAccessEventBuilder {
         final String event = createEvent(dnsAccessRecord);
 
         final String rerr = "Server Error:" + exception.getClass().getSimpleName() + ":" + exception.getMessage();
+        final String dsID = dnsAccessRecord.getDeliveryServiceXmlIds() == null ? "-" : dnsAccessRecord.getDeliveryServiceXmlIds();
 
         return new StringBuilder(event)
                 .append(" rtype=-")
@@ -140,7 +147,10 @@ public class DNSAccessEventBuilder {
                 .append(rerr)
                 .append("\"")
                 .append(" ttl=\"-\"")
-                .append(" ans=\"-\"").toString();
+                .append(" ans=\"-\"")
+                .append(" svc=\"")
+                .append(dsID)
+                .append("\"").toString();
     }
 
     private static String createQuery(final Record query) {
diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessRecord.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessRecord.java
index cc861e0..379a72f 100644
--- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessRecord.java
+++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessRecord.java
@@ -35,6 +35,7 @@ public final class DNSAccessRecord {
     private final ResultDetails resultDetails;
     private final Geolocation resultLocation;
     private final long requestNanoTime;
+    private final String deliveryServiceXmlIds;
 
     public long getQueryInstant() {
         return queryInstant;
@@ -68,6 +69,10 @@ public final class DNSAccessRecord {
         return requestNanoTime;
     }
 
+    public String getDeliveryServiceXmlIds() {
+        return deliveryServiceXmlIds;
+    }
+
     public static class Builder {
         private final long queryInstant;
         private final InetAddress resolver;
@@ -77,6 +82,7 @@ public final class DNSAccessRecord {
         private ResultDetails resultDetails;
         private Geolocation resultLocation;
         private final long requestNanoTime;
+        private String deliveryServiceXmlIds;
 
         public Builder(final long queryInstant, final InetAddress client) {
             this.queryInstant = queryInstant;
@@ -110,6 +116,11 @@ public final class DNSAccessRecord {
             return this;
         }
 
+        public Builder deliveryServiceXmlIds(final String deliveryServicesXmlIds) {
+            this.deliveryServiceXmlIds = deliveryServicesXmlIds;
+            return this;
+        }
+
         public DNSAccessRecord build() {
             return new DNSAccessRecord(this);
         }
@@ -124,6 +135,7 @@ public final class DNSAccessRecord {
         resultDetails = builder.resultDetails;
         resultLocation = builder.resultLocation;
         requestNanoTime = builder.requestNanoTime;
+        deliveryServiceXmlIds = builder.deliveryServiceXmlIds;
     }
 
 }
diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/ZoneManager.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/ZoneManager.java
index 32e8725..a040bd6 100644
--- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/ZoneManager.java
+++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/ZoneManager.java
@@ -940,6 +940,7 @@ public class ZoneManager extends Resolver {
 			if (result != null) {
 				final Zone dynamicZone = fillDynamicZone(dynamicZoneCache, staticZone, request, result);
 				track.setResultCode(dynamicZone, request.getName(), request.getQueryType());
+				builder.deliveryServiceXmlIds(result.getDeliveryService().getId());
 				return dynamicZone;
 			} else {
 				return null;
diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessEventBuilder.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessEventBuilder.java
index 8d2f65f..c831161 100644
--- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessEventBuilder.java
+++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessEventBuilder.java
@@ -73,7 +73,7 @@ public class HTTPAccessEventBuilder {
         return stringBuilder.toString();
     }
 
-    @SuppressWarnings("PMD.UseStringBufferForStringAppends")
+    @SuppressWarnings({"PMD.UseStringBufferForStringAppends", "PMD.NPathComplexity"})
     public static String create(final HTTPAccessRecord httpAccessRecord) {
         final long start = httpAccessRecord.getRequestDate().getTime();
         final String timeString = String.format("%d.%03d", start / 1000, start % 1000);
@@ -146,9 +146,13 @@ public class HTTPAccessEventBuilder {
         final String respurls = " rurls=\"" + formatObject(httpAccessRecord.getResponseURLs()) + "\"";
         stringBuilder.append(respurls);
 
-        final String userAgent = httpServletRequest.getHeader("User-Agent") + "\" ";
+        final String userAgent = httpServletRequest.getHeader("User-Agent") + "\"";
         stringBuilder.append(" uas=\"").append(userAgent);
 
+        final String fmtDSID = formatObject(httpAccessRecord.getDeliveryServiceXmlIds());
+        final String deliveryServiceId = fmtDSID == null ? "-" : fmtDSID;
+        stringBuilder.append(" svc=\"").append(deliveryServiceId).append("\" ");
+
         stringBuilder.append(formatRequestHeaders(httpAccessRecord.getRequestHeaders()));
         return stringBuilder.toString();
     }
diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessRecord.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessRecord.java
index cc89b1b..63e18a9 100644
--- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessRecord.java
+++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessRecord.java
@@ -46,6 +46,7 @@ public class HTTPAccessRecord {
     private final Geolocation resultLocation;
     private final Map<String, String> requestHeaders;
     private final RegionalGeoResult regionalGeoResult;
+    private final String deliveryServiceXmlIds;
 
     public Date getRequestDate() {
         return requestDate;
@@ -95,6 +96,10 @@ public class HTTPAccessRecord {
         return requestNanoTime;
     }
 
+    public String getDeliveryServiceXmlIds() {
+        return deliveryServiceXmlIds;
+    }
+
     public static class Builder {
         private final Date requestDate;
         private final HttpServletRequest request;
@@ -108,6 +113,7 @@ public class HTTPAccessRecord {
         private Map<String, String> requestHeaders = new HashMap<String, String>();
         private RegionalGeoResult regionalGeoResult;
         private final long requestNanoTime;
+        private String deliveryServiceXmlIds;
 
         public Builder(final Date requestDate, final HttpServletRequest request) {
             this.requestDate = requestDate;
@@ -178,6 +184,11 @@ public class HTTPAccessRecord {
         public HTTPAccessRecord build() {
             return new HTTPAccessRecord(this);
         }
+
+        public Builder deliveryServiceIds(final String deliveryServiceIds) {
+            this.deliveryServiceXmlIds = deliveryServiceIds;
+            return this;
+        }
     }
 
     private HTTPAccessRecord(final Builder builder) {
@@ -193,6 +204,7 @@ public class HTTPAccessRecord {
         requestHeaders = builder.requestHeaders;
         regionalGeoResult = builder.regionalGeoResult;
         requestNanoTime = builder.requestNanoTime;
+        deliveryServiceXmlIds = builder.deliveryServiceXmlIds;
     }
 
     @Override
diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/RouterFilter.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/RouterFilter.java
index 30a6774..0a678f3 100644
--- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/RouterFilter.java
+++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/http/RouterFilter.java
@@ -77,6 +77,7 @@ public class RouterFilter extends OncePerRequestFilter {
 		writeHttpResponse(response, request, new HTTPRequest(request), StatTracker.getTrack(), httpAccessRecord);
 	}
 
+	@SuppressWarnings("PMD.CyclomaticComplexity")
 	private void writeHttpResponse(final HttpServletResponse response, final HttpServletRequest httpServletRequest,
 	                               final HTTPRequest request, final StatTracker.Track track, final HTTPAccessRecord httpAccessRecord) throws IOException {
 		final HTTPAccessRecord.Builder httpAccessRecordBuilder = new HTTPAccessRecord.Builder(httpAccessRecord);
@@ -112,11 +113,17 @@ public class RouterFilter extends OncePerRequestFilter {
 
 			final Map<String,String> accessRequestHeaders = new HttpAccessRequestHeaders().makeMap(httpServletRequest, requestHeaders);
 
+			String deliveryServiceIds = "";
+			if (routeResult != null && routeResult.getDeliveryServices().size() > 0) {
+				deliveryServiceIds = routeResult.getDeliveryServicesLogString();
+			}
+
 			final HTTPAccessRecord access = httpAccessRecordBuilder.resultType(track.getResult())
 				.resultDetails(track.getResultDetails())
 				.resultLocation(track.getResultLocation())
 				.requestHeaders(accessRequestHeaders)
 				.regionalGeoResult(track.getRegionalGeoResult())
+					.deliveryServiceIds(deliveryServiceIds)
 				.build();
 			ACCESS.info(HTTPAccessEventBuilder.create(access));
 			statTracker.saveTrack(track);
diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/HTTPRouteResult.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/HTTPRouteResult.java
index 9ee128b..08732fd 100644
--- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/HTTPRouteResult.java
+++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/HTTPRouteResult.java
@@ -21,6 +21,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.StringJoiner;
+import java.util.stream.Collectors;
 
 import org.apache.traffic_control.traffic_router.core.ds.DeliveryService;
 
@@ -60,6 +61,10 @@ public class HTTPRouteResult implements RouteResult {
 		return deliveryServices;
 	}
 
+	public String getDeliveryServicesLogString() {
+		return this.getDeliveryServices().stream().map(DeliveryService::getId).collect(Collectors.joining("|"));
+	}
+
 	public void addDeliveryService(final DeliveryService deliveryService) {
 		deliveryServices.add(deliveryService);
 	}
diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouter.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouter.java
index 4c71308..79b0a8d 100644
--- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouter.java
+++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouter.java
@@ -1084,6 +1084,7 @@ public class TrafficRouter {
 
 		for (final SteeringResult steeringResult: steeringResults) {
 			routeResult.addUrl(new URL(steeringResult.getDeliveryService().createURIString(request, steeringResult.getCache())));
+			routeResult.addDeliveryService(steeringResult.getDeliveryService());
 		}
 
 		if (routeResult.getUrls().isEmpty()) {
diff --git a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessEventBuilderTest.java b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessEventBuilderTest.java
index 3f63076..4f8c173 100644
--- a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessEventBuilderTest.java
+++ b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/dns/DNSAccessEventBuilderTest.java
@@ -77,7 +77,7 @@ public class DNSAccessEventBuilderTest {
 
         String dnsAccessEvent = DNSAccessEventBuilder.create(dnsAccessRecord, new WireParseException("invalid record length"));
         assertThat(dnsAccessEvent, equalTo("144140678.000 qtype=DNS chi=192.168.10.11 rhi=- ttms=789.000 xn=- fqdn=- type=- class=- rcode=-" +
-                " rtype=- rloc=\"-\" rdtl=- rerr=\"Bad Request:WireParseException:invalid record length\" ttl=\"-\" ans=\"-\""));
+                " rtype=- rloc=\"-\" rdtl=- rerr=\"Bad Request:WireParseException:invalid record length\" ttl=\"-\" ans=\"-\" svc=\"-\""));
     }
 
     @Test
@@ -130,7 +130,7 @@ public class DNSAccessEventBuilderTest {
 
         assertThat(dnsAccessEvent, equalTo("144140678.000 qtype=DNS chi=192.168.10.11 rhi=- ttms=789.123" +
                 " xn=65535 fqdn=www.example.com. type=A class=IN" +
-                " rcode=NOERROR rtype=- rloc=\"-\" rdtl=- rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\""));
+                " rcode=NOERROR rtype=- rloc=\"-\" rdtl=- rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\" svc=\"-\""));
 
 
         when(System.nanoTime()).thenAnswer(invocation -> 100000000L + 456000L);
@@ -138,7 +138,7 @@ public class DNSAccessEventBuilderTest {
 
         assertThat(dnsAccessEvent, equalTo("144140678.000 qtype=DNS chi=192.168.10.11 rhi=- ttms=0.456" +
                 " xn=65535 fqdn=www.example.com. type=A class=IN" +
-                " rcode=NOERROR rtype=- rloc=\"-\" rdtl=- rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\""));
+                " rcode=NOERROR rtype=- rloc=\"-\" rdtl=- rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\" svc=\"-\""));
     }
 
     @Test
@@ -158,7 +158,7 @@ public class DNSAccessEventBuilderTest {
         String dnsAccessEvent = DNSAccessEventBuilder.create(dnsAccessRecord, new RuntimeException("boom it failed"));
         assertThat(dnsAccessEvent, equalTo("144140678.000 qtype=DNS chi=192.168.10.11 rhi=- ttms=789.876" +
                 " xn=65535 fqdn=www.example.com. type=A class=IN" +
-                " rcode=SERVFAIL rtype=- rloc=\"-\" rdtl=- rerr=\"Server Error:RuntimeException:boom it failed\" ttl=\"-\" ans=\"-\""));
+                " rcode=SERVFAIL rtype=- rloc=\"-\" rdtl=- rerr=\"Server Error:RuntimeException:boom it failed\" ttl=\"-\" ans=\"-\" svc=\"-\""));
     }
 
     @Test
@@ -215,21 +215,21 @@ public class DNSAccessEventBuilderTest {
 
         assertThat(dnsAccessEvent, equalTo("144140678.000 qtype=DNS chi=192.168.10.11 rhi=- ttms=789.000" +
                 " xn=65535 fqdn=www.example.com. type=A class=IN" +
-                " rcode=NOERROR rtype=CZ rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\""));
+                " rcode=NOERROR rtype=CZ rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\" svc=\"-\""));
 
         dnsAccessRecord = builder.resultType(ResultType.GEO).build();
         dnsAccessEvent = DNSAccessEventBuilder.create(dnsAccessRecord);
 
         assertThat(dnsAccessEvent, equalTo("144140678.000 qtype=DNS chi=192.168.10.11 rhi=- ttms=0.123" +
                 " xn=65535 fqdn=www.example.com. type=A class=IN" +
-                " rcode=NOERROR rtype=GEO rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\""));
+                " rcode=NOERROR rtype=GEO rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\" svc=\"-\""));
 
         dnsAccessRecord = builder.resultType(ResultType.MISS).resultDetails(ResultDetails.DS_NOT_FOUND).build();
         dnsAccessEvent = DNSAccessEventBuilder.create(dnsAccessRecord);
 
         assertThat(dnsAccessEvent, equalTo("144140678.000 qtype=DNS chi=192.168.10.11 rhi=- ttms=0.246" +
                 " xn=65535 fqdn=www.example.com. type=A class=IN" +
-                " rcode=NOERROR rtype=MISS rloc=\"39.75,-104.99\" rdtl=DS_NOT_FOUND rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\""));
+                " rcode=NOERROR rtype=MISS rloc=\"39.75,-104.99\" rdtl=DS_NOT_FOUND rerr=\"-\" ttl=\"1 2 3\" ans=\"foo bar baz\" svc=\"-\""));
     }
 
     @Test
@@ -273,13 +273,13 @@ public class DNSAccessEventBuilderTest {
         Geolocation resultLocation = new Geolocation(39.7528,-104.9997);
         ResultType resultType = ResultType.CZ;
         final DNSAccessRecord.Builder builder = new DNSAccessRecord.Builder(144140678000L, resolver)
-                .dnsMessage(response).resultType(resultType).resultLocation(resultLocation).client(client);
+                .dnsMessage(response).resultType(resultType).resultLocation(resultLocation).client(client).deliveryServiceXmlIds("test");
 
         DNSAccessRecord dnsAccessRecord = builder.build();
         String dnsAccessEvent = DNSAccessEventBuilder.create(dnsAccessRecord);
 
         assertThat(dnsAccessEvent, equalTo("144140678.000 qtype=DNS chi=192.168.10.11 rhi=10.0.0.211 ttms=789.000" +
                 " xn=65535 fqdn=www.example.com. type=A class=IN" +
-                " rcode=NOERROR rtype=CZ rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" ttl=\"1\" ans=\"foo\""));
+                " rcode=NOERROR rtype=CZ rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" ttl=\"1\" ans=\"foo\" svc=\"test\""));
     }
 }
\ No newline at end of file
diff --git a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/dns/protocol/AbstractProtocolTest.java b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/dns/protocol/AbstractProtocolTest.java
index 005f706..0d34031 100644
--- a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/dns/protocol/AbstractProtocolTest.java
+++ b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/dns/protocol/AbstractProtocolTest.java
@@ -117,7 +117,7 @@ public class AbstractProtocolTest {
 
         abstractProtocol.run();
 
-        verify(accessLogger).info("144140678.000 qtype=DNS chi=192.168.23.45 rhi=- ttms=345.123 xn=65535 fqdn=www.example.com. type=A class=IN rcode=NOERROR rtype=- rloc=\"-\" rdtl=- rerr=\"-\" ttl=\"3600\" ans=\"192.168.8.9\"");
+        verify(accessLogger).info("144140678.000 qtype=DNS chi=192.168.23.45 rhi=- ttms=345.123 xn=65535 fqdn=www.example.com. type=A class=IN rcode=NOERROR rtype=- rloc=\"-\" rdtl=- rerr=\"-\" ttl=\"3600\" ans=\"192.168.8.9\" svc=\"-\"");
     }
 
     @Test
@@ -140,7 +140,7 @@ public class AbstractProtocolTest {
         abstractProtocol.setNameServer(nameServer);
         abstractProtocol.run();
 
-        verify(accessLogger).info("144140678.000 qtype=DNS chi=192.168.23.45 rhi=- ttms=345.123 xn=65535 fqdn=John\\032Wayne. type=TYPE65530 class=CLASS43210 rcode=REFUSED rtype=- rloc=\"-\" rdtl=- rerr=\"-\" ttl=\"-\" ans=\"-\"");
+        verify(accessLogger).info("144140678.000 qtype=DNS chi=192.168.23.45 rhi=- ttms=345.123 xn=65535 fqdn=John\\032Wayne. type=TYPE65530 class=CLASS43210 rcode=REFUSED rtype=- rloc=\"-\" rdtl=- rerr=\"-\" ttl=\"-\" ans=\"-\" svc=\"-\"");
     }
 
     @Test
@@ -148,7 +148,7 @@ public class AbstractProtocolTest {
         FakeAbstractProtocol abstractProtocol = new FakeAbstractProtocol(client, new byte[] {1,2,3,4,5,6,7});
         abstractProtocol.setNameServer(nameServer);
         abstractProtocol.run();
-        verify(accessLogger).info("144140678.000 qtype=DNS chi=192.168.23.45 rhi=- ttms=345.123 xn=- fqdn=- type=- class=- rcode=- rtype=- rloc=\"-\" rdtl=- rerr=\"Bad Request:WireParseException:end of input\" ttl=\"-\" ans=\"-\"");
+        verify(accessLogger).info("144140678.000 qtype=DNS chi=192.168.23.45 rhi=- ttms=345.123 xn=- fqdn=- type=- class=- rcode=- rtype=- rloc=\"-\" rdtl=- rerr=\"Bad Request:WireParseException:end of input\" ttl=\"-\" ans=\"-\" svc=\"-\"");
     }
 
     @Test
@@ -171,7 +171,7 @@ public class AbstractProtocolTest {
         abstractProtocol.setNameServer(nameServer);
         abstractProtocol.run();
 
-        verify(accessLogger).info("144140678.000 qtype=DNS chi=192.168.23.45 rhi=- ttms=345.123 xn=65535 fqdn=John\\032Wayne. type=TYPE65530 class=CLASS43210 rcode=SERVFAIL rtype=- rloc=\"-\" rdtl=- rerr=\"Server Error:RuntimeException:Aw snap!\" ttl=\"-\" ans=\"-\"");
+        verify(accessLogger).info("144140678.000 qtype=DNS chi=192.168.23.45 rhi=- ttms=345.123 xn=65535 fqdn=John\\032Wayne. type=TYPE65530 class=CLASS43210 rcode=SERVFAIL rtype=- rloc=\"-\" rdtl=- rerr=\"Server Error:RuntimeException:Aw snap!\" ttl=\"-\" ans=\"-\" svc=\"-\"");
 
     }
 
diff --git a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessEventBuilderTest.java b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessEventBuilderTest.java
index 5532ecb..ed5b158 100644
--- a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessEventBuilderTest.java
+++ b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/http/HTTPAccessEventBuilderTest.java
@@ -78,7 +78,7 @@ public class HTTPAccessEventBuilderTest {
 
         String httpAccessEvent = HTTPAccessEventBuilder.create(httpAccessRecord);
 
-        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=- rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" rurl=\"-\" rurls=\"-\" uas=\"null\" rh=\"-\""));
+        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=- rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" rurl=\"-\" rurls=\"-\" uas=\"null\" svc=\"-\" rh=\"-\""));
     }
 
     @Test
@@ -102,7 +102,7 @@ public class HTTPAccessEventBuilderTest {
         HTTPAccessRecord httpAccessRecord = builder.resultType(ResultType.CZ).build();
         String httpAccessEvent = HTTPAccessEventBuilder.create(httpAccessRecord);
 
-        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=CZ rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" rgb=\"-\" pssc=302 ttms=125.000 rurl=\"http://example.com/hereitis/index.html?foo=bar\" rurls=\"-\" uas=\"null\" rh=\"-\""));
+        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=CZ rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" rgb=\"-\" pssc=302 ttms=125.000 rurl=\"http://example.com/hereitis/index.html?foo=bar\" rurls=\"-\" uas=\"null\" svc=\"-\" rh=\"-\""));
     }
 
     @Test
@@ -131,7 +131,7 @@ public class HTTPAccessEventBuilderTest {
         HTTPAccessRecord httpAccessRecord = builder.resultType(ResultType.CZ).build();
         String httpAccessEvent = HTTPAccessEventBuilder.create(httpAccessRecord);
 
-        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=CZ rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" rgb=\"-\" pssc=302 ttms=125.000 rurl=\"http://example.com/hereitis/index.html?foo=bar\" rurls=\"[http://example.com/hereitis/index.html?foo=bar, http://example.com/thereitis/index.html?boo=baz]\" uas=\"null\" rh=\"-\""));
+        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=CZ rloc=\"39.75,-104.99\" rdtl=- rerr=\"-\" rgb=\"-\" pssc=302 ttms=125.000 rurl=\"http://example.com/hereitis/index.html?foo=bar\" rurls=\"[http://example.com/hereitis/index.html?foo=bar, http://example.com/thereitis/index.html?boo=baz]\" uas=\"null\" svc=\"-\" rh=\"-\""));
     }
 
     @Test
@@ -158,7 +158,7 @@ public class HTTPAccessEventBuilderTest {
         HTTPAccessRecord httpAccessRecord = builder.build();
         String httpAccessEvent = HTTPAccessEventBuilder.create(httpAccessRecord);
 
-        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=ERROR rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" pssc=302 ttms=0.124 rurl=\"http://example.com/hereitis/index.html?foo=bar\" rurls=\"-\" uas=\"null\" rh=\"-\""));
+        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=ERROR rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" pssc=302 ttms=0.124 rurl=\"http://example.com/hereitis/index.html?foo=bar\" rurls=\"-\" uas=\"null\" svc=\"-\" rh=\"-\""));
     }
 
 
@@ -187,7 +187,7 @@ public class HTTPAccessEventBuilderTest {
         HTTPAccessRecord httpAccessRecord = builder.build();
         String httpAccessEvent = HTTPAccessEventBuilder.create(httpAccessRecord);
 
-        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=ERROR rloc=\"-\" rdtl=- rerr=\"RuntimeException: you're doing it wrong\" rgb=\"-\" pssc=302 ttms=0.456 rurl=\"http://example.com/hereitis/index.html?foo=bar\" rurls=\"-\" uas=\"null\" rh=\"-\""));
+        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=ERROR rloc=\"-\" rdtl=- rerr=\"RuntimeException: you're doing it wrong\" rgb=\"-\" pssc=302 ttms=0.456 rurl=\"http://example.com/hereitis/index.html?foo=bar\" rurls=\"-\" uas=\"null\" svc=\"-\" rh=\"-\""));
     }
     
     @Test
@@ -213,7 +213,7 @@ public class HTTPAccessEventBuilderTest {
         HTTPAccessRecord httpAccessRecord = builder.build();
         String httpAccessEvent = HTTPAccessEventBuilder.create(httpAccessRecord);
 
-        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=MISS rloc=\"-\" rdtl=DS_NO_BYPASS rerr=\"-\" rgb=\"-\" pssc=503 ttms=0.789 rurl=\"-\" rurls=\"-\" uas=\"null\" rh=\"-\""));
+        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.7.6 rhi=- url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=MISS rloc=\"-\" rdtl=DS_NO_BYPASS rerr=\"-\" rgb=\"-\" pssc=503 ttms=0.789 rurl=\"-\" rurls=\"-\" uas=\"null\" svc=\"-\" rh=\"-\""));
     }
 
     @Test
@@ -249,7 +249,7 @@ public class HTTPAccessEventBuilderTest {
         HTTPAccessRecord httpAccessRecord = new HTTPAccessRecord.Builder(new Date(144140678000L), request).build();
         String httpAccessEvent = HTTPAccessEventBuilder.create(httpAccessRecord);
 
-        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.100.100 rhi=12.34.56.78 url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=- rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" rurl=\"-\" rurls=\"-\" uas=\"null\" rh=\"-\""));
+        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.100.100 rhi=12.34.56.78 url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=- rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" rurl=\"-\" rurls=\"-\" uas=\"null\" svc=\"-\" rh=\"-\""));
     }
 
     @Test
@@ -259,7 +259,7 @@ public class HTTPAccessEventBuilderTest {
         HTTPAccessRecord httpAccessRecord = new HTTPAccessRecord.Builder(new Date(144140678000L), request).build();
         String httpAccessEvent = HTTPAccessEventBuilder.create(httpAccessRecord);
 
-        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.123.123 rhi=192.168.7.6 url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=- rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" rurl=\"-\" rurls=\"-\" uas=\"null\" rh=\"-\""));
+        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.123.123 rhi=192.168.7.6 url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=- rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" rurl=\"-\" rurls=\"-\" uas=\"null\" svc=\"-\" rh=\"-\""));
     }
 
     @Test
@@ -270,7 +270,7 @@ public class HTTPAccessEventBuilderTest {
         HTTPAccessRecord httpAccessRecord = new HTTPAccessRecord.Builder(new Date(144140678000L), request).build();
         String httpAccessEvent = HTTPAccessEventBuilder.create(httpAccessRecord);
 
-        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.100.100 rhi=192.168.7.6 url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=- rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" rurl=\"-\" rurls=\"-\" uas=\"null\" rh=\"-\""));
+        assertThat(httpAccessEvent, equalTo("144140678.000 qtype=HTTP chi=192.168.100.100 rhi=192.168.7.6 url=\"http://example.com/index.html?foo=bar\" cqhm=GET cqhv=HTTP/1.1 rtype=- rloc=\"-\" rdtl=- rerr=\"-\" rgb=\"-\" rurl=\"-\" rurls=\"-\" uas=\"null\" svc=\"-\" rh=\"-\""));
     }
 
     @Test