无法在Google App Engine中查看我的自定义日志

6

我试图在GAE中进行简单的日志记录,但我认为我可能错过了一些简单的步骤。

我已经按照此处的说明操作:https://developers.google.com/appengine/docs/java/runtime#Logging

我希望能够向日志中写入一个简单的消息,像这样:

public class InsertServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final Logger log = Logger.getLogger(InsertServlet.class.getName());

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {

            log.info("Handled GET request - custom message");
            resp.setContentType("text/plain");
            resp.getWriter().println("HELLO");

    }

}

如果我用浏览器访问我的应用程序,我可以看到它在运行(在浏览器中得到“HELLO”消息)。

然而,在此之后,如果我访问控制台中的日志,我可以看到它正在记录事件,但我没有在任何地方看到我的消息。

我已选择“显示:所有请求”,但这是我在访问后在日志中看到的全部内容:

012-08-19 13:34:56.488 /insert 200 2922ms 0kb Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1

2602:306:ce97:de40:8dbd:ace7:14c3:89e2 - - [19/Aug/2012:13:34:56 -0700] "GET /insert HTTP/1.1" 200 52 - "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1" "karwosts-helloworld.appspot.com" ms=2923 cpu_ms=1213 api_cpu_ms=0 cpm_usd=0.000006 loading_request=1 instance=00c61b117cf339fa358dc217b91a9f45b8c30f

I 2012-08-19 13:34:56.487

此请求导致为您的应用程序启动了一个新进程,从而首次加载了您的应用程序代码。因此,此请求可能比典型请求需要更长时间并使用更多CPU。

Logging.Properties(仅一行):

.level = WARNING

appengine-web.xml

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <application>karwosts-helloworld</application>
  <version>1</version>

  <threadsafe>true</threadsafe>

  <!-- Configure java.util.logging -->
  <system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
  </system-properties>

</appengine-web-app>

我的自定义log.info字符串在哪里?我没有看错地方吗?
2个回答

9
首先看一下,在你的“logging.properties”文件中使用以下设置:

.level = WARNING

如果你没有在代码中明确指定日志记录级别,那么默认级别会被使用,这肯定不是'WARNING'(我猜测是INFO^^)。但是,你可以使用以下代码来指定日志记录级别:

logger.setLevel(logging.WARNING)
log.info(msg);

/* which is same as */
log.log(Level.INFO, msg);

因此,你当前只记录了“INFO”级别的日志(如示例所述),但是你的配置文件要求记录“WARNING”级别及以上。由于“info”级别低于“warning”,因此它们被从你的日志文件中丢弃,不会显示在服务器日志中。
我建议尝试使用以下方法,强制你指定日志级别。
import java.util.logging.Level;
import java.util.logging.Logger;
/* ... */
log.log(Level.INFO, "a info msg"); //info
log.log(Level.WARNING, "a warning msg"); //warning
log.log(Level.FINEST, "a fine(st) msg"); //debug (as finest)

之后,您可以使用logging.properties文件设置您想要的类别的日志记录级别:

# Set the default logging level for all loggers to WARNING
.level = WARNING

# Set level for your app
oed.server.level = INFO
oed.server.data.datastore.myInjector.level = FINEST

编辑2: 这种日志记录配置对客户端没有影响。当您想在GWT中记录消息时,可以使用GWT.log(message);,但不能指定级别。但是,这并不完全正确,它取决于your-app.gwt.xml文件中的配置。所有细节都可以在google dev guilde logging网站找到。我发现这非常有用而且做得很好。简而言之,在GWT中有几个默认记录器(约5-6个)。通过它们的handlers可以在*.gwt.xml中对所有记录器进行配置(或者可以以编程方式完成)。使用gwt.xml时,为了避免侵入式弹出式记录器时间过长... 我选择从客户端远程记录到服务器以享受logging.properties的使用,以下是相应的配置:

<!-- Logging configuration -->
  <inherits name="com.google.gwt.logging.Logging"/>

  <set-property name="gwt.logging.logLevel" value="INFO"/>  <!-- # To change the default logLevel -->
  <set-property name="gwt.logging.enabled" value="TRUE"/>  
  <set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" /> <!-- Remote logging (linked with servlet) -->
  <set-property name="gwt.logging.popupHandler" value="DISABLED" />
  <set-property name="gwt.logging.developmentModeHandler" value="ENABLED" />  
  <set-property name="gwt.logging.systemHandler" value="ENABLED" />
  <set-property name="gwt.logging.firebugHandler" value="DISABLED" />
  <set-property name="gwt.logging.consoleHandler" value="ENABLED"/>

如果您使用这个设置,请不要忘记在web.xml中配置一个Servlet定义来处理日志记录(遗憾的是,这并没有在文档中提供):

<servlet>
        <servlet-name>remoteLogging</servlet-name>
        <servlet-class>com.google.gwt.logging.server.RemoteLoggingServiceImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>remoteLogging</servlet-name>
        <url-pattern>/your-app-name/remote_logging</url-pattern>
    </servlet-mapping>

祝你好运!


啊,太好了,我没有意识到 logging.properties 文件中的 .level 语句起到了过滤器的作用。现在可以正常工作了,谢谢! - Tim
你是对的@Tim,他们确实这样做。此外,“.level”之前的路径是类路径,这是实际用作过滤器的部分。默认情况下,“.level”没有路径,因此它匹配每个路径(就像正则表达式中的*)。或者,如果“oed.server.level = FINE”,那么路径“oed.server”下面的所有类都将其级别设置为“FINE”。 - elkaonline
答案非常详细,也许我不需要创建新问题就能得到另一个答案...我该如何为每个应用程序版本设置不同的日志级别?我的意思是,我已经在谷歌云中有一些应用程序,并设置了版本的实时和暂存。现在,我不需要来自实时版本的信息,但当我尝试在暂存版本上进行一些简单的调试时,它会很有用... - Tomasz Kapłoński
令人困惑的是,GWT与从servlet记录日志的相关性不太清楚。 - Ivan Balashov

0

不要勾选“所有请求”,而应该勾选“最小严重性日志”,并从下拉列表中选择“信息”。


嗯,看起来一样。我只能看到系统信息消息,但看不到我的log.info消息。 - Tim
我猜你应该给我们展示一下你的logging.properties文件和appengine-web.xml文件条目。也许有人会发现问题。 - rickz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接