diff --git a/README.md b/README.md index f7b917f..964eb5c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,16 @@ ## todo +日志格式自定义转换 + 客户端断开后端口未释放问题 +需要压测 + ProxyConn 直接实现 Conn 相同的接口,不再取出 Conn 使用 配置退出等待时间 -log 控制台颜色,输出错误堆栈 +输出错误堆栈 读取 conn 时加上超时机制 @@ -18,9 +22,11 @@ log 控制台颜色,输出错误堆栈 在控制通道直接传输目标地址,客户端可以同时开始数据通道和目标地址的连接建立 +检查退出超时的问题 + ### 长期 -退出顺序好像有问题,需要检查 +需要测试,考虑是否切换到 gnet 实现一个 socks context 以在子组件中获取 socks 相关信息 diff --git a/cmd/server/.env.example b/cmd/server/.env.example index 3055361..4d63cd8 100644 --- a/cmd/server/.env.example +++ b/cmd/server/.env.example @@ -1,6 +1,7 @@ # 应用配置 APP_CTRL_PORT=18080 APP_DATA_PORT=18081 +APP_LOG_MODE=dev# dev | test # 数据库配置 DB_HOST=localhost diff --git a/config/test/docker-compose.yaml b/config/test/docker-compose.yaml index fe9e9ce..314cc58 100644 --- a/config/test/docker-compose.yaml +++ b/config/test/docker-compose.yaml @@ -25,6 +25,7 @@ services: environment: APP_CTRL_PORT: $APP_CTRL_PORT APP_DATA_PORT: $APP_DATA_PORT + APP_LOG_MODE: $APP_LOG_MODE DB_HOST: $DB_HOST DB_PORT: $DB_PORT DB_DATABASE: $DB_DATABASE @@ -50,7 +51,6 @@ services: - "8686:8686" volumes: - /var/run/docker.sock:/var/run/docker.sock - - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/log/vector:/temp/vector networks: - proxy-server-test diff --git a/config/test/vector/vector.toml b/config/test/vector/vector.toml index 6416dbd..8102654 100644 --- a/config/test/vector/vector.toml +++ b/config/test/vector/vector.toml @@ -1,3 +1,5 @@ +timezone = "Asia/Shanghai" + [api] enabled = true address = "0.0.0.0:8686" @@ -11,6 +13,11 @@ inputs = ["docker"] type = "remap" source = ''' . = parse_json!(.message) +.time, err = format_timestamp(parse_timestamp!(.time, "%+"), "%Y-%m-%dT%H:%M:%S", "Asia/Shanghai") +if err != null { + log("Unable to parse JSON: " + err, level: "error") + abort +} ''' # =============== diff --git a/server/pkg/env/env.go b/server/pkg/env/env.go index 9b3f36f..f11514d 100644 --- a/server/pkg/env/env.go +++ b/server/pkg/env/env.go @@ -12,6 +12,7 @@ import ( var ( AppCtrlPort uint16 AppDataPort uint16 + AppLogMode string DbHost string DbPort uint16 @@ -29,6 +30,7 @@ func Init() { slog.Debug("没有本地环境变量文件") } + // AppCtrlPort appCtrlPortStr := os.Getenv("APP_CTRL_PORT") if appCtrlPortStr == "" { panic("环境变量 APP_CTRL_PORT 未设置") @@ -39,6 +41,7 @@ func Init() { } AppCtrlPort = uint16(appCtrlPort) + // AppDataPort appDataPortStr := os.Getenv("APP_DATA_PORT") if appDataPortStr == "" { panic("环境变量 APP_DATA_PORT 未设置") @@ -49,11 +52,19 @@ func Init() { } AppDataPort = uint16(appDataPort) + // AppLogMode + appLogMode := os.Getenv("APP_LOG_MODE") + if appLogMode == "" { + AppLogMode = "dev" + } + + // DbHost DbHost = os.Getenv("DB_HOST") if DbHost == "" { panic("环境变量 DB_HOST 未设置") } + // DbPort dbPortStr := os.Getenv("DB_PORT") if dbPortStr == "" { dbPortStr = "5432" @@ -64,21 +75,25 @@ func Init() { } DbPort = uint16(dbPort) + // DbDatabase DbDatabase = os.Getenv("DB_DATABASE") if DbDatabase == "" { panic("环境变量 DB_DATABASE 未设置") } + // DbUsername DbUsername = os.Getenv("DB_USERNAME") if DbUsername == "" { panic("环境变量 DB_USERNAME 未设置") } + // DbPassword DbPassword = os.Getenv("DB_PASSWORD") if DbPassword == "" { panic("环境变量 DB_PASSWORD 未设置") } + // DbTimezone DbTimezone = os.Getenv("DB_TIMEZONE") if DbTimezone == "" { DbTimezone = "Asia/Shanghai" diff --git a/server/server.go b/server/server.go index 260076d..ef95183 100644 --- a/server/server.go +++ b/server/server.go @@ -12,6 +12,9 @@ import ( "sync" "syscall" "time" + + "github.com/lmittmann/tint" + "github.com/mattn/go-colorable" ) type Context struct { @@ -75,23 +78,25 @@ func Start() { } func initLog() { - // writer := colorable.NewColorable(os.Stdout) - // logger := slog.New(tint.NewHandler(writer, &tint.Options{ - // Level: slog.LevelDebug, - // TimeFormat: time.RFC3339, - // ReplaceAttr: func(_ []string, attr slog.Attr) slog.Attr { - // err, ok := attr.Value.Any().(error) - // if !ok { - // return attr - // } - // return tint.Err(err) - // }, - // })) - // slog.SetDefault(logger) - handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ - Level: slog.LevelDebug, - }) - slog.SetDefault(slog.New(handler)) + switch env.AppLogMode { + case "dev": + writer := colorable.NewColorable(os.Stdout) + logger := slog.New(tint.NewHandler(writer, &tint.Options{ + Level: slog.LevelDebug, + TimeFormat: time.RFC3339, + ReplaceAttr: func(_ []string, attr slog.Attr) slog.Attr { + err, ok := attr.Value.Any().(error) + if ok { + return tint.Err(err) + } + return attr + }, + })) + slog.SetDefault(logger) + case "test": + logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{})) + slog.SetDefault(logger) + } } func startFwdServer(ctx context.Context) error {