草庐IT

java - 在 Google App Engine 中看不到我的自定义日志

coder 2024-03-28 原文

我正在尝试在 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

This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.

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 字符串在哪里?我看错地方了吗?

最佳答案

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

.level = WARNING

而且,您(在您登录代码时不要指定任何级别,将使用默认级别,这肯定不是“警告”(我猜是 INFO^^) do 使用此行指定日志记录级别:

log.info(msg);

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

所以结果是您仅在“信息”级别登录(在您的示例中),但您的配置文件说要在警告级别及更高级别登录。由于“信息”级别低于“警告”,它们将从您的日志文件中丢弃,并且不会显示在您的服务器日志中。

我建议改用这种方法,它会强制您指定日志记录级别。

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>

祝你好运!

关于java - 在 Google App Engine 中看不到我的自定义日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029838/

有关java - 在 Google App Engine 中看不到我的自定义日志的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  3. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  4. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  9. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  10. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

随机推荐