diff --git a/apps/cli/src/helpers/core/post-installation.ts b/apps/cli/src/helpers/core/post-installation.ts index a15bd1c28..671ef6dbd 100644 --- a/apps/cli/src/helpers/core/post-installation.ts +++ b/apps/cli/src/helpers/core/post-installation.ts @@ -811,6 +811,8 @@ function displayGoInstructions(config: ProjectConfig & { depsInstalled: boolean if (goLogging && goLogging !== "none") { const loggingNames: Record = { zap: "Zap", + zerolog: "Zerolog", + slog: "slog", }; output += `${pc.cyan("•")} Logging: ${loggingNames[goLogging] || goLogging}\n`; } diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts index 2d3dde32f..4f51f23b6 100644 --- a/apps/cli/src/index.ts +++ b/apps/cli/src/index.ts @@ -272,7 +272,7 @@ export const router = os.router({ goOrm: GoOrmSchema.optional().describe("Go ORM/database (gorm, sqlc)"), goApi: GoApiSchema.optional().describe("Go API layer (grpc-go)"), goCli: GoCliSchema.optional().describe("Go CLI tools (cobra, bubbletea)"), - goLogging: GoLoggingSchema.optional().describe("Go logging (zap)"), + goLogging: GoLoggingSchema.optional().describe("Go logging (zap, zerolog, slog)"), // AI documentation files aiDocs: z .array(AiDocsSchema) diff --git a/apps/cli/src/prompts/go-ecosystem.ts b/apps/cli/src/prompts/go-ecosystem.ts index 64957b292..9ff96ff10 100644 --- a/apps/cli/src/prompts/go-ecosystem.ts +++ b/apps/cli/src/prompts/go-ecosystem.ts @@ -145,6 +145,16 @@ export async function getGoLoggingChoice(goLogging?: GoLogging) { label: "Zap", hint: "Blazing fast, structured, leveled logging in Go", }, + { + value: "zerolog" as const, + label: "Zerolog", + hint: "Zero-allocation JSON logger, fastest in benchmarks", + }, + { + value: "slog" as const, + label: "slog", + hint: "Go 1.21+ stdlib structured logging (no external dependency)", + }, { value: "none" as const, label: "None", diff --git a/apps/cli/test/__snapshots__/template-snapshots.test.ts.snap b/apps/cli/test/__snapshots__/template-snapshots.test.ts.snap index e24def697..73c2428df 100644 --- a/apps/cli/test/__snapshots__/template-snapshots.test.ts.snap +++ b/apps/cli/test/__snapshots__/template-snapshots.test.ts.snap @@ -12879,6 +12879,36 @@ exports[`Template Snapshots - Go Ecosystem Go File Structure Snapshots file stru ] `; +exports[`Template Snapshots - Go Ecosystem Go File Structure Snapshots file structure: gin-gorm-zerolog 1`] = ` +[ + ".env.example", + "CLAUDE.md", + "README.md", + "cmd/server/main.go", + "go.mod", + "internal/database/database.go", + "internal/handlers/handlers.go", + "internal/models/models.go", +] +`; + +exports[`Template Snapshots - Go Ecosystem Go File Structure Snapshots file structure: echo-sqlc-slog 1`] = ` +[ + ".env.example", + "CLAUDE.md", + "README.md", + "cmd/server/main.go", + "go.mod", + "internal/database/database.go", + "internal/handlers/handlers.go", + "internal/models/models.go", + "sql/queries/posts.sql", + "sql/queries/users.sql", + "sql/schema/001_schema.sql", + "sqlc.yaml", +] +`; + exports[`Template Snapshots - Go Ecosystem Go Key File Content Snapshots key files: gin-gorm-zap 1`] = ` { "fileCount": 9, @@ -13173,6 +13203,130 @@ LOG_LEVEL=debug } `; +exports[`Template Snapshots - Go Ecosystem Go Key File Content Snapshots key files: gin-gorm-zerolog 1`] = ` +{ + "fileCount": 9, + "files": [ + { + "content": +"# Application settings +HOST=0.0.0.0 +PORT=8080 + +# Database settings (if using GORM or sqlc) +DATABASE_URL=postgres://user:password@localhost:5432/dbname?sslmode=disable + +# gRPC settings (if using gRPC) +GRPC_PORT=50051 + +# Logging level +LOG_LEVEL=debug +" +, + "path": ".env.example", + }, + { + "content": "[exists]", + "path": "CLAUDE.md", + }, + { + "content": "[exists]", + "path": "cmd/server/main.go", + }, + { + "content": "[exists]", + "path": "go.mod", + }, + { + "content": "[exists]", + "path": "internal/database/database.go", + }, + { + "content": "[exists]", + "path": "internal/handlers/handlers.go", + }, + { + "content": "[exists]", + "path": "internal/models/models.go", + }, + { + "content": "[exists]", + "path": "README.md", + }, + ], +} +`; + +exports[`Template Snapshots - Go Ecosystem Go Key File Content Snapshots key files: echo-sqlc-slog 1`] = ` +{ + "fileCount": 13, + "files": [ + { + "content": +"# Application settings +HOST=0.0.0.0 +PORT=8080 + +# Database settings (if using GORM or sqlc) +DATABASE_URL=postgres://user:password@localhost:5432/dbname?sslmode=disable + +# gRPC settings (if using gRPC) +GRPC_PORT=50051 + +# Logging level +LOG_LEVEL=debug +" +, + "path": ".env.example", + }, + { + "content": "[exists]", + "path": "CLAUDE.md", + }, + { + "content": "[exists]", + "path": "cmd/server/main.go", + }, + { + "content": "[exists]", + "path": "go.mod", + }, + { + "content": "[exists]", + "path": "internal/database/database.go", + }, + { + "content": "[exists]", + "path": "internal/handlers/handlers.go", + }, + { + "content": "[exists]", + "path": "internal/models/models.go", + }, + { + "content": "[exists]", + "path": "README.md", + }, + { + "content": "[exists]", + "path": "sql/queries/posts.sql", + }, + { + "content": "[exists]", + "path": "sql/queries/users.sql", + }, + { + "content": "[exists]", + "path": "sql/schema/001_schema.sql", + }, + { + "content": "[exists]", + "path": "sqlc.yaml", + }, + ], +} +`; + exports[`Template Snapshots - Python Ecosystem Python File Structure Snapshots file structure: fastapi-sqlalchemy-celery 1`] = ` [ ".env.example", diff --git a/apps/cli/test/go-language.test.ts b/apps/cli/test/go-language.test.ts index f0c68c043..61f80553a 100644 --- a/apps/cli/test/go-language.test.ts +++ b/apps/cli/test/go-language.test.ts @@ -105,6 +105,8 @@ describe("Go Language Support", () => { it("should have go logging options", () => { expect(GO_LOGGINGS).toContain("zap"); + expect(GO_LOGGINGS).toContain("zerolog"); + expect(GO_LOGGINGS).toContain("slog"); expect(GO_LOGGINGS).toContain("none"); }); }); @@ -1258,6 +1260,95 @@ describe("Go Language Support", () => { }); }); + describe("Zerolog Logging Integration", () => { + it("should include Zerolog dependencies when selected", async () => { + const result = await createVirtual({ + projectName: "go-zerolog-project", + ecosystem: "go", + goWebFramework: "gin", + goOrm: "none", + goApi: "none", + goCli: "none", + goLogging: "zerolog", + }); + + expect(result.success).toBe(true); + const root = result.tree!.root; + + const goModContent = getFileContent(root, "go.mod"); + expect(goModContent).toBeDefined(); + expect(goModContent).toContain("github.com/rs/zerolog"); + }); + + it("should include Zerolog logger initialization in main.go", async () => { + const result = await createVirtual({ + projectName: "go-zerolog-main-check", + ecosystem: "go", + goWebFramework: "gin", + goOrm: "none", + goApi: "none", + goCli: "none", + goLogging: "zerolog", + }); + + expect(result.success).toBe(true); + const root = result.tree!.root; + + const mainContent = getFileContent(root, "cmd/server/main.go"); + expect(mainContent).toBeDefined(); + expect(mainContent).toContain("github.com/rs/zerolog"); + expect(mainContent).toContain("var logger zerolog.Logger"); + expect(mainContent).toContain("func initLogger()"); + expect(mainContent).toContain("logger.Info()"); + }); + }); + + describe("slog Logging Integration", () => { + it("should NOT include external slog dependencies in go.mod", async () => { + const result = await createVirtual({ + projectName: "go-stdlib-log-project", + ecosystem: "go", + goWebFramework: "gin", + goOrm: "none", + goApi: "none", + goCli: "none", + goLogging: "slog", + }); + + expect(result.success).toBe(true); + const root = result.tree!.root; + + const goModContent = getFileContent(root, "go.mod"); + expect(goModContent).toBeDefined(); + // slog is stdlib - should not appear in require block + const requireBlock = goModContent!.split("require (")[1]?.split(")")[0] ?? ""; + expect(requireBlock).not.toContain("slog"); + }); + + it("should include slog logger initialization in main.go", async () => { + const result = await createVirtual({ + projectName: "go-slog-main-check", + ecosystem: "go", + goWebFramework: "gin", + goOrm: "none", + goApi: "none", + goCli: "none", + goLogging: "slog", + }); + + expect(result.success).toBe(true); + const root = result.tree!.root; + + const mainContent = getFileContent(root, "cmd/server/main.go"); + expect(mainContent).toBeDefined(); + expect(mainContent).toContain("\"log/slog\""); + expect(mainContent).toContain("var logger *slog.Logger"); + expect(mainContent).toContain("func initLogger()"); + expect(mainContent).toContain("slog.SetDefault(logger)"); + expect(mainContent).toContain("logger.Info("); + }); + }); + describe("Combined Integration Scenarios", () => { it("should generate full-stack Go project with Gin + GORM + Zap", async () => { const result = await createVirtual({ diff --git a/apps/cli/test/template-snapshots.test.ts b/apps/cli/test/template-snapshots.test.ts index fcba642d5..2b754058e 100644 --- a/apps/cli/test/template-snapshots.test.ts +++ b/apps/cli/test/template-snapshots.test.ts @@ -421,6 +421,28 @@ describe("Template Snapshots - Go Ecosystem", () => { goLogging: "none" as const, }, }, + { + name: "gin-gorm-zerolog", + config: { + ecosystem: "go" as const, + goWebFramework: "gin" as const, + goOrm: "gorm" as const, + goApi: "none" as const, + goCli: "none" as const, + goLogging: "zerolog" as const, + }, + }, + { + name: "echo-sqlc-slog", + config: { + ecosystem: "go" as const, + goWebFramework: "echo" as const, + goOrm: "sqlc" as const, + goApi: "none" as const, + goCli: "none" as const, + goLogging: "slog" as const, + }, + }, ]; describe("Go File Structure Snapshots", () => { diff --git a/apps/web/src/lib/constant.ts b/apps/web/src/lib/constant.ts index b17f8a1b8..d8fdf195b 100644 --- a/apps/web/src/lib/constant.ts +++ b/apps/web/src/lib/constant.ts @@ -3109,6 +3109,22 @@ export const TECH_OPTIONS: Record< color: "from-yellow-500 to-amber-600", default: true, }, + { + id: "zerolog", + name: "Zerolog", + description: "Zero-allocation JSON logger, fastest in benchmarks", + icon: "", + color: "from-blue-500 to-indigo-600", + default: false, + }, + { + id: "slog", + name: "slog", + description: "Go 1.21+ stdlib structured logging, no external dependency", + icon: "", + color: "from-cyan-500 to-teal-600", + default: false, + }, { id: "none", name: "No Logging Library", diff --git a/apps/web/src/lib/tech-resource-links.ts b/apps/web/src/lib/tech-resource-links.ts index 1a9689275..e820a80df 100644 --- a/apps/web/src/lib/tech-resource-links.ts +++ b/apps/web/src/lib/tech-resource-links.ts @@ -757,6 +757,14 @@ const BASE_LINKS: LinkMap = { docsUrl: "https://pkg.go.dev/go.uber.org/zap", githubUrl: "https://github.com/uber-go/zap", }, + zerolog: { + docsUrl: "https://pkg.go.dev/github.com/rs/zerolog", + githubUrl: "https://github.com/rs/zerolog", + }, + slog: { + docsUrl: "https://pkg.go.dev/log/slog", + githubUrl: "https://github.com/golang/go", + }, }; const CATEGORY_LINKS: LinkMap = { diff --git a/packages/template-generator/src/processors/readme-generator.ts b/packages/template-generator/src/processors/readme-generator.ts index b9783cf53..d66bd1dc8 100644 --- a/packages/template-generator/src/processors/readme-generator.ts +++ b/packages/template-generator/src/processors/readme-generator.ts @@ -1261,6 +1261,10 @@ function generateGoReadmeContent(config: ProjectConfig): string { // Logging if (goLogging === "zap") { features.push("- **Zap** - Blazing fast, structured logging"); + } else if (goLogging === "zerolog") { + features.push("- **Zerolog** - Zero-allocation JSON logger"); + } else if (goLogging === "slog") { + features.push("- **slog** - Go stdlib structured logging"); } if (auth === "go-better-auth") { diff --git a/packages/template-generator/templates/go-base/cmd/server/main.go.hbs b/packages/template-generator/templates/go-base/cmd/server/main.go.hbs index 78ccf701d..bf033d2be 100644 --- a/packages/template-generator/templates/go-base/cmd/server/main.go.hbs +++ b/packages/template-generator/templates/go-base/cmd/server/main.go.hbs @@ -1,7 +1,7 @@ package main import ( -{{#if (or (or (or (or (or (eq goWebFramework "gin") (eq goWebFramework "echo")) (eq goWebFramework "fiber")) (eq goWebFramework "chi")) (eq goApi "grpc-go")) (or (eq auth "go-better-auth") (eq goLogging "zap")))}} +{{#if (or (or (or (or (or (eq goWebFramework "gin") (eq goWebFramework "echo")) (eq goWebFramework "fiber")) (eq goWebFramework "chi")) (eq goApi "grpc-go")) (or (eq auth "go-better-auth") (ne goLogging "none")))}} "os" {{/if}} {{#if (or (or (or (eq goWebFramework "gin") (eq goWebFramework "echo")) (eq goWebFramework "chi")) (and (eq auth "go-better-auth") (not (eq goWebFramework "fiber"))))}} @@ -41,6 +41,13 @@ import ( {{#if (eq goLogging "zap")}} "go.uber.org/zap" +{{/if}} +{{#if (eq goLogging "zerolog")}} + + "github.com/rs/zerolog" +{{/if}} +{{#if (eq goLogging "slog")}} + "log/slog" {{/if}} "github.com/joho/godotenv" {{#if (eq goApi "grpc-go")}} @@ -68,6 +75,31 @@ func initLogger() { } } {{/if}} +{{#if (eq goLogging "zerolog")}} +var logger zerolog.Logger + +func initLogger() { + logLevel := os.Getenv("LOG_LEVEL") + if logLevel == "production" { + logger = zerolog.New(os.Stdout).With().Timestamp().Logger() + } else { + logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).With().Timestamp().Logger() + } +} +{{/if}} +{{#if (eq goLogging "slog")}} +var logger *slog.Logger + +func initLogger() { + logLevel := os.Getenv("LOG_LEVEL") + if logLevel == "production" { + logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) + } else { + logger = slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelDebug})) + } + slog.SetDefault(logger) +} +{{/if}} func main() { // Load environment variables @@ -80,12 +112,30 @@ func main() { logger.Info("Starting {{projectName}} server") {{/if}} +{{#if (eq goLogging "zerolog")}} + // Initialize logger + initLogger() + + logger.Info().Msg("Starting {{projectName}} server") +{{/if}} +{{#if (eq goLogging "slog")}} + // Initialize logger + initLogger() + + logger.Info("Starting {{projectName}} server") +{{/if}} {{#if (eq auth "go-better-auth")}} authApp := appauth.New() {{#if (eq goLogging "zap")}} logger.Info("GoBetterAuth initialized") {{/if}} +{{#if (eq goLogging "zerolog")}} + logger.Info().Msg("GoBetterAuth initialized") +{{/if}} +{{#if (eq goLogging "slog")}} + logger.Info("GoBetterAuth initialized") +{{/if}} {{/if}} {{#if (eq goOrm "gorm")}} @@ -94,12 +144,23 @@ func main() { if err != nil { {{#if (eq goLogging "zap")}} logger.Fatal("Failed to connect to database", zap.Error(err)) +{{else if (eq goLogging "zerolog")}} + logger.Fatal().Err(err).Msg("Failed to connect to database") +{{else if (eq goLogging "slog")}} + logger.Error("Failed to connect to database", "error", err) + os.Exit(1) {{else}} panic("Failed to connect to database: " + err.Error()) {{/if}} } {{#if (eq goLogging "zap")}} logger.Info("Database connected successfully") +{{/if}} +{{#if (eq goLogging "zerolog")}} + logger.Info().Msg("Database connected successfully") +{{/if}} +{{#if (eq goLogging "slog")}} + logger.Info("Database connected successfully") {{/if}} _ = db // Use db in your handlers {{/if}} @@ -109,6 +170,11 @@ func main() { if err != nil { {{#if (eq goLogging "zap")}} logger.Fatal("Failed to connect to database", zap.Error(err)) +{{else if (eq goLogging "zerolog")}} + logger.Fatal().Err(err).Msg("Failed to connect to database") +{{else if (eq goLogging "slog")}} + logger.Error("Failed to connect to database", "error", err) + os.Exit(1) {{else}} panic("Failed to connect to database: " + err.Error()) {{/if}} @@ -116,6 +182,12 @@ func main() { defer database.Close() {{#if (eq goLogging "zap")}} logger.Info("Database pool connected successfully") +{{/if}} +{{#if (eq goLogging "zerolog")}} + logger.Info().Msg("Database pool connected successfully") +{{/if}} +{{#if (eq goLogging "slog")}} + logger.Info("Database pool connected successfully") {{/if}} _ = pool // Use pool in your handlers {{/if}} @@ -152,11 +224,22 @@ func main() { {{#if (eq goLogging "zap")}} logger.Info("Starting gRPC server", zap.String("address", grpcAddr)) {{/if}} +{{#if (eq goLogging "zerolog")}} + logger.Info().Str("address", grpcAddr).Msg("Starting gRPC server") +{{/if}} +{{#if (eq goLogging "slog")}} + logger.Info("Starting gRPC server", "address", grpcAddr) +{{/if}} lis, err := net.Listen("tcp", grpcAddr) if err != nil { {{#if (eq goLogging "zap")}} logger.Fatal("Failed to listen for gRPC", zap.Error(err)) +{{else if (eq goLogging "zerolog")}} + logger.Fatal().Err(err).Msg("Failed to listen for gRPC") +{{else if (eq goLogging "slog")}} + logger.Error("Failed to listen for gRPC", "error", err) + os.Exit(1) {{else}} panic("Failed to listen for gRPC: " + err.Error()) {{/if}} @@ -167,6 +250,11 @@ func main() { if err := grpcServer.Serve(lis); err != nil { {{#if (eq goLogging "zap")}} logger.Fatal("Failed to serve gRPC", zap.Error(err)) +{{else if (eq goLogging "zerolog")}} + logger.Fatal().Err(err).Msg("Failed to serve gRPC") +{{else if (eq goLogging "slog")}} + logger.Error("Failed to serve gRPC", "error", err) + os.Exit(1) {{else}} panic("Failed to serve gRPC: " + err.Error()) {{/if}} @@ -181,6 +269,12 @@ func main() { {{#if (eq goLogging "zap")}} logger.Info("Starting HTTP server", zap.String("address", addr)) {{/if}} +{{#if (eq goLogging "zerolog")}} + logger.Info().Str("address", addr).Msg("Starting HTTP server") +{{/if}} +{{#if (eq goLogging "slog")}} + logger.Info("Starting HTTP server", "address", addr) +{{/if}} // Create Gin router r := gin.Default() @@ -209,6 +303,11 @@ func main() { if err := r.Run(addr); err != nil { {{#if (eq goLogging "zap")}} logger.Fatal("Failed to start server", zap.Error(err)) +{{else if (eq goLogging "zerolog")}} + logger.Fatal().Err(err).Msg("Failed to start server") +{{else if (eq goLogging "slog")}} + logger.Error("Failed to start server", "error", err) + os.Exit(1) {{else}} panic("Failed to start server: " + err.Error()) {{/if}} @@ -218,6 +317,12 @@ func main() { {{#if (eq goLogging "zap")}} logger.Info("Starting HTTP server", zap.String("address", addr)) {{/if}} +{{#if (eq goLogging "zerolog")}} + logger.Info().Str("address", addr).Msg("Starting HTTP server") +{{/if}} +{{#if (eq goLogging "slog")}} + logger.Info("Starting HTTP server", "address", addr) +{{/if}} // Create Echo instance e := echo.New() @@ -251,6 +356,11 @@ func main() { if err := e.Start(addr); err != nil && err != http.ErrServerClosed { {{#if (eq goLogging "zap")}} logger.Fatal("Failed to start server", zap.Error(err)) +{{else if (eq goLogging "zerolog")}} + logger.Fatal().Err(err).Msg("Failed to start server") +{{else if (eq goLogging "slog")}} + logger.Error("Failed to start server", "error", err) + os.Exit(1) {{else}} panic("Failed to start server: " + err.Error()) {{/if}} @@ -260,6 +370,12 @@ func main() { {{#if (eq goLogging "zap")}} logger.Info("Starting HTTP server", zap.String("address", addr)) {{/if}} +{{#if (eq goLogging "zerolog")}} + logger.Info().Str("address", addr).Msg("Starting HTTP server") +{{/if}} +{{#if (eq goLogging "slog")}} + logger.Info("Starting HTTP server", "address", addr) +{{/if}} // Create Fiber app app := fiber.New() @@ -293,6 +409,11 @@ func main() { if err := app.Listen(addr); err != nil { {{#if (eq goLogging "zap")}} logger.Fatal("Failed to start server", zap.Error(err)) +{{else if (eq goLogging "zerolog")}} + logger.Fatal().Err(err).Msg("Failed to start server") +{{else if (eq goLogging "slog")}} + logger.Error("Failed to start server", "error", err) + os.Exit(1) {{else}} panic("Failed to start server: " + err.Error()) {{/if}} @@ -302,6 +423,12 @@ func main() { {{#if (eq goLogging "zap")}} logger.Info("Starting HTTP server", zap.String("address", addr)) {{/if}} +{{#if (eq goLogging "zerolog")}} + logger.Info().Str("address", addr).Msg("Starting HTTP server") +{{/if}} +{{#if (eq goLogging "slog")}} + logger.Info("Starting HTTP server", "address", addr) +{{/if}} // Create Chi router r := chi.NewRouter() @@ -338,6 +465,11 @@ func main() { if err := http.ListenAndServe(addr, r); err != nil && err != http.ErrServerClosed { {{#if (eq goLogging "zap")}} logger.Fatal("Failed to start server", zap.Error(err)) +{{else if (eq goLogging "zerolog")}} + logger.Fatal().Err(err).Msg("Failed to start server") +{{else if (eq goLogging "slog")}} + logger.Error("Failed to start server", "error", err) + os.Exit(1) {{else}} panic("Failed to start server: " + err.Error()) {{/if}} @@ -348,6 +480,12 @@ func main() { {{#if (eq goLogging "zap")}} logger.Info("Starting HTTP server", zap.String("address", addr)) {{/if}} +{{#if (eq goLogging "zerolog")}} + logger.Info().Str("address", addr).Msg("Starting HTTP server") +{{/if}} +{{#if (eq goLogging "slog")}} + logger.Info("Starting HTTP server", "address", addr) +{{/if}} mux := http.NewServeMux() mux.Handle("/api/auth", authApp.Handler()) @@ -376,6 +514,11 @@ func main() { if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { {{#if (eq goLogging "zap")}} logger.Fatal("Failed to start server", zap.Error(err)) +{{else if (eq goLogging "zerolog")}} + logger.Fatal().Err(err).Msg("Failed to start server") +{{else if (eq goLogging "slog")}} + logger.Error("Failed to start server", "error", err) + os.Exit(1) {{else}} panic("Failed to start server: " + err.Error()) {{/if}} @@ -384,6 +527,12 @@ func main() { {{#if (eq goLogging "zap")}} logger.Info("{{projectName}} started") logger.Info("Add a web framework (gin, echo, fiber, or chi) to start building your API") +{{else if (eq goLogging "zerolog")}} + logger.Info().Msg("{{projectName}} started") + logger.Info().Msg("Add a web framework (gin, echo, fiber, or chi) to start building your API") +{{else if (eq goLogging "slog")}} + logger.Info("{{projectName}} started") + logger.Info("Add a web framework (gin, echo, fiber, or chi) to start building your API") {{else}} println("{{projectName}} started") println("Add a web framework (gin, echo, fiber, or chi) to start building your API") diff --git a/packages/template-generator/templates/go-base/go.mod.hbs b/packages/template-generator/templates/go-base/go.mod.hbs index f6b68fad9..6f4a4d516 100644 --- a/packages/template-generator/templates/go-base/go.mod.hbs +++ b/packages/template-generator/templates/go-base/go.mod.hbs @@ -42,6 +42,9 @@ require ( {{/if}} {{#if (eq goLogging "zap")}} go.uber.org/zap v1.27.1 +{{/if}} +{{#if (eq goLogging "zerolog")}} + github.com/rs/zerolog v1.34.0 {{/if}} github.com/joho/godotenv v1.5.1 ) diff --git a/packages/types/src/option-metadata.ts b/packages/types/src/option-metadata.ts index c88fd9552..c915bae82 100644 --- a/packages/types/src/option-metadata.ts +++ b/packages/types/src/option-metadata.ts @@ -609,6 +609,8 @@ const EXACT_LABEL_OVERRIDES: Partial