golang HTTP 服务器 处理 日志/Stream流的操作

  • Post category:Linux

要实现一个golang HTTP服务器处理日志/Stream流,我们需要遵循以下步骤:

第一步:导入所需要的库

import (
    "log"
    "net/http"
)

第二步:编写日志处理函数

func LogHandler(w http.ResponseWriter, r *http.Request) {
    // 打印请求信息
    log.Printf("[%s] %q %s %s", r.Method, r.URL.String(), r.Proto, r.RemoteAddr)

    // 处理请求
    // TODO: 处理请求

    // 返回响应
    w.Write([]byte("<h1>Hello, World!</h1>"))
}

在这个处理函数中,我们首先使用log包打印请求信息,然后处理请求,最后返回响应。

第三步:创建HTTP服务器

func main() {
    http.HandleFunc("/", LogHandler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatalln("Failed to start server:", err)
    }
}

在这个main函数中,我们首先使用http.HandleFunc函数将LogHandler函数注册为处理路由为“/”的请求的处理函数。然后使用http.ListenAndServe函数创建HTTP服务器,并指定监听的端口为8080。如果创建服务器出错,我们使用log包将错误信息输出并退出程序。

以上三步就是golang HTTP服务器处理日志/Stream流的操作基本过程,接下来给出两个示例。

示例一:向控制台输出日志

func LogHandler(w http.ResponseWriter, r *http.Request) {
    // 打印请求信息
    log.Printf("[%s] %q %s %s", r.Method, r.URL.String(), r.Proto, r.RemoteAddr)

    // 处理请求
    // TODO: 处理请求

    // 返回响应
    w.Write([]byte("<h1>Hello, World!</h1>"))
}

func main() {
    http.HandleFunc("/", LogHandler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatalln("Failed to start server:", err)
    }
}

在这个示例中,我们使用log包直接向控制台输出日志。

示例二:将日志写入文件

func LogHandler(w http.ResponseWriter, r *http.Request) {
    // 打印请求信息
    log.Printf("[%s] %q %s %s", r.Method, r.URL.String(), r.Proto, r.RemoteAddr)

    // 处理请求
    // TODO: 处理请求

    // 返回响应
    w.Write([]byte("<h1>Hello, World!</h1>"))
}

func main() {
    file, err := os.OpenFile("access.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
    if err != nil {
        log.Fatalln("Failed to open log file:", err)
    }
    defer file.Close()
    log.SetOutput(file)

    http.HandleFunc("/", LogHandler)
    err = http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatalln("Failed to start server:", err)
    }
}

在这个示例中,我们使用os包打开文件access.log,并将log包的输出重定向到这个文件。这样,所有的日志都会写入文件中,而不是直接输出到控制台。同时,我们使用defer关键字在main函数退出之前关闭log文件。