{"id":19585477,"url":"https://github.com/stremovskyy/gin-request-logger","last_synced_at":"2026-01-30T20:32:15.112Z","repository":{"id":57500633,"uuid":"204646151","full_name":"stremovskyy/gin-request-logger","owner":"stremovskyy","description":"Request Logger Middleware for Gin Framework","archived":false,"fork":false,"pushed_at":"2025-12-12T14:40:54.000Z","size":100,"stargazers_count":1,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-14T14:59:05.314Z","etag":null,"topics":["gin","gin-framework","go","golang","golang-library","middleware"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stremovskyy.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-08-27T07:30:53.000Z","updated_at":"2025-12-12T14:40:59.000Z","dependencies_parsed_at":"2024-04-19T13:47:30.409Z","dependency_job_id":"2f03dd31-90c7-4355-a3f2-a35f40c08e28","html_url":"https://github.com/stremovskyy/gin-request-logger","commit_stats":{"total_commits":20,"total_committers":3,"mean_commits":6.666666666666667,"dds":0.55,"last_synced_commit":"02f599c718fdd0d0ad0d7a87bbf9cbebebe99b42"},"previous_names":["karmadon/gin-request-logger"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/stremovskyy/gin-request-logger","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stremovskyy%2Fgin-request-logger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stremovskyy%2Fgin-request-logger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stremovskyy%2Fgin-request-logger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stremovskyy%2Fgin-request-logger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stremovskyy","download_url":"https://codeload.github.com/stremovskyy/gin-request-logger/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stremovskyy%2Fgin-request-logger/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28918451,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T20:25:28.696Z","status":"ssl_error","status_checked_at":"2026-01-30T20:25:13.426Z","response_time":66,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["gin","gin-framework","go","golang","golang-library","middleware"],"created_at":"2024-11-11T07:54:17.607Z","updated_at":"2026-01-30T20:32:15.103Z","avatar_url":"https://github.com/stremovskyy.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gin-request-logger\nRequest/response logger middleware for [Gin](https://github.com/gin-gonic/gin) powered by [logrus](https://github.com/sirupsen/logrus).\n\n## Highlights\n- Gzip-aware response logging (auto-decompresses when possible).\n- Binary/multipart detection with safe placeholders (no junk in logs).\n- Body truncation with configurable limits (defaults to 1 KB).\n- Header logging with allow/deny lists.\n- Request ID injection/customization.\n- Sampling, log-on-error-only, and per-request overrides.\n- Structured or colored text output.\n- Presets for debug/prod and env-driven configuration.\n\n## Install\n\n```sh\ngo get github.com/stremovskyy/gin-request-logger\n```\n\n## Quick start\n\n```go\nimport (\n    \"github.com/gin-gonic/gin\"\n    requestlogger \"github.com/stremovskyy/gin-request-logger\"\n)\n\nrouter := gin.New()\nrouter.Use(requestlogger.New(requestlogger.Options{\n    Pretty:         true,  // pretty-print JSON bodies\n    LogHeaders:     true,  // log selected headers\n    MaxBodyLogSize: 2048, // truncate logged bodies to 2 KB\n}))\n```\n\n## Presets\n\n```go\nrouter.Use(requestlogger.Debug()) // Pretty, headers on, larger limits\nrouter.Use(requestlogger.Prod())  // Compact, log-on-error-only, conservative limits\n```\n\n## Common options\n\n- `LogRequest`, `LogResponse` – enable/disable request/response logging.\n- `Pretty` – pretty-print JSON bodies.\n- `MaxBodyLogSize` – truncate logged bodies (negative to disable).\n- `MaxRequestBodyBytes`, `MaxResponseBodyBytes` – cap how much data is buffered for logging.\n- `LogHeaders`, `HeaderAllowlist`, `HeaderDenylist` – control which headers appear in logs.\n- `LogOnErrorOnly` – only log responses with status \u003e= 400.\n- `SampleRate` (+ `SampleRateSet`) – percentage of requests to log (set `SampleRate: 0, SampleRateSet: true` to disable).\n- `Structured` – emit structured logrus fields instead of colored text.\n- `RequestIDHeader`, `InjectRequestID`, `RequestIDGenerator` – customize request IDs.\n- `ContextFields` – attach structured fields derived from the current request.\n\n## Per-request overrides\n\n```go\nfunc handler(c *gin.Context) {\n    requestlogger.SkipRequestBody(c)          // omit request body\n    requestlogger.SkipResponseBody(c)         // omit response body\n    requestlogger.SetBodyLogLimit(c, 512)     // tighter per-request limit\n    requestlogger.SetSampleRate(c, 0.25)      // sample only 25% for this request\n    requestlogger.LogOnlyOnError(c)           // log only if status \u003e= 400\n    requestlogger.AddFields(c, log.Fields{\n        \"user_id\": \"123\",\n    })\n    c.JSON(http.StatusOK, gin.H{\"ok\": true})\n}\n```\n\nTo skip everything for a route:\n\n```go\nfunc healthz(c *gin.Context) {\n    requestlogger.SkipLogging(c)\n    c.String(http.StatusOK, \"ok\")\n}\n```\n\n## Env configuration\n\nBuild from env with `requestlogger.NewFromEnv(\"REQUEST_LOGGER_\")` (prefix is optional; default is `REQUEST_LOGGER_`).\n\nSupported variables:\n\n- `PRETTY`, `LOG_RESPONSE`, `LOG_HEADERS`, `LOG_ON_ERROR_ONLY`, `STRUCTURED`, `INJECT_REQUEST_ID`\n- `MAX_BODY_LOG_SIZE`, `MAX_REQUEST_BODY_BYTES`, `MAX_RESPONSE_BODY_BYTES`, `SAMPLE_RATE`\n- `REQUEST_ID_HEADER`, `HEADER_ALLOWLIST`, `HEADER_DENYLIST`\n\n## Examples\n\nBasic structured logging:\n\n```go\nrouter.Use(requestlogger.New(requestlogger.Options{\n    Structured: true,\n    LogHeaders: true,\n    ContextFields: func(c *gin.Context) log.Fields {\n        return log.Fields{\"request_id\": c.GetString(\"request_id\")}\n    },\n}))\n```\n\nOnly log errors with tight limits:\n\n```go\nrouter.Use(requestlogger.New(requestlogger.Options{\n    LogOnErrorOnly:       true,\n    MaxBodyLogSize:       512,\n    MaxRequestBodyBytes:  1 \u003c\u003c 20, // 1 MB capture guard\n    MaxResponseBodyBytes: 1 \u003c\u003c 20,\n}))\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstremovskyy%2Fgin-request-logger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstremovskyy%2Fgin-request-logger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstremovskyy%2Fgin-request-logger/lists"}