【问题标题】:Can't see my custom logs in Google App Engine在 Google App Engine 中看不到我的自定义日志
【发布时间】:2012-08-19 20:42:53
【问题描述】:

我正在尝试在 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 /插入 200 2922ms 0kb Mozilla/5.0 (Windows NT 6.1;哇64; 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 /插入 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 实例=00c61b117cf339fa358dc217b91a9f45b8c30f

我 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 字符串在哪里?我没有找对地方吗?

【问题讨论】:

    标签: java google-app-engine


    【解决方案1】:

    乍一看,我想说的是,当您在“logging.properties”文件中使用此设置时:

    .level = WARNING
    

    而且,你(登录代码时不要指定任何级别,将使用默认级别,这肯定不是'WARNING'(我猜是INFO^^) do 用这一行指定日志级别:

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

    因此结果是您仅在“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 中进行配置(或者可以务实地完成)。 在侵入性弹出记录器存在太久之后......我选择从客户端远程登录到服务器以享受logging.properties的使用,这是使用gwt.xml时的配置:

    <!-- 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"/>
    

    如果您使用此设置,请不要忘记使用 servlet 定义配置您的 web.xml 以处理日志记录(遗憾的是,文档中没有提供):

    <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,他们确实如此。此外,.level 之前的路径是类路径,这是用作文件管理器的实际部分。默认情况下,.level 没有路径,因此它匹配每个路径(如正则表达式中的 *)。或者,oed.server.level = FINE,则路径“oed.server”下的所有类都将其级别设置为“FINE”。
    • 答案非常彻底,所以也许我会在不创建新问题的情况下得到另一个答案...如何为每个应用程序版本设置不同的日志级别?我的意思是我已经在谷歌的云中拥有了一些应用程序,并且我已经设置了实时版本和登台版本。现在,我不需要来自现场的信息,但是当我尝试在暂存版本上进行一些简单的调试时它会很有用......
    • 令人费解地不清楚 GWT 与从 servlet 进行日志记录的关系如何
    【解决方案2】:

    您应该检查“具有最低严重性的日志”,而不是检查“所有请求”,然后从下拉列表中选择“信息”。

    【讨论】:

    • 嗯,看起来一样。我只看到系统信息消息,但看不到我自己的 log.info 消息。
    • 我想您应该向我们展示您的 logging.properties 文件和您的 appengine-web.xml 文件条目。也许有人会看到问题。
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 2018-08-11
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多