{"id":27880864,"url":"https://github.com/atomicgo/splitslog","last_synced_at":"2025-05-05T04:38:58.935Z","repository":{"id":193288820,"uuid":"688502554","full_name":"atomicgo/splitslog","owner":"atomicgo","description":"䷖ Slog handler that maps different handlers to different log levels","archived":false,"fork":false,"pushed_at":"2024-08-08T17:04:38.000Z","size":37,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-17T02:18:40.924Z","etag":null,"topics":["atomicgo","go","golang","golang-library"],"latest_commit_sha":null,"homepage":"https://atomicgo.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/atomicgo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["MarvinJWendt"]}},"created_at":"2023-09-07T13:32:03.000Z","updated_at":"2024-08-08T17:04:42.000Z","dependencies_parsed_at":"2024-06-21T02:32:49.634Z","dependency_job_id":"357679fb-1539-4c32-9b97-23c069c4185e","html_url":"https://github.com/atomicgo/splitslog","commit_stats":null,"previous_names":["atomicgo/splitslog"],"tags_count":3,"template":false,"template_full_name":"atomicgo/template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fsplitslog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fsplitslog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fsplitslog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fsplitslog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/atomicgo","download_url":"https://codeload.github.com/atomicgo/splitslog/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252442480,"owners_count":21748448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["atomicgo","go","golang","golang-library"],"created_at":"2025-05-05T04:38:58.250Z","updated_at":"2025-05-05T04:38:58.929Z","avatar_url":"https://github.com/atomicgo.png","language":"Go","funding_links":["https://github.com/sponsors/MarvinJWendt"],"categories":[],"sub_categories":[],"readme":"\u003c!--\n\n\n\n┌───────────────────────────────────────────────────────────────────┐\n│                                                                   │\n│                          IMPORTANT NOTE                           │\n│                                                                   │\n│               This file is automatically generated                │\n│           All manual modifications will be overwritten            │\n│                                                                   │\n└───────────────────────────────────────────────────────────────────┘\n\n\n\n--\u003e\n\n\u003ch1 align=\"center\"\u003eAtomicGo | splitslog\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Fatomicgo.dev%2Fapi%2Fshields%2Fsplitslog\u0026style=flat-square\" alt=\"Downloads\"\u003e\n\n\u003ca href=\"https://github.com/atomicgo/splitslog/releases\"\u003e\n\u003cimg src=\"https://img.shields.io/github/v/release/atomicgo/splitslog?style=flat-square\" alt=\"Latest Release\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://codecov.io/gh/atomicgo/splitslog\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/atomicgo/splitslog/go.yml?style=flat-square\" alt=\"Tests\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://codecov.io/gh/atomicgo/splitslog\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/codecov/c/gh/atomicgo/splitslog?color=magenta\u0026logo=codecov\u0026style=flat-square\" alt=\"Coverage\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://codecov.io/gh/atomicgo/splitslog\"\u003e\n\u003c!-- unittestcount:start --\u003e\u003cimg src=\"https://img.shields.io/badge/Unit_Tests-1-magenta?style=flat-square\" alt=\"Unit test count\"\u003e\u003c!-- unittestcount:end --\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://opensource.org/licenses/MIT\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square\" alt=\"License: MIT\"\u003e\n\u003c/a\u003e\n  \n\u003ca href=\"https://goreportcard.com/report/github.com/atomicgo/splitslog\" target=\"_blank\"\u003e\n\u003cimg src=\"https://goreportcard.com/badge/github.com/atomicgo/splitslog?style=flat-square\" alt=\"Go report\"\u003e\n\u003c/a\u003e   \n\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n\u003cstrong\u003e\u003ca href=\"https://pkg.go.dev/atomicgo.dev/splitslog#section-documentation\" target=\"_blank\"\u003eDocumentation\u003c/a\u003e\u003c/strong\u003e\n|\n\u003cstrong\u003e\u003ca href=\"https://github.com/atomicgo/atomicgo/blob/main/CONTRIBUTING.md\" target=\"_blank\"\u003eContributing\u003c/a\u003e\u003c/strong\u003e\n|\n\u003cstrong\u003e\u003ca href=\"https://github.com/atomicgo/atomicgo/blob/main/CODE_OF_CONDUCT.md\" target=\"_blank\"\u003eCode of Conduct\u003c/a\u003e\u003c/strong\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/atomicgo/atomicgo/main/assets/header.png\" alt=\"AtomicGo\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/p\u003e\n\u003ch3  align=\"center\"\u003e\u003cpre\u003ego get atomicgo.dev/splitslog\u003c/pre\u003e\u003c/h3\u003e\n\u003cp align=\"center\"\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/p\u003e\n\n\u003c!-- gomarkdoc:embed:start --\u003e\n\n\u003c!-- Code generated by gomarkdoc. DO NOT EDIT --\u003e\n\n# splitslog\n\n```go\nimport \"atomicgo.dev/splitslog\"\n```\n\nPackage splitslog provides a handler that splits log records to different handlers based on their level.\n\nThe most common use case is to split logs to stdout and stderr based on their level.\n\n\n\n\n\n```go\npackage main\n\nimport (\n\t\"log/slog\"\n\t\"os\"\n\n\t\"atomicgo.dev/splitslog\"\n)\n\nfunc main() {\n\tsplitter := splitslog.Splitter{\n\t\t// Debug and info messages are printed to stdout.\n\t\tslog.LevelDebug: slog.NewJSONHandler(os.Stdout, nil),\n\t\tslog.LevelInfo:  slog.NewJSONHandler(os.Stdout, nil),\n\n\t\t// Warn and error messages are printed to stderr.\n\t\tslog.LevelWarn:  slog.NewJSONHandler(os.Stderr, nil),\n\t\tslog.LevelError: slog.NewJSONHandler(os.Stderr, nil),\n\t}\n\n\thandler := splitslog.NewSplitHandler(splitter)\n\tlogger := slog.New(handler)\n\n\tlogger.Info(\"info message prints to stdout\")\n\tlogger.Error(\"error message prints to stderr\")\n\n\t// stdout: {\"time\":\"2023-09-07T16:56:22.563817+02:00\",\"level\":\"INFO\",\"msg\":\"info message prints to stdout\"}\n\t// stderr: {\"time\":\"2023-09-07T16:56:22.564103+02:00\",\"level\":\"ERROR\",\"msg\":\"error message prints to stderr\"}\n}\n```\n\n\n\n## Index\n\n- [type SplitHandler](\u003c#SplitHandler\u003e)\n  - [func NewSplitHandler\\(splitter Splitter\\) \\*SplitHandler](\u003c#NewSplitHandler\u003e)\n  - [func \\(h \\*SplitHandler\\) Enabled\\(ctx context.Context, level slog.Level\\) bool](\u003c#SplitHandler.Enabled\u003e)\n  - [func \\(h \\*SplitHandler\\) Handle\\(ctx context.Context, record slog.Record\\) error](\u003c#SplitHandler.Handle\u003e)\n  - [func \\(h \\*SplitHandler\\) WithAttrs\\(attrs \\[\\]slog.Attr\\) slog.Handler](\u003c#SplitHandler.WithAttrs\u003e)\n  - [func \\(h \\*SplitHandler\\) WithGroup\\(name string\\) slog.Handler](\u003c#SplitHandler.WithGroup\u003e)\n- [type Splitter](\u003c#Splitter\u003e)\n\n\n\u003ca name=\"SplitHandler\"\u003e\u003c/a\u003e\n## type [SplitHandler](\u003chttps://github.com/atomicgo/splitslog/blob/main/splitslog.go#L15-L19\u003e)\n\nSplitHandler is a handler that splits log records to different handlers based on their level.\n\n```go\ntype SplitHandler struct {\n    Splitter Splitter\n    // contains filtered or unexported fields\n}\n```\n\n\u003ca name=\"NewSplitHandler\"\u003e\u003c/a\u003e\n### func [NewSplitHandler](\u003chttps://github.com/atomicgo/splitslog/blob/main/splitslog.go#L22\u003e)\n\n```go\nfunc NewSplitHandler(splitter Splitter) *SplitHandler\n```\n\nNewSplitHandler returns a new SplitHandler.\n\n\n\n\n\n```go\npackage main\n\nimport (\n\t\"log/slog\"\n\t\"os\"\n\n\t\"atomicgo.dev/splitslog\"\n)\n\nfunc main() {\n\tsplitter := splitslog.Splitter{\n\t\t// Debug and info messages are printed to stdout.\n\t\tslog.LevelDebug: slog.NewJSONHandler(os.Stdout, nil),\n\t\tslog.LevelInfo:  slog.NewJSONHandler(os.Stdout, nil),\n\n\t\t// Warn and error messages are printed to stderr.\n\t\tslog.LevelWarn:  slog.NewJSONHandler(os.Stderr, nil),\n\t\tslog.LevelError: slog.NewJSONHandler(os.Stderr, nil),\n\t}\n\n\thandler := splitslog.NewSplitHandler(splitter)\n\tlogger := slog.New(handler)\n\n\tlogger.Info(\"info message prints to stdout\")\n\tlogger.Error(\"error message prints to stderr\")\n\n\t// stdout: {\"time\":\"2023-09-07T16:56:22.563817+02:00\",\"level\":\"INFO\",\"msg\":\"info message prints to stdout\"}\n\t// stderr: {\"time\":\"2023-09-07T16:56:22.564103+02:00\",\"level\":\"ERROR\",\"msg\":\"error message prints to stderr\"}\n}\n```\n\n\n\n\u003ca name=\"SplitHandler.Enabled\"\u003e\u003c/a\u003e\n### func \\(\\*SplitHandler\\) [Enabled](\u003chttps://github.com/atomicgo/splitslog/blob/main/splitslog.go#L40\u003e)\n\n```go\nfunc (h *SplitHandler) Enabled(ctx context.Context, level slog.Level) bool\n```\n\nEnabled implements Handler.Enabled.\n\n\u003ca name=\"SplitHandler.Handle\"\u003e\u003c/a\u003e\n### func \\(\\*SplitHandler\\) [Handle](\u003chttps://github.com/atomicgo/splitslog/blob/main/splitslog.go#L45\u003e)\n\n```go\nfunc (h *SplitHandler) Handle(ctx context.Context, record slog.Record) error\n```\n\nHandle implements Handler.Handle.\n\n\u003ca name=\"SplitHandler.WithAttrs\"\u003e\u003c/a\u003e\n### func \\(\\*SplitHandler\\) [WithAttrs](\u003chttps://github.com/atomicgo/splitslog/blob/main/splitslog.go#L62\u003e)\n\n```go\nfunc (h *SplitHandler) WithAttrs(attrs []slog.Attr) slog.Handler\n```\n\nWithAttrs implements Handler.WithAttrs.\n\n\u003ca name=\"SplitHandler.WithGroup\"\u003e\u003c/a\u003e\n### func \\(\\*SplitHandler\\) [WithGroup](\u003chttps://github.com/atomicgo/splitslog/blob/main/splitslog.go#L71\u003e)\n\n```go\nfunc (h *SplitHandler) WithGroup(name string) slog.Handler\n```\n\nWithGroup implements Handler.WithGroup.\n\n\u003ca name=\"Splitter\"\u003e\u003c/a\u003e\n## type [Splitter](\u003chttps://github.com/atomicgo/splitslog/blob/main/splitslog.go#L12\u003e)\n\nSplitter is a map of log levels to handlers. The default log levels \\(slog.LevelDebug, slog.LevelInfo, slog.LevelWarn, slog.LevelError\\) must be present, otherwise the SplitHandler panics.\n\n```go\ntype Splitter map[slog.Level]slog.Handler\n```\n\nGenerated by [gomarkdoc](\u003chttps://github.com/princjef/gomarkdoc\u003e)\n\n\n\u003c!-- gomarkdoc:embed:end --\u003e\n\n---\n\n\u003e [AtomicGo.dev](https://atomicgo.dev) \u0026nbsp;\u0026middot;\u0026nbsp;\n\u003e with ❤️ by [@MarvinJWendt](https://github.com/MarvinJWendt) |\n\u003e [MarvinJWendt.com](https://marvinjwendt.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatomicgo%2Fsplitslog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatomicgo%2Fsplitslog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatomicgo%2Fsplitslog/lists"}