【问题标题】:GAE Golang - log.Print()?GAE Golang - log.Print()?
【发布时间】:2012-02-22 20:17:49
【问题描述】:

在哪里可以读取调用函数创建的日志:

log.Print("Message")

Main 下的“Logs”选项卡似乎只显示有关调用哪些 URL 的信息,但没有任何应用程序将显示的调试信息。

【问题讨论】:

    标签: google-app-engine logging go


    【解决方案1】:

    documentation 中所述,如果您希望日志显示在控制台中,则应使用Context 接口而不是log 进行日志记录。

    c := appengine.NewContext(r)
    c.Infof("Requested URL: %v", r.URL)
    

    【讨论】:

    • 应该传递上下文,还是应该根据需要创建一个新的?
    • @NickSiderakis 目前并不重要,因为它在 development 和生产环境中都由 SDK 缓存。
    • 如果你在调试一个没有请求 URL 的函数会发生什么!?
    • @hendry 在 App Engine 上的每个函数调用都以某种方式源自 HTTP 请求,您有没有发现并非如此的具体示例?
    • 在任何 App Engine 运行时中都无法在请求上下文之外进行日志记录。系统仅支持与请求关联的日志。
    【解决方案2】:

    如果您使用的是新的 App Engine 包google.golang.org/appengine,请在自述文件中:

    • appengine.Context 上的记录方法现在是 google.golang.org/appengine/log 中的函数

    所以你应该使用

    c := appengine.NewContext(r)
    log.Infof(c, "Requested URL: %v", r.URL)
    

    【讨论】:

      【解决方案3】:

      必须在其他方法调用中传递相同的上下文对象。 这是一个例子:

      func handleSign(w http.ResponseWriter, r *http.Request) {   
          c := appengine.NewContext(r)
          if err := r.ParseForm(); err != nil {
              writeError(c, err)
              return
          }
      }
      
      func writeError(c appengine.Context, err os.Error) {
          c.Errorf("%v", err)
      } 
      

      【讨论】:

      • 为什么要写一个单独的函数而不是简单的使用 c.Errorf("%v", err) ?
      • 另外,os.Error 是古老的(前 Go 1)。
      • @mihai 我认为这只是一个例子,说明如果你必须调用另一个方法,你会传递上下文。不管它是对 Nick Siderakis 评论的回应,所以我不确定为什么会这样作为答案发布。
      猜你喜欢
      • 2012-08-09
      • 2012-10-30
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 2012-12-14
      • 2014-06-04
      相关资源
      最近更新 更多