服务器启动时记录日志。

17

有没有办法在http服务器启动时打印一些信息?比如"服务器已经在8080端口开始运行"

在Node中(使用Express),可以这样实现:

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

这是我的代码:

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

谢谢。


4个回答

19

使用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调用将报告问题并退出程序。


9

要在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
}

9
在执行ListenAndServe之后,您无法打印日志消息,因为它会阻塞并且永远不会返回,因此您有两个主要选择:

  1. 仅打印“在端口上启动服务器...”,但是如果ListenAndServe无法启动,则会返回错误,因此除非由于该错误或紧急情况导致打印,否则可以假定服务器已启动。

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

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


0

或者在goroutine中运行日志命令:

    errStart := false
    go func() {
        time.Sleep(time.Second * 3)
        if !errStart {
            log.Info("Server is started at port 8080")
        }
    }()
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        errStart = true
        log.Error(...)
    }

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