{"id":19666858,"url":"https://github.com/mavolin/dblog","last_synced_at":"2026-05-06T14:39:44.460Z","repository":{"id":64920022,"uuid":"525327087","full_name":"mavolin/dblog","owner":"mavolin","description":"📜 Generate a logger that wraps your repository interface. Modular, but currently only supports sentry. Useful for performance monitoring.","archived":false,"fork":false,"pushed_at":"2023-10-17T16:22:16.000Z","size":26,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2025-02-27T04:17:48.375Z","etag":null,"topics":["code-generator","database","logger","repository","sentry"],"latest_commit_sha":null,"homepage":"","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/mavolin.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}},"created_at":"2022-08-16T10:14:02.000Z","updated_at":"2023-02-01T23:52:08.000Z","dependencies_parsed_at":"2024-11-11T16:43:26.235Z","dependency_job_id":null,"html_url":"https://github.com/mavolin/dblog","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/mavolin/dblog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavolin%2Fdblog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavolin%2Fdblog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavolin%2Fdblog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavolin%2Fdblog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mavolin","download_url":"https://codeload.github.com/mavolin/dblog/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mavolin%2Fdblog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32698988,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T08:33:17.875Z","status":"ssl_error","status_checked_at":"2026-05-06T08:33:17.221Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["code-generator","database","logger","repository","sentry"],"created_at":"2024-11-11T16:29:15.565Z","updated_at":"2026-05-06T14:39:44.438Z","avatar_url":"https://github.com/mavolin.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003ch1\u003edblog\u003c/h1\u003e\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/mavolin/dblog)](https://goreportcard.com/report/github.com/mavolin/dblog)\n[![License MIT](https://img.shields.io/github/license/mavolin/dblog)](https://github.com/mavolin/dblog/blob/develop/LICENSE)\n\u003c/div\u003e\n\n---\n\n## About\n\ndblog is a code generator that can generate a wrapper for your repository\ninterface to log database operations.\nEspecially useful, if you do things like performance tracking.\n\n## Features\n\n* ✨ **Simple:** Only generate code for the logger you use.\n* 📦 **Modular:** Easily add more generators by implementing the `logger.Logger`\n  interface, the [sentry implementation](logger/sentry/sentry.go) is only 143 LOC long.\n  (PRs welcome!)\n* 🕵 **Context-Aware:** Loggers can log before a request, after a request,\n  when an error occurs, when the request succeeds, or any combination of those.\n\n## Installation\n\n```shell\ngo install github.com/mavolin/dblog/cmd/dblog@latest\n```\n\n## Examples\n\nFirst impressions matter, so here is a simple example:\n\n```go\npackage my-project/repository\n\nimport \"context\"\n\n//go:generate dblog -sentry Repository\ntype (\n\tRepository interface {\n\t\t// dblog uses param and return value names in the log messages, so it makes\n\t\t// sense to name them yourself, if you don't want generated names.\n\t\tGopher(ctx context.Context, id GopherID) (g *Gopher, err error)\n\t\tGophers(ctx context.Context, search GopherSearchData) (gs []Gopher, err error)\n\t}\n\n\tGopherSearchData struct {\n\t\tName           string\n\t\tMinAge, MaxAge int\n\t}\n)\n\ntype GopherID uint64\n\ntype Gopher struct {\n\tID      GopherID\n\tName    string\n\tAge     int\n\tHobbies []string\n}\n\n```\n\n\u003e **Quick Transparency Note:** \n\u003e Variables in the below code were renamed for readability,\n\u003e normally more cryptic names are used to prevent name collisions.\n\u003e Additionally, I changed naked returns to explicit ones.\n\u003e Otherwise, the code is identical to the actual output of `dblog`.\n\n```go\npackage my-project/repository/dblog\n\nimport (\n    \"context\"\n    \"github.com/getsentry/sentry-go\"\n    \"my-project/repository\"\n)\n\n// Code generated by github.com/mavolin/dblog. DO NOT EDIT.\n\ntype Wrapper struct {\n\trepo repository.Repository\n}\n\nvar _ repository.Repository = (*Wrapper)(nil)\n\nfunc NewWrapper(repo repository.Repository) *Wrapper {\n\treturn \u0026Wrapper{repo: repo}\n}\n\nfunc (w *Wrapper) Gopher(ctx context.Context, id repository.GopherID) (g *repository.Gopher, err error) {\n\tspan := sentry.StartSpan(ctx, \"db.query\")\n\tspan.Description = \"Gopher\"\n\tctx = span.Context()\n\n\tdefer span.Finish()\n\n\tg, err = w.repo.Gopher(ctx, id)\n\n\tif hub := sentry.GetHubFromContext(ctx); hub != nil {\n\t\thub.AddBreadcrumb(\u0026sentry.Breadcrumb{\n\t\t\tCategory: \"db.query\",\n\t\t\tMessage:  \"Gopher\",\n\t\t\tData: map[string]any{\n\t\t\t\t\"args\":    map[string]any{\"id\": id},\n\t\t\t\t\"results\": map[string]any{\"g\": g, \"err\": err},\n\t\t\t},\n\t\t}, nil)\n\t}\n\n\treturn g, err\n}\n\nfunc (w *Wrapper) Gophers(\n\tctx context.Context, search repository.GopherSearchData,\n) (gs []repository.Gopher, err error) {\n\tspan := sentry.StartSpan(ctx, \"db.query\")\n\tspan.Description = \"Gophers\"\n\tctx = span.Context()\n\n\tdefer span.Finish()\n\n\tgs, err = w.repo.Gophers(ctx, search)\n\n\tif hub := sentry.GetHubFromContext(ctx); hub != nil {\n\t\thub.AddBreadcrumb(\u0026sentry.Breadcrumb{\n\t\t\tCategory: \"db.query\",\n\t\t\tMessage:  \"Gophers\",\n\t\t\tData: map[string]any{\n\t\t\t\t\"args\":    map[string]any{\"search\": search},\n\t\t\t\t\"results\": map[string]any{\"gs\": gs, \"err\": err},\n\t\t\t},\n\t\t}, nil)\n\t}\n\t\n\treturn gs, err\n}\n```\n\n## License\n\nBuilt with ❤ by [Maximilian von Lindern](https://github.com/mavolin).\nAvailable under the [MIT License](./LICENSE).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmavolin%2Fdblog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmavolin%2Fdblog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmavolin%2Fdblog/lists"}