{"id":"1699f079-843d-4202-af37-f880ff970c14","shortId":"SYPhNp","kind":"skill","title":"golang-samber-slog","tagline":"Structured logging extensions for Golang using samber/slog-**** packages — multi-handler pipelines (slog-multi), log sampling (slog-sampling), attribute formatting (slog-formatter), HTTP middleware (slog-fiber, slog-gin, slog-chi, slog-echo), and backend routing (slog-datadog, sl","description":"**Persona:** You are a Go logging architect. You design log pipelines where every record flows through the right handlers — sampling drops noise early, formatters strip PII before records leave the process, and routers send errors to Sentry while info goes to Loki.\n\n# samber/slog-\\*\\*\\*\\* — Structured Logging Pipeline for Go\n\n20+ composable `slog.Handler` packages for Go 1.21+. Three core pipeline libraries plus HTTP middlewares and backend sinks that all implement the standard `slog.Handler` interface.\n\n**Official resources:**\n\n- [github.com/samber/slog-multi](https://github.com/samber/slog-multi) — handler composition\n- [github.com/samber/slog-sampling](https://github.com/samber/slog-sampling) — throughput control\n- [github.com/samber/slog-formatter](https://github.com/samber/slog-formatter) — attribute transformation\n\nThis skill is not exhaustive. Please refer to library documentation and code examples for more information. Context7 can help as a discoverability platform.\n\n## The Pipeline Model\n\nEvery samber/slog pipeline follows a canonical ordering. Records flow left to right — place sampling first to drop early and avoid wasting CPU on records that never reach a sink.\n\n```\nrecord → [Sampling] → [Pipe: trace/PII] → [Router] → [Sinks]\n```\n\nOrder matters: sampling before formatting saves CPU. Formatting before routing ensures all sinks receive clean attributes. Reversing this wastes work on records that get dropped.\n\n## Core Libraries\n\n| Library | Purpose | Key constructors |\n| --- | --- | --- |\n| `slog-multi` | Handler composition | `Fanout`, `Router`, `FirstMatch`, `Failover`, `Pool`, `Pipe` |\n| `slog-sampling` | Throughput control | `UniformSamplingOption`, `ThresholdSamplingOption`, `AbsoluteSamplingOption`, `CustomSamplingOption` |\n| `slog-formatter` | Attribute transforms | `PIIFormatter`, `ErrorFormatter`, `FormatByType[T]`, `FormatByKey`, `FlattenFormatterMiddleware` |\n\n## slog-multi — Handler Composition\n\nSix composition patterns, each for a different routing need:\n\n| Pattern | Behavior | Latency impact |\n| --- | --- | --- |\n| `Fanout(handlers...)` | Broadcast to all handlers sequentially | Sum of all handler latencies |\n| `Router().Add(h, predicate).Handler()` | Route to ALL matching handlers | Sum of matching handlers |\n| `Router().Add(...).FirstMatch().Handler()` | Route to FIRST match only | Single handler latency |\n| `Failover()(handlers...)` | Try sequentially until one succeeds | Primary handler latency (happy path) |\n| `Pool()(handlers...)` | Concurrent broadcast to all handlers | Max of all handler latencies |\n| `Pipe(middlewares...).Handler(sink)` | Middleware chain before sink | Middleware overhead + sink |\n\n```go\n// Route errors to Sentry, all logs to stdout\nlogger := slog.New(\n    slogmulti.Router().\n        Add(sentryHandler, slogmulti.LevelIs(slog.LevelError)).\n        Add(slog.NewJSONHandler(os.Stdout, nil)).\n        Handler(),\n)\n```\n\nBuilt-in predicates: `LevelIs`, `LevelIsNot`, `MessageIs`, `MessageIsNot`, `MessageContains`, `MessageNotContains`, `AttrValueIs`, `AttrKindIs`.\n\nFor full code examples of every pattern, see [Pipeline Patterns](references/pipeline-patterns.md).\n\n## slog-sampling — Throughput Control\n\n| Strategy | Behavior | Best for |\n| --- | --- | --- |\n| Uniform | Drop fixed % of all records | Dev/staging noise reduction |\n| Threshold | Log first N per interval, then sample at rate R | Production — preserves initial visibility |\n| Absolute | Cap at N records per interval globally | Hard cost control |\n| Custom | User function returns sample rate per record | Level-aware or time-aware rules |\n\nSampling MUST be the outermost handler in the pipeline — placing it after formatting wastes CPU on records that get dropped.\n\n```go\n// Threshold: log first 10 per 5s, then 10% — errors always pass through via Router\nlogger := slog.New(\n    slogmulti.\n        Pipe(slogsampling.ThresholdSamplingOption{\n            Tick: 5 * time.Second, Threshold: 10, Rate: 0.1,\n        }.NewMiddleware()).\n        Handler(innerHandler),\n)\n```\n\nMatchers group similar records for deduplication: `MatchByLevel()`, `MatchByMessage()`, `MatchByLevelAndMessage()` (default), `MatchBySource()`, `MatchByAttribute(groups, key)`.\n\nFor strategy comparison and configuration details, see [Sampling Strategies](references/sampling-strategies.md).\n\n## slog-formatter — Attribute Transformation\n\nApply as a `Pipe` middleware so all downstream handlers receive clean attributes.\n\n```go\nlogger := slog.New(\n    slogmulti.Pipe(slogformatter.NewFormatterMiddleware(\n        slogformatter.PIIFormatter(\"user\"),          // mask PII fields\n        slogformatter.ErrorFormatter(\"error\"),       // structured error info\n        slogformatter.IPAddressFormatter(\"client\"),  // mask IP addresses\n    )).Handler(slog.NewJSONHandler(os.Stdout, nil)),\n)\n```\n\nKey formatters: `PIIFormatter`, `ErrorFormatter`, `TimeFormatter`, `UnixTimestampFormatter`, `IPAddressFormatter`, `HTTPRequestFormatter`, `HTTPResponseFormatter`. Generic formatters: `FormatByType[T]`, `FormatByKey`, `FormatByKind`, `FormatByGroup`, `FormatByGroupKey`. Flatten nested attributes with `FlattenFormatterMiddleware`.\n\n## HTTP Middlewares\n\nConsistent pattern across frameworks: `router.Use(slogXXX.New(logger))`.\n\nAvailable: `slog-gin`, `slog-echo`, `slog-fiber`, `slog-chi`, `slog-http` (net/http).\n\nAll share a `Config` struct with: `DefaultLevel`, `ClientErrorLevel`, `ServerErrorLevel`, `WithRequestBody`, `WithResponseBody`, `WithUserAgent`, `WithRequestID`, `WithTraceID`, `WithSpanID`, `Filters`.\n\n```go\n// Gin with filters — skip health checks\nrouter.Use(sloggin.NewWithConfig(logger, sloggin.Config{\n    DefaultLevel:     slog.LevelInfo,\n    ClientErrorLevel: slog.LevelWarn,\n    ServerErrorLevel: slog.LevelError,\n    WithRequestBody:  true,\n    Filters: []sloggin.Filter{\n        sloggin.IgnorePath(\"/health\", \"/metrics\"),\n    },\n}))\n```\n\nFor framework-specific setup, see [HTTP Middlewares](references/http-middlewares.md).\n\n## Backend Sinks\n\nAll follow the `Option{}.NewXxxHandler()` constructor pattern.\n\n| Category     | Packages                                                   |\n| ------------ | ---------------------------------------------------------- |\n| Cloud        | `slog-datadog`, `slog-sentry`, `slog-loki`, `slog-graylog` |\n| Messaging    | `slog-kafka`, `slog-fluentd`, `slog-logstash`, `slog-nats` |\n| Notification | `slog-slack`, `slog-telegram`, `slog-webhook`              |\n| Storage      | `slog-parquet`                                             |\n| Bridges      | `slog-zap`, `slog-zerolog`, `slog-logrus`                  |\n\n**Batch handlers require graceful shutdown** — `slog-datadog`, `slog-loki`, `slog-kafka`, and `slog-parquet` buffer records internally. Flush on shutdown (e.g., `handler.Stop(ctx)` for Datadog, `lokiClient.Stop()` for Loki, `writer.Close()` for Kafka) or buffered logs are lost.\n\nFor configuration examples and shutdown patterns, see [Backend Handlers](references/backend-handlers.md).\n\n## Common Mistakes\n\n| Mistake | Why it fails | Fix |\n| --- | --- | --- |\n| Sampling after formatting | Wastes CPU formatting records that get dropped | Place sampling as outermost handler |\n| Fanout to many synchronous handlers | Blocks caller — latency is sum of all handlers | Use `Pool()` for concurrent dispatch |\n| Missing shutdown flush on batch handlers | Buffered logs lost on shutdown | `defer handler.Stop(ctx)` (Datadog), `defer lokiClient.Stop()` (Loki), `defer writer.Close()` (Kafka) |\n| Router without default/catch-all handler | Unmatched records silently dropped | Add a handler with no predicate as catch-all |\n| `AttrFromContext` without HTTP middleware | Context has no request attributes to extract | Install `slog-gin`/`echo`/`fiber`/`chi` middleware first |\n| Using `Pipe` with no middleware | No-op wrapper adding per-record overhead | Remove `Pipe()` if no middleware needed |\n\n## Performance Warnings\n\n- **Fanout latency** = sum of all handler latencies (sequential). With 5 handlers at 10ms each, every log call costs 50ms. Use `Pool()` to reduce to max(latencies)\n- **Pipe middleware** adds per-record function call overhead — keep chains short (2-4 middlewares)\n- **slog-formatter** processes attributes sequentially — many formatters compound. For hot-path attribute formatting, prefer implementing `slog.LogValuer` on your types instead\n- **Benchmark** your pipeline with `go test -bench` before production deployment\n\n**Diagnose:** measure per-record allocation and latency of your pipeline and identify which handler in the chain allocates most.\n\n## Best Practices\n\n1. **Sample first, format second, route last** — this canonical ordering minimizes wasted work and ensures all sinks see clean data\n2. **Use Pipe for cross-cutting concerns** — trace ID injection and PII scrubbing belong in middleware, not per-handler logic\n3. **Test pipelines with `slogmulti.NewHandleInlineHandler`** — assert on records reaching each stage without real sinks\n4. **Use `AttrFromContext`** to propagate request-scoped attributes from HTTP middleware to all handlers\n5. **Prefer Router over Fanout** when handlers need different record subsets — Router evaluates predicates and skips non-matching handlers\n\n## Cross-References\n\n- → See `samber/cc-skills-golang@golang-observability` skill for slog fundamentals (levels, context, handler setup, migration)\n- → See `samber/cc-skills-golang@golang-error-handling` skill for the log-or-return rule\n- → See `samber/cc-skills-golang@golang-security` skill for PII handling in logs\n- → See `samber/cc-skills-golang@golang-samber-oops` skill for structured error context with `samber/oops`\n\nIf you encounter a bug or unexpected behavior in any samber/slog-\\* package, open an issue at the relevant repository (e.g., [slog-multi/issues](https://github.com/samber/slog-multi/issues), [slog-sampling/issues](https://github.com/samber/slog-sampling/issues)).","tags":["golang","samber","slog","skills","agent","agent-skills","antigravity","claude","claude-code","code","codex","coding"],"capabilities":["skill","source-samber","skill-golang-samber-slog","topic-agent","topic-agent-skills","topic-antigravity","topic-claude","topic-claude-code","topic-code","topic-codex","topic-coding","topic-copilot","topic-cursor","topic-gemini","topic-gemini-cli-extension"],"categories":["cc-skills-golang"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/samber/cc-skills-golang/golang-samber-slog","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add samber/cc-skills-golang","source_repo":"https://github.com/samber/cc-skills-golang","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 1725 github stars · SKILL.md body (9,899 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:02.666Z","embedding":null,"createdAt":"2026-04-18T20:32:54.161Z","updatedAt":"2026-05-18T18:53:02.666Z","lastSeenAt":"2026-05-18T18:53:02.666Z","tsv":"'-4':941 '/health':659 '/issues':1166,1173 '/metrics':660 '/samber/slog-formatter](https://github.com/samber/slog-formatter)':137 '/samber/slog-multi/issues),':1169 '/samber/slog-multi](https://github.com/samber/slog-multi)':127 '/samber/slog-sampling/issues)).':1176 '/samber/slog-sampling](https://github.com/samber/slog-sampling)':132 '0.1':504 '1':997 '1.21':105 '10':482,486,502 '10ms':914 '2':940,1017 '20':99 '3':1039 '4':1053 '5':499,911,1068 '50ms':920 '5s':484 'absolut':431 'absolutesamplingopt':250 'across':599 'ad':889 'add':294,308,366,370,850,930 'address':568 'alloc':980,993 'alway':488 'appli':537 'architect':57 'assert':1044 'attrfromcontext':860,1055 'attribut':25,138,216,255,535,548,592,868,947,956,1061 'attrkindi':386 'attrvaluei':385 'avail':604 'avoid':185 'awar':452,456 'backend':45,114,670,778 'batch':731,825 'behavior':278,404,1150 'belong':1031 'bench':971 'benchmark':965 'best':405,995 'block':808 'bridg':721 'broadcast':283,334 'buffer':749,767,827 'bug':1147 'built':376 'built-in':375 'call':918,935 'caller':809 'canon':171,1005 'cap':432 'catch':858 'catch-al':857 'categori':679 'chain':348,938,992 'check':643 'chi':40,616,877 'clean':215,547,1015 'client':565 'clienterrorlevel':628,650 'cloud':681 'code':151,389 'common':781 'comparison':524 'compos':100 'composit':129,236,267,269 'compound':951 'concern':1024 'concurr':333,819 'config':624 'configur':526,772 'consist':597 'constructor':231,677 'context':864,1101,1140 'context7':156 'control':134,247,402,441 'core':107,226 'cost':440,919 'cpu':187,207,472,792 'cross':1022,1089 'cross-cut':1021 'cross-refer':1088 'ctx':757,834 'custom':442 'customsamplingopt':251 'cut':1023 'data':1016 'datadog':49,684,738,759,835 'dedupl':513 'default':517 'default/catch-all':844 'defaultlevel':627,648 'defer':832,836,839 'deploy':974 'design':59 'detail':527 'dev/staging':413 'diagnos':975 'differ':274,1076 'discover':161 'dispatch':820 'document':149 'downstream':544 'drop':71,182,225,408,477,797,849 'e.g':755,1162 'earli':73,183 'echo':43,610,875 'encount':1145 'ensur':211,1011 'error':85,356,487,560,562,1109,1139 'errorformatt':258,576 'evalu':1080 'everi':63,166,392,916 'exampl':152,390,773 'exhaust':144 'extens':7 'extract':870 'fail':786 'failov':240,319 'fanout':237,281,803,902,1072 'fiber':34,613,876 'field':558 'filter':636,640,656 'first':180,313,418,481,879,999 'firstmatch':239,309 'fix':409,787 'flatten':590 'flattenformattermiddlewar':262,594 'flow':65,174 'fluentd':700 'flush':752,823 'follow':169,673 'format':26,205,208,470,790,793,957,1000 'formatbygroup':588 'formatbygroupkey':589 'formatbykey':261,586 'formatbykind':587 'formatbytyp':259,584 'formatt':29,74,254,534,574,583,945,950 'framework':600,663 'framework-specif':662 'full':388 'function':444,934 'fundament':1099 'generic':582 'get':224,476,796 'gin':37,607,638,874 'github.com':126,131,136,1168,1175 'github.com/samber/slog-formatter](https://github.com/samber/slog-formatter)':135 'github.com/samber/slog-multi/issues),':1167 'github.com/samber/slog-multi](https://github.com/samber/slog-multi)':125 'github.com/samber/slog-sampling/issues)).':1174 'github.com/samber/slog-sampling](https://github.com/samber/slog-sampling)':130 'global':438 'go':55,98,104,354,478,549,637,969 'goe':90 'golang':2,9,1094,1108,1122,1133 'golang-error-handl':1107 'golang-observ':1093 'golang-samber-oop':1132 'golang-samber-slog':1 'golang-secur':1121 'grace':734 'graylog':693 'group':509,520 'h':295 'handl':1110,1127 'handler':15,69,128,235,266,282,286,291,297,302,306,310,317,320,327,332,337,341,345,374,463,506,545,569,732,779,802,807,815,826,845,852,907,912,989,1037,1067,1074,1087,1102 'handler.stop':756,833 'happi':329 'hard':439 'health':642 'help':158 'hot':954 'hot-path':953 'http':30,111,595,619,667,862,1063 'httprequestformatt':580 'httpresponseformatt':581 'id':1026 'identifi':987 'impact':280 'implement':118,959 'info':89,563 'inform':155 'initi':429 'inject':1027 'innerhandl':507 'instal':871 'instead':964 'interfac':122 'intern':751 'interv':421,437 'ip':567 'ipaddressformatt':579 'issu':1157 'kafka':697,744,765,841 'keep':937 'key':230,521,573 'last':1003 'latenc':279,292,318,328,342,810,903,908,927,982 'leav':79 'left':175 'leve':379 'level':451,1100 'level-awar':450 'levelisnot':380 'librari':109,148,227,228 'log':6,20,56,60,95,360,417,480,768,828,917,1115,1129 'log-or-return':1114 'logger':363,493,550,603,646 'logic':1038 'logrus':730 'logstash':703 'loki':92,690,741,762,838 'lokiclient.stop':760,837 'lost':770,829 'mani':805,949 'mask':556,566 'match':301,305,314,1086 'matchbyattribut':519 'matchbylevel':514 'matchbylevelandmessag':516 'matchbymessag':515 'matchbysourc':518 'matcher':508 'matter':202 'max':338,926 'measur':976 'messag':694 'messagecontain':383 'messagei':381 'messageisnot':382 'messagenotcontain':384 'middlewar':31,112,344,347,351,541,596,668,863,878,884,898,929,942,1033,1064 'migrat':1104 'minim':1007 'miss':821 'mistak':782,783 'model':165 'multi':14,19,234,265,1165 'multi-handl':13 'must':459 'n':419,434 'nat':706 'need':276,899,1075 'nest':591 'net/http':620 'never':191 'newmiddlewar':505 'newxxxhandl':676 'nil':373,572 'no-op':885 'nois':72,414 'non':1085 'non-match':1084 'notif':707 'observ':1095 'offici':123 'one':324 'oop':1135 'op':887 'open':1155 'option':675 'order':172,201,1006 'os.stdout':372,571 'outermost':462,801 'overhead':352,893,936 'packag':12,102,680,1154 'parquet':720,748 'pass':489 'path':330,955 'pattern':270,277,393,396,598,678,776 'per':420,436,448,483,891,932,978,1036 'per-handl':1035 'per-record':890,931,977 'perform':900 'persona':51 'pii':76,557,1029,1126 'piiformatt':257,575 'pipe':197,242,343,496,540,881,895,928,1019 'pipelin':16,61,96,108,164,168,395,466,967,985,1041 'place':178,467,798 'platform':162 'pleas':145 'plus':110 'pool':241,331,817,922 'practic':996 'predic':296,378,855,1081 'prefer':958,1069 'preserv':428 'primari':326 'process':81,946 'product':427,973 'propag':1057 'purpos':229 'r':426 'rate':425,447,503 'reach':192,1047 'real':1051 'receiv':214,546 'record':64,78,173,189,195,222,412,435,449,474,511,750,794,847,892,933,979,1046,1077 'reduc':924 'reduct':415 'refer':146,1090 'references/backend-handlers.md':780 'references/http-middlewares.md':669 'references/pipeline-patterns.md':397 'references/sampling-strategies.md':531 'relev':1160 'remov':894 'repositori':1161 'request':867,1059 'request-scop':1058 'requir':733 'resourc':124 'return':445,1117 'revers':217 'right':68,177 'rout':46,210,275,298,311,355,1002 'router':83,199,238,293,307,492,842,1070,1079 'router.use':601,644 'rule':457,1118 'samber':3,1134 'samber/cc-skills-golang':1092,1106,1120,1131 'samber/oops':1142 'samber/slog':167 'samber/slog-':11,93,1153 'sampl':21,24,70,179,196,203,245,400,423,446,458,529,788,799,998,1172 'save':206 'scope':1060 'scrub':1030 'second':1001 'secur':1123 'see':394,528,666,777,1014,1091,1105,1119,1130 'send':84 'sentri':87,358,687 'sentryhandl':367 'sequenti':287,322,909,948 'servererrorlevel':629,652 'setup':665,1103 'share':622 'short':939 'shutdown':735,754,775,822,831 'silent':848 'similar':510 'singl':316 'sink':115,194,200,213,346,350,353,671,1013,1052 'six':268 'skill':141,1096,1111,1124,1136 'skill-golang-samber-slog' 'skip':641,1083 'sl':50 'slack':710 'slog':4,18,23,28,33,36,39,42,48,233,244,253,264,399,533,606,609,612,615,618,683,686,689,692,696,699,702,705,709,712,715,719,723,726,729,737,740,743,747,873,944,1098,1164,1171 'slog-chi':38,614 'slog-datadog':47,682,736 'slog-echo':41,608 'slog-fib':32,611 'slog-fluentd':698 'slog-formatt':27,252,532,943 'slog-gin':35,605,872 'slog-graylog':691 'slog-http':617 'slog-kafka':695,742 'slog-logrus':728 'slog-logstash':701 'slog-loki':688,739 'slog-multi':17,232,263,1163 'slog-nat':704 'slog-parquet':718,746 'slog-sampl':22,243,398,1170 'slog-sentri':685 'slog-slack':708 'slog-telegram':711 'slog-webhook':714 'slog-zap':722 'slog-zerolog':725 'slog.handler':101,121 'slog.levelerror':369,653 'slog.levelinfo':649 'slog.levelwarn':651 'slog.logvaluer':960 'slog.new':364,494,551 'slog.newjsonhandler':371,570 'slogformatter.errorformatter':559 'slogformatter.ipaddressformatter':564 'slogformatter.newformattermiddleware':553 'slogformatter.piiformatter':554 'sloggin.config':647 'sloggin.filter':657 'sloggin.ignorepath':658 'sloggin.newwithconfig':645 'slogmulti':495 'slogmulti.levelis':368 'slogmulti.newhandleinlinehandler':1043 'slogmulti.pipe':552 'slogmulti.router':365 'slogsampling.thresholdsamplingoption':497 'slogxxx.new':602 'source-samber' 'specif':664 'stage':1049 'standard':120 'stdout':362 'storag':717 'strategi':403,523,530 'strip':75 'struct':625 'structur':5,94,561,1138 'subset':1078 'succeed':325 'sum':288,303,812,904 'synchron':806 'telegram':713 'test':970,1040 'three':106 'threshold':416,479,501 'thresholdsamplingopt':249 'throughput':133,246,401 'tick':498 'time':455 'time-awar':454 'time.second':500 'timeformatt':577 'topic-agent' 'topic-agent-skills' 'topic-antigravity' 'topic-claude' 'topic-claude-code' 'topic-code' 'topic-codex' 'topic-coding' 'topic-copilot' 'topic-cursor' 'topic-gemini' 'topic-gemini-cli-extension' 'trace':1025 'trace/pii':198 'transform':139,256,536 'tri':321 'true':655 'type':963 'unexpect':1149 'uniform':407 'uniformsamplingopt':248 'unixtimestampformatt':578 'unmatch':846 'use':10,816,880,921,1018,1054 'user':443,555 'via':491 'visibl':430 'warn':901 'wast':186,219,471,791,1008 'webhook':716 'without':843,861,1050 'withrequestbodi':630,654 'withrequestid':633 'withresponsebodi':631 'withspanid':635 'withtraceid':634 'withuserag':632 'work':220,1009 'wrapper':888 'writer.close':763,840 'zap':724 'zerolog':727","prices":[{"id":"1dfe74aa-0f4e-4048-a4ed-3668be80743d","listingId":"1699f079-843d-4202-af37-f880ff970c14","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"samber","category":"cc-skills-golang","install_from":"skills.sh"},"createdAt":"2026-04-18T20:32:54.161Z"}],"sources":[{"listingId":"1699f079-843d-4202-af37-f880ff970c14","source":"github","sourceId":"samber/cc-skills-golang/golang-samber-slog","sourceUrl":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-samber-slog","isPrimary":false,"firstSeenAt":"2026-04-18T21:55:22.107Z","lastSeenAt":"2026-05-18T18:53:02.666Z"},{"listingId":"1699f079-843d-4202-af37-f880ff970c14","source":"skills_sh","sourceId":"samber/cc-skills-golang/golang-samber-slog","sourceUrl":"https://skills.sh/samber/cc-skills-golang/golang-samber-slog","isPrimary":true,"firstSeenAt":"2026-04-18T20:32:54.161Z","lastSeenAt":"2026-05-07T22:40:28.448Z"}],"details":{"listingId":"1699f079-843d-4202-af37-f880ff970c14","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"samber","slug":"golang-samber-slog","github":{"repo":"samber/cc-skills-golang","stars":1725,"topics":["agent","agent-skills","ai","antigravity","claude","claude-code","code","codex","coding","copilot","cursor","gemini","gemini-cli-extension","openclaw","opencode","plugin","skills","skillsmp","vibe-coding"],"license":"mit","html_url":"https://github.com/samber/cc-skills-golang","pushed_at":"2026-05-18T17:36:00Z","description":"🧑‍🎨 A collection of Golang agentic skills that works","skill_md_sha":"d506909111d63d242d3cd14175f1ac998d27efe8","skill_md_path":"skills/golang-samber-slog/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-samber-slog"},"layout":"multi","source":"github","category":"cc-skills-golang","frontmatter":{"name":"golang-samber-slog","license":"MIT","description":"Structured logging extensions for Golang using samber/slog-**** packages — multi-handler pipelines (slog-multi), log sampling (slog-sampling), attribute formatting (slog-formatter), HTTP middleware (slog-fiber, slog-gin, slog-chi, slog-echo), and backend routing (slog-datadog, slog-sentry, slog-loki, slog-syslog, slog-logstash, slog-graylog...). Apply when using or adopting slog, or when the codebase already imports any github.com/samber/slog-* package.","compatibility":"Designed for Claude Code or similar AI coding agents, and for projects using Golang."},"skills_sh_url":"https://skills.sh/samber/cc-skills-golang/golang-samber-slog"},"updatedAt":"2026-05-18T18:53:02.666Z"}}