使用 fasthttp 替代 net/http,实现 Phase 2 核心模块: - HTTP 服务器:fasthttp.Server 配置超时和连接限制 - 路由系统:fasthttp/router 基于 radix tree 匹配 - 静态文件服务:安全检查、索引文件支持 - 日志系统:zerolog 结构化日志 - 中间件框架:链式组合接口 - 虚拟主机管理:按 Host 头选择处理器 Co-Authored-By: Claude <noreply@anthropic.com>
49 lines
1.1 KiB
Go
49 lines
1.1 KiB
Go
package logging
|
|
|
|
import (
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/rs/zerolog"
|
|
"github.com/valyala/fasthttp"
|
|
)
|
|
|
|
var log zerolog.Logger
|
|
|
|
// Init 初始化日志系统
|
|
func Init(level string, pretty bool) {
|
|
l := parseLevel(level)
|
|
if pretty {
|
|
log = zerolog.New(zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339}).Level(l).With().Timestamp().Logger()
|
|
} else {
|
|
log = zerolog.New(os.Stdout).Level(l).With().Timestamp().Logger()
|
|
}
|
|
}
|
|
|
|
// LogAccess 记录访问日志
|
|
func LogAccess(ctx *fasthttp.RequestCtx, status int, size int64, duration time.Duration) {
|
|
log.Info().
|
|
Str("method", string(ctx.Method())).
|
|
Str("path", string(ctx.Path())).
|
|
Int("status", status).
|
|
Int64("size", size).
|
|
Dur("duration", duration).
|
|
Str("remote_addr", ctx.RemoteAddr().String()).
|
|
Msg("request")
|
|
}
|
|
|
|
// parseLevel 解析日志级别
|
|
func parseLevel(level string) zerolog.Level {
|
|
switch level {
|
|
case "debug":
|
|
return zerolog.DebugLevel
|
|
case "info":
|
|
return zerolog.InfoLevel
|
|
case "warn":
|
|
return zerolog.WarnLevel
|
|
case "error":
|
|
return zerolog.ErrorLevel
|
|
default:
|
|
return zerolog.InfoLevel
|
|
}
|
|
} |