From 148156de27e4c02388999443c014ff122c7f0cc9 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Tue, 19 Apr 2016 17:01:52 -0700 Subject: [PATCH 1/4] Moved samples for Logs to Github --- appengine/logs/README.md | 42 ++++++++ appengine/logs/pom.xml | 76 ++++++++++++++ .../example/appengine/logs/LogsServlet.java | 99 +++++++++++++++++++ .../src/main/webapp/WEB-INF/appengine-web.xml | 9 ++ .../main/webapp/WEB-INF/logging.properties | 14 +++ .../logs/src/main/webapp/WEB-INF/web.xml | 14 +++ pom.xml | 1 + 7 files changed, 255 insertions(+) create mode 100644 appengine/logs/README.md create mode 100644 appengine/logs/pom.xml create mode 100644 appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java create mode 100644 appengine/logs/src/main/webapp/WEB-INF/appengine-web.xml create mode 100644 appengine/logs/src/main/webapp/WEB-INF/logging.properties create mode 100644 appengine/logs/src/main/webapp/WEB-INF/web.xml diff --git a/appengine/logs/README.md b/appengine/logs/README.md new file mode 100644 index 00000000000..c2d2bcebc6e --- /dev/null +++ b/appengine/logs/README.md @@ -0,0 +1,42 @@ +# Users Authentication sample for Google App Engine + +This sample demonstrates how to use the [Logs API][appid] on [Google App +Engine][ae-docs]. + +[appid]: https://cloud.google.com/appengine/docs/java/logs/ +[ae-docs]: https://cloud.google.com/appengine/docs/java/ + +## Running locally + +The Logs API only generates output for deployed apps, so this program should not be run locally. + +## Deploying + +This example uses the +[Maven gcloud plugin](https://cloud.google.com/appengine/docs/java/managed-vms/maven). + +In the following command, replace YOUR-PROJECT-ID with your +[Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber). + + In the following command, replace YOUR-PROJECT-ID with your +[Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber) and SOME-VERSION with the desired version number. + + $ mvn appengine:update -Dappengine.appId=YOUR-PROJECT-ID -Dappengine.version=SOME-VERSION + +## Setup +To save your project settings so that you don't need to enter the + parameters, you can: + +1. Update the tag in src/main/webapp/WEB-INF/appengine-web.xml + with your project name. + +2. Update the tag in src/main/webapp/WEB-INF/appengine-web.xml + with a valid version number. + + +You will now be able to run + + $ mvn appengine:update + +without the need for any additional parameters. + diff --git a/appengine/logs/pom.xml b/appengine/logs/pom.xml new file mode 100644 index 00000000000..a6f89953136 --- /dev/null +++ b/appengine/logs/pom.xml @@ -0,0 +1,76 @@ + + + + 4.0.0 + war + 1.0-SNAPSHOT + com.example.appengine + appengine-logs + + + com.google.cloud + doc-samples + 1.0.0 + ../.. + + + + com.google.appengine + appengine-api-1.0-sdk + ${appengine.sdk.version} + + + com.google.guava + guava + 19.0 + + + javax.servlet + servlet-api + 2.5 + jar + provided + + + org.json + json + 20151123 + + + + + + ${project.build.directory}/${project.build.finalName}/WEB-INF/classes + + + org.apache.maven.plugins + 3.3 + maven-compiler-plugin + + 1.7 + 1.7 + + + + com.google.appengine + appengine-maven-plugin + ${appengine.sdk.version} + + + + diff --git a/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java b/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java new file mode 100644 index 00000000000..0486933422a --- /dev/null +++ b/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java @@ -0,0 +1,99 @@ +/* Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [START logs_API_example] +package com.example.appengine.logs; + +//import com.google.appengine.api.log.*; // Fix these to remove * import +import com.google.appengine.api.log.AppLogLine; +import com.google.appengine.api.log.LogQuery; +import com.google.appengine.api.log.LogServiceFactory; +import com.google.appengine.api.log.RequestLogs; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Calendar; + +//import javax.servlet.http.*; // Fix these to remove * import +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +// Get request logs along with their app log lines and display them 5 at +// a time, using a Next link to cycle through to the next 5. +public class LogsServlet extends HttpServlet { + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) + throws IOException { + + resp.setContentType("text/html"); + PrintWriter writer = resp.getWriter(); + // We use this to break out of our iteration loop, limiting record + // display to 5 request logs at a time. + int limit = 5; + + // This retrieves the offset from the Next link upon user click. + String offset = req.getParameter("offset"); + + // We want the App logs for each request log + LogQuery query = LogQuery.Builder.withDefaults(); + query.includeAppLogs(true); + + // Set the offset value retrieved from the Next link click. + if (offset != null) { + query.offset(offset); + } + + // This gets filled from the last request log in the iteration + String lastOffset = null; + int count = 0; + + // Display a few properties of each request log. + for (RequestLogs record : LogServiceFactory.getLogService().fetch(query)) { + writer.println("
REQUEST LOG
"); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(record.getStartTimeUsec() / 1000); + + writer.println("IP: " + record.getIp() + "
"); + writer.println("Method: " + record.getMethod() + "
"); + writer.println("Resource " + record.getResource() + "
"); + writer.println(String.format("
Date: %s", cal.getTime().toString())); + + lastOffset = record.getOffset(); + + // Display all the app logs for each request log. + for (AppLogLine appLog : record.getAppLogLines()) { + writer.println("
" + "APPLICATION LOG" + "
"); + Calendar appCal = Calendar.getInstance(); + appCal.setTimeInMillis(appLog.getTimeUsec() / 1000); + writer.println(String.format("
Date: %s", + appCal.getTime().toString())); + writer.println("
Level: " + appLog.getLogLevel() + "
"); + writer.println("Message: " + appLog.getLogMessage() + "

"); + } //for each log line + + if (++count >= limit) { + break; + } + } // for each record + + // When the user clicks this link, the offset is processed in the + // GET handler and used to cycle through to the next 5 request logs. + writer.println(String.format("
Next", + lastOffset)); + } // end doGet +} //end class +// [END logs_API_example] + diff --git a/appengine/logs/src/main/webapp/WEB-INF/appengine-web.xml b/appengine/logs/src/main/webapp/WEB-INF/appengine-web.xml new file mode 100644 index 00000000000..5b833ea1336 --- /dev/null +++ b/appengine/logs/src/main/webapp/WEB-INF/appengine-web.xml @@ -0,0 +1,9 @@ + + + YOUR-PROJECT-ID + YOUR-VERSION-NUMBER + true + + + + diff --git a/appengine/logs/src/main/webapp/WEB-INF/logging.properties b/appengine/logs/src/main/webapp/WEB-INF/logging.properties new file mode 100644 index 00000000000..3e7f85b9dc1 --- /dev/null +++ b/appengine/logs/src/main/webapp/WEB-INF/logging.properties @@ -0,0 +1,14 @@ +# A default java.util.logging configuration. +# (All App Engine logging is through java.util.logging by default). +# +# To use this configuration, copy it into your application's WEB-INF +# folder and add the following to your appengine-web.xml: +# +# +# +# +# + +# Set the default logging level for all loggers to WARNING +.level = WARNING + diff --git a/appengine/logs/src/main/webapp/WEB-INF/web.xml b/appengine/logs/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000000..f5fb26f54d4 --- /dev/null +++ b/appengine/logs/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,14 @@ + + + + logs + com.example.appengine.logs.LogsServlet + + + logs + / + + diff --git a/pom.xml b/pom.xml index cb178bd6ae5..b1d2d6ee761 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ appengine/analytics appengine/appidentity appengine/helloworld + appengine/logs appengine/mailgun appengine/mailjet appengine/memcache From ffa4f7351ad868c476ca3789cb66db67e5adf037 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Tue, 19 Apr 2016 17:08:53 -0700 Subject: [PATCH 2/4] Fixed README.md --- appengine/logs/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/appengine/logs/README.md b/appengine/logs/README.md index c2d2bcebc6e..47ae85a69a8 100644 --- a/appengine/logs/README.md +++ b/appengine/logs/README.md @@ -16,9 +16,6 @@ This example uses the [Maven gcloud plugin](https://cloud.google.com/appengine/docs/java/managed-vms/maven). In the following command, replace YOUR-PROJECT-ID with your -[Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber). - - In the following command, replace YOUR-PROJECT-ID with your [Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber) and SOME-VERSION with the desired version number. $ mvn appengine:update -Dappengine.appId=YOUR-PROJECT-ID -Dappengine.version=SOME-VERSION From b51621f1945aac11a4598b6b586371f71628f445 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Wed, 20 Apr 2016 09:27:47 -0700 Subject: [PATCH 3/4] Removed extra import lines. --- .../src/main/java/com/example/appengine/logs/LogsServlet.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java b/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java index 0486933422a..794c08909fc 100644 --- a/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java +++ b/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java @@ -15,7 +15,6 @@ // [START logs_API_example] package com.example.appengine.logs; -//import com.google.appengine.api.log.*; // Fix these to remove * import import com.google.appengine.api.log.AppLogLine; import com.google.appengine.api.log.LogQuery; import com.google.appengine.api.log.LogServiceFactory; @@ -25,7 +24,6 @@ import java.io.PrintWriter; import java.util.Calendar; -//import javax.servlet.http.*; // Fix these to remove * import import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; From a864a97320f331dad7c22451783f94cac1b9e5b4 Mon Sep 17 00:00:00 2001 From: Laurie White Date: Wed, 20 Apr 2016 15:48:47 -0700 Subject: [PATCH 4/4] Numerous style, license tweaks. Replaced Calendar class with org.joda.time.DateTime. --- appengine/logs/README.md | 6 +-- appengine/logs/pom.xml | 11 +++-- .../example/appengine/logs/LogsServlet.java | 46 +++++++++---------- .../src/main/webapp/WEB-INF/appengine-web.xml | 14 ++++++ .../logs/src/main/webapp/WEB-INF/web.xml | 14 ++++++ 5 files changed, 61 insertions(+), 30 deletions(-) diff --git a/appengine/logs/README.md b/appengine/logs/README.md index 47ae85a69a8..0d07745e5e8 100644 --- a/appengine/logs/README.md +++ b/appengine/logs/README.md @@ -1,9 +1,9 @@ # Users Authentication sample for Google App Engine -This sample demonstrates how to use the [Logs API][appid] on [Google App +This sample demonstrates how to use the [Logs API][log-docs] on [Google App Engine][ae-docs]. -[appid]: https://cloud.google.com/appengine/docs/java/logs/ +[log-docs]: https://cloud.google.com/appengine/docs/java/logs/ [ae-docs]: https://cloud.google.com/appengine/docs/java/ ## Running locally @@ -16,7 +16,7 @@ This example uses the [Maven gcloud plugin](https://cloud.google.com/appengine/docs/java/managed-vms/maven). In the following command, replace YOUR-PROJECT-ID with your -[Google Cloud Project ID](https://developers.google.com/console/help/new/#projectnumber) and SOME-VERSION with the desired version number. +[Google Cloud Project ID](https://support.google.com/cloud/answer/6158840) and SOME-VERSION with the desired version number. $ mvn appengine:update -Dappengine.appId=YOUR-PROJECT-ID -Dappengine.version=SOME-VERSION diff --git a/appengine/logs/pom.xml b/appengine/logs/pom.xml index a6f89953136..75feb324db1 100644 --- a/appengine/logs/pom.xml +++ b/appengine/logs/pom.xml @@ -1,6 +1,6 @@ - + 4.0.0 war 1.0-SNAPSHOT @@ -51,7 +50,11 @@ Copyright 2015 Google Inc. All Rights Reserved. json 20151123 - + + joda-time + joda-time + 2.9.3 + diff --git a/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java b/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java index 794c08909fc..6ab30b504bd 100644 --- a/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java +++ b/appengine/logs/src/main/java/com/example/appengine/logs/LogsServlet.java @@ -20,9 +20,10 @@ import com.google.appengine.api.log.LogServiceFactory; import com.google.appengine.api.log.RequestLogs; +import org.joda.time.DateTime; + import java.io.IOException; import java.io.PrintWriter; -import java.util.Calendar; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -33,11 +34,15 @@ // a time, using a Next link to cycle through to the next 5. public class LogsServlet extends HttpServlet { @Override - public void doGet(HttpServletRequest req, HttpServletResponse resp) + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/html"); PrintWriter writer = resp.getWriter(); + writer.println(""); + writer.println(""); + writer.println("App Engine Logs Sample"); + // We use this to break out of our iteration loop, limiting record // display to 5 request logs at a time. int limit = 5; @@ -60,38 +65,33 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) // Display a few properties of each request log. for (RequestLogs record : LogServiceFactory.getLogService().fetch(query)) { - writer.println("
REQUEST LOG
"); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(record.getStartTimeUsec() / 1000); - - writer.println("IP: " + record.getIp() + "
"); - writer.println("Method: " + record.getMethod() + "
"); - writer.println("Resource " + record.getResource() + "
"); - writer.println(String.format("
Date: %s", cal.getTime().toString())); + writer.println("
REQUEST LOG
"); + DateTime reqTime = new DateTime(record.getStartTimeUsec() / 1000); + writer.println("IP: " + record.getIp() + "
"); + writer.println("Method: " + record.getMethod() + "
"); + writer.println("Resource " + record.getResource() + "
"); + writer.println(String.format("
Date: %s", reqTime.toString())); lastOffset = record.getOffset(); // Display all the app logs for each request log. for (AppLogLine appLog : record.getAppLogLines()) { - writer.println("
" + "APPLICATION LOG" + "
"); - Calendar appCal = Calendar.getInstance(); - appCal.setTimeInMillis(appLog.getTimeUsec() / 1000); - writer.println(String.format("
Date: %s", - appCal.getTime().toString())); - writer.println("
Level: " + appLog.getLogLevel() + "
"); - writer.println("Message: " + appLog.getLogMessage() + "

"); - } //for each log line + writer.println("
" + "APPLICATION LOG" + "
"); + DateTime appTime = new DateTime(appLog.getTimeUsec() / 1000); + writer.println(String.format("
Date: %s", appTime.toString())); + writer.println("
Level: " + appLog.getLogLevel() + "
"); + writer.println("Message: " + appLog.getLogMessage() + "

"); + } if (++count >= limit) { break; } - } // for each record + } // When the user clicks this link, the offset is processed in the // GET handler and used to cycle through to the next 5 request logs. - writer.println(String.format("
Next", - lastOffset)); - } // end doGet -} //end class + writer.println(String.format("
Next", lastOffset)); + } +} // [END logs_API_example] diff --git a/appengine/logs/src/main/webapp/WEB-INF/appengine-web.xml b/appengine/logs/src/main/webapp/WEB-INF/appengine-web.xml index 5b833ea1336..73eefaee076 100644 --- a/appengine/logs/src/main/webapp/WEB-INF/appengine-web.xml +++ b/appengine/logs/src/main/webapp/WEB-INF/appengine-web.xml @@ -1,4 +1,18 @@ + + + YOUR-PROJECT-ID YOUR-VERSION-NUMBER diff --git a/appengine/logs/src/main/webapp/WEB-INF/web.xml b/appengine/logs/src/main/webapp/WEB-INF/web.xml index f5fb26f54d4..fa2cb4457c4 100644 --- a/appengine/logs/src/main/webapp/WEB-INF/web.xml +++ b/appengine/logs/src/main/webapp/WEB-INF/web.xml @@ -1,4 +1,18 @@ + + +