diff --git a/src/main/java/com/google/cloud/logging/logback/LoggingAppender.java b/src/main/java/com/google/cloud/logging/logback/LoggingAppender.java index 6d5d081bd..1adcd4921 100644 --- a/src/main/java/com/google/cloud/logging/logback/LoggingAppender.java +++ b/src/main/java/com/google/cloud/logging/logback/LoggingAppender.java @@ -39,8 +39,10 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -72,6 +74,8 @@ public class LoggingAppender extends UnsynchronizedAppenderBase { private static final String LEVEL_NAME_KEY = "levelName"; private static final String LEVEL_VALUE_KEY = "levelValue"; private static final String LOGGER_NAME_KEY = "loggerName"; + private static final String TYPE = + "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent"; private static final List DEFAULT_LOGGING_EVENT_ENHANCERS = ImmutableList.of(new MDCEventEnhancer()); @@ -284,11 +288,17 @@ private LogEntry logEntryFor(ILoggingEvent e) { writeStack(e.getThrowableProxy(), "", payload); Level level = e.getLevel(); + Severity severity = severityFor(level); + + Map jsonContent = new HashMap<>(); + jsonContent.put("message", payload.toString().trim()); + if (severity == Severity.ERROR) { + jsonContent.put("@type", TYPE); + } LogEntry.Builder builder = - LogEntry.newBuilder(Payload.StringPayload.of(payload.toString().trim())) + LogEntry.newBuilder(Payload.JsonPayload.of(jsonContent)) .setTimestamp(e.getTimeStamp()) - .setSeverity(severityFor(level)); - + .setSeverity(severity); builder .addLabel(LEVEL_NAME_KEY, level.toString()) .addLabel(LEVEL_VALUE_KEY, String.valueOf(level.toInt())) diff --git a/src/test/java/com/google/cloud/logging/logback/LoggingAppenderTest.java b/src/test/java/com/google/cloud/logging/logback/LoggingAppenderTest.java index a3add6f1e..ec85327ce 100644 --- a/src/test/java/com/google/cloud/logging/logback/LoggingAppenderTest.java +++ b/src/test/java/com/google/cloud/logging/logback/LoggingAppenderTest.java @@ -34,9 +34,10 @@ import com.google.cloud.logging.Logging; import com.google.cloud.logging.Logging.WriteOption; import com.google.cloud.logging.LoggingOptions; -import com.google.cloud.logging.Payload.StringPayload; +import com.google.cloud.logging.Payload.JsonPayload; import com.google.cloud.logging.Severity; import com.google.common.collect.ImmutableMap; +import java.util.HashMap; import java.util.Map; import org.easymock.Capture; import org.easymock.EasyMock; @@ -82,8 +83,11 @@ public void setUp() { @Test public void testFlushLevelConfigUpdatesLoggingFlushSeverity() { + Map jsonContent = new HashMap<>(); + jsonContent.put("message", "this is a test"); + JsonPayload payload = JsonPayload.of(jsonContent); LogEntry logEntry = - LogEntry.newBuilder(StringPayload.of("this is a test")) + LogEntry.newBuilder(payload) .setTimestamp(100000L) .setSeverity(Severity.WARNING) .setLabels( @@ -110,8 +114,14 @@ public void testFlushLevelConfigUpdatesLoggingFlushSeverity() { @Test public void testFilterLogsOnlyLogsAtOrAboveLogLevel() { + Map jsonContent = new HashMap<>(); + jsonContent.put("message", "this is a test"); + jsonContent.put( + "@type", + "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent"); + JsonPayload payload = JsonPayload.of(jsonContent); LogEntry logEntry = - LogEntry.newBuilder(StringPayload.of("this is a test")) + LogEntry.newBuilder(payload) .setTimestamp(100000L) .setSeverity(Severity.ERROR) .setLabels( @@ -145,8 +155,11 @@ public void testFilterLogsOnlyLogsAtOrAboveLogLevel() { @Test public void testEnhancersAddCorrectLabelsToLogEntries() { + Map jsonContent = new HashMap<>(); + jsonContent.put("message", "this is a test"); + JsonPayload payload = JsonPayload.of(jsonContent); LogEntry logEntry = - LogEntry.newBuilder(StringPayload.of("this is a test")) + LogEntry.newBuilder(payload) .setTimestamp(100000L) .setSeverity(Severity.WARNING) .setLabels( @@ -194,8 +207,11 @@ public void testDefaultWriteOptionsHasExpectedDefaults() { @Test public void testMdcValuesAreConvertedToLabels() { + Map jsonContent = new HashMap<>(); + jsonContent.put("message", "this is a test"); + JsonPayload payload = JsonPayload.of(jsonContent); LogEntry logEntry = - LogEntry.newBuilder(StringPayload.of("this is a test")) + LogEntry.newBuilder(payload) .setTimestamp(100000L) .setSeverity(Severity.INFO) .setLabels(