【问题标题】:Log when server is started服务器启动时记录
【发布时间】:2016-03-22 14:59:04
【问题描述】:

有什么方法可以在 http 服务器启动时打印一些东西吗?比如"Server is started at port 8080"

在 Node 中(使用 Express),它会是这样的:

app.listen(8080, function() { console.log('Server started at port 8080') });

这是我的代码:

func main() {
    http.HandleFunc("/", MyHandler)
    http.ListenAndServe(":8080", nil)
}

谢谢。

【问题讨论】:

标签: http go


【解决方案1】:

使用 Go 的 log 包:

package main

import (
    "net/http"
    "log"
)

func main() {
    addr := ":8080"
    http.HandleFunc("/", MyHandler)
    log.Println("listen on", addr)
    log.Fatal( http.ListenAndServe(addr, nil) )
}

http.ListenAndServe 打开服务器端口,并永远阻塞等待客户端。如果打开端口失败,log.Fatal调用会报告问题并退出程序。

【讨论】:

    【解决方案2】:

    ListenAndServe 之后无法打印日志消息,因为它会阻塞并且永远不会返回,所以基本上你有两个主要选择:

    1. 打印 "Starting server on port...." 就是这样 - 但是如果 ListenAndServe 无法启动它会返回一个错误,所以除非有一些错误或因此打印的恐慌,你可以假设服务器已启动。

    2. 在单独的 goroutine 中调用 ListenAndServe,并确保没有返回错误并打印“服务器已启动...”等。

    我个人更喜欢第一种方法。

    【讨论】:

      【解决方案3】:

      要在 Not_a_Golfer 提到的 goroutine 中运行 ListenAndServe,您可以使用无缓冲的阻塞通道在 goroutine 中运行它并保持服务器处于活动状态。

      以下示例创建了一个名为done 的通道,其中<-done 将在等待goroutine 完成时使服务器保持活动状态,在这种情况下不会。通常,goroutine 会通过执行done <- true 来告诉主函数它已完成。

      package main
      
      import (
          "log"
          "net/http"
      )
      
      func MyHandler(w http.ResponseWriter, r *http.Request) {
          w.Write([]byte("Hello World"))
      }
      
      func main() {
          port := "8080"
      
          http.HandleFunc("/", MyHandler)
      
          done := make(chan bool)
          go http.ListenAndServe(":"+port, nil)
          log.Printf("Server started at port %v", port)
          <-done
      }
      

      这是一个更大的示例,让服务器验证它是否可以运行,分别使用ListenServe。这样做的好处是您可以轻松捕获错误的端口。

      package main
      
      import (
          "log"
          "net"
          "net/http"
          "os"
      )
      
      func MyHandler(w http.ResponseWriter, r *http.Request) {
          w.Write([]byte("Hello World"))
      }
      
      func main() {
          port := "8080"
      
          http.HandleFunc("/", MyHandler)
      
          listener, err := net.Listen("tcp", ":"+port)
          if err != nil {
              log.Fatal(err)
          }
      
          done := make(chan bool)
          go http.Serve(listener, nil)
      
          // Log server started
          log.Printf("Server started at port %v", port)
      
          // Attempt to connect
          log.Printf("Fetching...")
          res, err := http.Get("http://" + listener.Addr().String())
          log.Printf("Received: %v, %v", res, err)
          if err != nil {
              log.Fatal(err)
          }
          res.Write(os.Stdout)
      
          <-done
      }
      

      【讨论】:

        猜你喜欢
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 2013-12-25
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多