
termux 运行即可
Go
package main
import (
"log" // 1. 导入日志包
"net/http" // 2. 导入HTTP服务包
)
// 3. 主函数 - 程序入口点
func main() {
// 4. 创建文件服务器,服务当前目录
fs := http.FileServer(http.Dir("."))
// 5. 注册路由处理器,使用logRequest中间件包装
http.Handle("/", logRequest(fs))
// 6. 打印服务启动信息
log.Println("Listening on :8080 ...")
// 7. 启动HTTP服务器,监听8080端口
log.Fatal(http.ListenAndServe(":8080", nil))
}
// 8. logRequest 中间件函数 - 记录每个HTTP请求
// 包装下一个处理器,在请求完成后记录请求方法和路径
func logRequest(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 9. 创建自定义的ResponseWriter来捕获状态码
lrw := &loggingResponseWriter{ResponseWriter: w, statusCode: 200}
// 10. 调用下一个处理器
next.ServeHTTP(lrw, r)
// 11. 记录请求信息:方法、路径、状态码
log.Printf("%s %s %d", r.Method, r.URL.Path, lrw.statusCode)
})
}
// 12. loggingResponseWriter 结构体 - 自定义响应写入器
// 用于捕获HTTP响应的状态码
type loggingResponseWriter struct {
http.ResponseWriter // 13. 嵌入标准ResponseWriter
statusCode int // 14. 存储响应状态码
}
// 15. WriteHeader 方法 - 重写写入响应头的方法
// 在写入状态码时同时记录到结构体中
func (lrw *loggingResponseWriter) WriteHeader(code int) {
lrw.statusCode = code // 16. 保存状态码
lrw.ResponseWriter.WriteHeader(code) // 17. 调用原始方法
}