要实现一个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文件。