Go语言 服务器启动时的日志

vxqlmq5t  于 10个月前  发布在  Go
关注(0)|答案(4)|浏览(113)

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)
}

谢谢.

p4rjhz4m

p4rjhz4m1#

你不能在ListenAndServe之后打印日志消息,因为它会阻塞并且永远不会返回,所以基本上你有两个主要的选择:
1.打印“Starting server on port....”,就是这样-但是如果ListenAndServe不能启动,它会返回一个错误,所以除非有一些错误或恐慌打印,因为这一点,你可以假设服务器启动。
1.在一个单独的goroutine中调用ListenAndServe,确保没有返回错误,并打印“Server started...”等。
我个人更喜欢第一种方法。

qoefvg9y

qoefvg9y2#

要像Not_a_Golfer提到的那样在goroutine中运行ListenAndServe,可以使用一个无缓冲的阻塞通道在goroutine中运行它,同时保持服务器的活动状态。
下面的示例创建了一个名为done的通道,其中<-done将在等待goroutine完成时保持服务器活动,而在本例中它不会完成。通常,goroutine会通过执行done <- true来告诉main函数它已经完成。

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
}
u91tlkcl

u91tlkcl3#

或者在goroutine中运行log命令:

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(...)
    }
elcex8rz

elcex8rz4#

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

相关问题