[{"data":1,"prerenderedAt":2012},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-telemetry-logging":442,"-hu-telemetry-logging-surround":2007},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":183,"body":444,"description":2000,"extension":2001,"links":2002,"meta":2003,"navigation":2004,"path":184,"seo":2005,"stem":185,"__hash__":2006},"docs_hu\u002Fhu\u002F16.telemetry\u002F2.logging.md",{"type":445,"value":446,"toc":1990},"minimark",[447,460,487,492,504,514,525,531,534,628,643,651,654,669,742,752,756,774,925,931,1080,1092,1109,1113,1116,1183,1195,1242,1246,1266,1521,1532,1536,1543,1690,1708,1712,1733,1750,1754,1761,1914,1951,1972,1986],[448,449,450,451,455,456,459],"p",{},"Go-ban az első hideg zuhany gyakran a logolás: a nyers ",[452,453,454],"code",{},"log"," csomag egysoros, kontextus nélküli kimenete, vagy egy strukturált logger ",[452,457,458],{},"key=value"," fala, amiben egy stack trace egyetlen escape-elt stringgé lapul.",[448,461,462,463,470,471,474,475,478,479,482,483,486],{},"A kit válasza két rétegű. Az alap a ",[464,465,466,467],"strong",{},"standard ",[452,468,469],{},"log\u002Fslog",": az alkalmazáskód kizárólag ezt importálja, semmi kit-specifikusat. Fölé a ",[452,472,473],{},"logx"," csomag rak kompozíciót, és egy ",[464,476,477],{},"Monolog-formátumú konzol-handlert"," (",[452,480,481],{},"logx\u002Fmonolog","), ami dev módban pontosan úgy néz ki, mint amit PHP-ból ismersz: ",[452,484,485],{},"[dátum] channel.SZINT: üzenet {context}",", alatta PHP-stílusú, teljes útvonalú stack trace.",[488,489,491],"h2",{"id":490},"így-néz-ki","Így néz ki",[448,493,494,495,498,499,503],{},"Állítsd be a ",[452,496,497],{},"LOG_FORMAT=monolog","-ot (dev módban ezt érdemes), és a ",[500,501,502],"a",{"href":41},"shop"," konzolja így ír:",[505,506,512],"pre",{"className":507,"code":509,"language":510,"meta":511},[508],"language-text","[2026-07-15 10:23:44] shop.INFO: order placed {\"order_id\":\"o_8412\",\"total\":12990}\n[2026-07-15 10:23:45] shop.WARNING: payment provider slow, retrying {\"attempt\":2,\"provider\":\"stripe\"} in \u002Fhome\u002Fyou\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fservice\u002Fpayments.go:114\n","text","",[452,513,509],{"__ignoreMap":511},[448,515,516,517,520,521,524],{},"És amikor a ",[452,518,519],{},"PlaceOrder"," a kanonikus hibánkba, az ",[452,522,523],{},"ErrOutOfStock","-ba fut:",[505,526,529],{"className":527,"code":528,"language":510,"meta":511},[508],"[2026-07-15 10:23:46] shop.ERROR: request failed: shop_out_of_stock: shop: place order: inventory: decrement: insufficient stock {\"code\":\"shop_out_of_stock\",\"method\":\"POST\",\"path\":\"\u002Fapi\u002Fv1\u002Fshop\u002Forders\",\"status\":500}\nStack trace:\n#0 \u002Fhome\u002Fyou\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Frepository\u002Finventory.go(87): repository.(*InventoryRepository).Decrement()\n#1 \u002Fhome\u002Fyou\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fcore\u002Forders.go(41): core.(*Service).PlaceOrder()\n#2 \u002Fhome\u002Fyou\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fservice\u002Forders.go(52): service.(*OrderService).PlaceOrder()\n#3 \u002Fhome\u002Fyou\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fhttp\u002Fhandlers.go(61): http.(*Handler).PlaceOrder()\n#4 {main}\n",[452,530,528],{"__ignoreMap":511},[448,532,533],{},"Ami ebben a pár sorban dolgozik:",[535,536,537,559,571,581,598,611],"ul",{},[538,539,540,478,543,546,547,550,551,554,555,558],"li",{},[464,541,542],{},"A channel a service neve",[452,544,545],{},"OTEL_SERVICE_NAME",", üresen ",[452,548,549],{},"app","), több service logját egymás mellett futtatva is látod, ki beszél. A ",[452,552,553],{},"WARN"," szint Monolog-hűen ",[452,556,557],{},"WARNING","-ként jelenik meg.",[538,560,561,478,567,570],{},[464,562,563,564,566],{},"A hiba fejléce a ",[452,565,358],{},"-kóddal kezdődik",[452,568,569],{},"shop_out_of_stock: ...","), így a hibamód a JSON-rész elolvasása nélkül azonosítható; a kód a JSON contextben is ott van.",[538,572,573,576,577,580],{},[464,574,575],{},"A stack trace teljes, abszolút útvonalakkal",": a legtöbb terminál és editor kattinthatóvá teszi. A frame-ek a hiba keletkezési pontjától felfelé sorakoznak; a dependency-kből (Go module cache-ből) jövő frame-ek halványítva jelennek meg, a runtime-belépési frame-eket a ",[452,578,579],{},"{main}"," zárósor helyettesíti.",[538,582,583,586,587,590,591,593,594,597],{},[464,584,585],{},"A hiba-attr nem duplázódik",": a ",[452,588,589],{},"slog.Any(\"error\", err)"," értéke a fejlécbe és a stack-blokkba kerül, a JSON contextből kimarad (a ",[452,592,386],{}," duplikált ",[452,595,596],{},"cause"," attr-jával együtt).",[538,599,600,586,603,606,607,610],{},[464,601,602],{},"Szín csak terminálon",[452,604,605],{},"NO_COLOR","-t és a ",[452,608,609],{},"TERM=dumb","-ot tiszteletben tartja, pipe-olt kimenetben nincs escape-szemét.",[538,612,613,614,616,617,620,621,623,624,627],{},"Egy ",[452,615,553],{},"\u002F",[452,618,619],{},"ERROR"," rekord ",[452,622,358],{}," stack nélkül is kap lokációt: a hívási helye kerül a sor végére ",[452,625,626],{}," in file:line"," formában.",[448,629,630,631,633,634,637,638,642],{},"A fenti hibát a ",[452,632,386],{}," error handler logolta (",[452,635,636],{},"request failed",", method\u002Fpath\u002Fstatus attr-okkal). Neked csak a hibát kellett visszaadni a service-ből. A stacket nem itt fogták el: az ",[500,639,640],{"href":225},[452,641,358],{}," hiba születésekor rögzítette, és a wrap-lánc bármely pontjáról ugyanaz a teljes stack olvasható ki.",[644,645,646,647,650],"note",{},"Ez kizárólag konzol-formátum. Az OTLP log-bridge és a Sentry handler ugyanazt a strukturált rekordot kapja, mint eddig: a ",[452,648,649],{},"LOG_FORMAT"," csak azt dönti el, mit látsz a terminálban.",[488,652,204],{"id":653},"konfiguráció",[448,655,656,657,660,661,664,665,668],{},"A ",[452,658,659],{},"logx.Config"," a ",[452,662,663],{},"telemetry.Config"," ",[452,666,667],{},"Log"," mezője, a változók prefix nélkül, a top-szinten töltődnek:",[670,671,672,688],"table",{},[673,674,675],"thead",{},[676,677,678,682,685],"tr",{},[679,680,681],"th",{},"Változó",[679,683,684],{},"Default",[679,686,687],{},"Jelentés",[689,690,691,707,722],"tbody",{},[676,692,693,699,704],{},[694,695,696],"td",{},[452,697,698],{},"LOG_LEVEL",[694,700,701],{},[452,702,703],{},"INFO",[694,705,706],{},"a default logger minimális szintje (minden sinkre érvényes)",[676,708,709,714,719],{},[694,710,711],{},[452,712,713],{},"LOG_STDOUT",[694,715,716],{},[452,717,718],{},"false",[694,720,721],{},"prod módban is írjon konzolra (JSON); hagyd kikapcsolva, ha a collector a konténer-kimenetet szedi, különben duplán ingesztálsz",[676,723,724,728,735],{},[694,725,726],{},[452,727,649],{},[694,729,730,731,734],{},"üres (",[452,732,733],{},"auto",")",[694,736,737,738,741],{},"a konzol-formátum: üresen szöveg dev módban \u002F JSON prodban; ",[452,739,740],{},"monolog"," → Monolog-stílusú sorok, módtól függetlenül",[448,743,744,745,747,748,751],{},"Ismeretlen ",[452,746,649],{}," értékre a ",[452,749,750],{},"Config.Validate()"," (és így a boot) hibával áll le, nem csendben esik vissza.",[488,753,755],{"id":754},"a-kompozíció-fanout-és-levelfilter","A kompozíció: Fanout és LevelFilter",[448,757,758,759,762,763,766,767,769,770,773],{},"Monologban a logolást channelökből és stackekből raktad össze (",[452,760,761],{},"stack"," driver, több channel egy alá fogva, ",[452,764,765],{},"level"," küszöbökkel). A ",[452,768,473],{}," ugyanezt a gondolatot adja vissza: csak nem YAML-ben, hanem három kis ",[452,771,772],{},"slog.Handler","-kombinátorral:",[505,775,779],{"className":776,"code":777,"language":778,"meta":511,"style":511},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func ConsoleHandler(w io.Writer, cfg Config, dev bool, channel string) slog.Handler\nfunc Fanout(handlers ...slog.Handler) slog.Handler          \u002F\u002F ~ Monolog stack driver\nfunc LevelFilter(min slog.Level, next slog.Handler) slog.Handler \u002F\u002F ~ channel-szintű level küszöb\n","go",[452,780,781,847,883],{"__ignoreMap":511},[782,783,786,790,794,797,801,805,808,811,814,817,820,822,825,829,831,834,837,839,842,844],"span",{"class":784,"line":785},"line",1,[782,787,789],{"class":788},"sMK4o","func",[782,791,793],{"class":792},"s2Zo4"," ConsoleHandler",[782,795,796],{"class":788},"(",[782,798,800],{"class":799},"sHdIc","w",[782,802,804],{"class":803},"sBMFI"," io",[782,806,807],{"class":788},".",[782,809,810],{"class":803},"Writer",[782,812,813],{"class":788},",",[782,815,816],{"class":799}," cfg",[782,818,819],{"class":803}," Config",[782,821,813],{"class":788},[782,823,824],{"class":799}," dev",[782,826,828],{"class":827},"spNyl"," bool",[782,830,813],{"class":788},[782,832,833],{"class":799}," channel",[782,835,836],{"class":827}," string",[782,838,734],{"class":788},[782,840,841],{"class":803}," slog",[782,843,807],{"class":788},[782,845,846],{"class":803},"Handler\n",[782,848,850,852,855,857,860,863,866,868,871,873,875,877,879],{"class":784,"line":849},2,[782,851,789],{"class":788},[782,853,854],{"class":792}," Fanout",[782,856,796],{"class":788},[782,858,859],{"class":799},"handlers",[782,861,862],{"class":788}," ...",[782,864,865],{"class":803},"slog",[782,867,807],{"class":788},[782,869,870],{"class":803},"Handler",[782,872,734],{"class":788},[782,874,841],{"class":803},[782,876,807],{"class":788},[782,878,870],{"class":803},[782,880,882],{"class":881},"sHwdD","          \u002F\u002F ~ Monolog stack driver\n",[782,884,886,888,891,893,896,898,900,903,905,908,910,912,914,916,918,920,922],{"class":784,"line":885},3,[782,887,789],{"class":788},[782,889,890],{"class":792}," LevelFilter",[782,892,796],{"class":788},[782,894,895],{"class":799},"min",[782,897,841],{"class":803},[782,899,807],{"class":788},[782,901,902],{"class":803},"Level",[782,904,813],{"class":788},[782,906,907],{"class":799}," next",[782,909,841],{"class":803},[782,911,807],{"class":788},[782,913,870],{"class":803},[782,915,734],{"class":788},[782,917,841],{"class":803},[782,919,807],{"class":788},[782,921,870],{"class":803},[782,923,924],{"class":881}," \u002F\u002F ~ channel-szintű level küszöb\n",[448,926,656,927,930],{},[452,928,929],{},"telemetry.Setup"," pontosan így építi a default loggert:",[505,932,934],{"className":776,"code":933,"language":778,"meta":511,"style":511},"slog.SetDefault(slog.New(\n    logx.LevelFilter(cfg.Log.Level, logx.Fanout(\n        logx.ConsoleHandler(os.Stdout, cfg.Log, dev, serviceName), \u002F\u002F dev vagy LOG_STDOUT esetén\n        otelHandle.SlogHandler(),   \u002F\u002F OTLP bridge, prodban\n        sentryHandle.SlogHandler(), \u002F\u002F Sentry capture, ha a DSN be van állítva\n    )),\n))\n",[452,935,936,958,993,1036,1053,1068,1074],{"__ignoreMap":511},[782,937,938,941,943,946,948,950,952,955],{"class":784,"line":785},[782,939,865],{"class":940},"sTEyZ",[782,942,807],{"class":788},[782,944,945],{"class":792},"SetDefault",[782,947,796],{"class":788},[782,949,865],{"class":940},[782,951,807],{"class":788},[782,953,954],{"class":792},"New",[782,956,957],{"class":788},"(\n",[782,959,960,963,965,968,970,973,975,977,979,981,983,986,988,991],{"class":784,"line":849},[782,961,962],{"class":940},"    logx",[782,964,807],{"class":788},[782,966,967],{"class":792},"LevelFilter",[782,969,796],{"class":788},[782,971,972],{"class":940},"cfg",[782,974,807],{"class":788},[782,976,667],{"class":940},[782,978,807],{"class":788},[782,980,902],{"class":940},[782,982,813],{"class":788},[782,984,985],{"class":940}," logx",[782,987,807],{"class":788},[782,989,990],{"class":792},"Fanout",[782,992,957],{"class":788},[782,994,995,998,1000,1003,1005,1008,1010,1013,1015,1017,1019,1021,1023,1025,1027,1030,1033],{"class":784,"line":885},[782,996,997],{"class":940},"        logx",[782,999,807],{"class":788},[782,1001,1002],{"class":792},"ConsoleHandler",[782,1004,796],{"class":788},[782,1006,1007],{"class":940},"os",[782,1009,807],{"class":788},[782,1011,1012],{"class":940},"Stdout",[782,1014,813],{"class":788},[782,1016,816],{"class":940},[782,1018,807],{"class":788},[782,1020,667],{"class":940},[782,1022,813],{"class":788},[782,1024,824],{"class":940},[782,1026,813],{"class":788},[782,1028,1029],{"class":940}," serviceName",[782,1031,1032],{"class":788},"),",[782,1034,1035],{"class":881}," \u002F\u002F dev vagy LOG_STDOUT esetén\n",[782,1037,1039,1042,1044,1047,1050],{"class":784,"line":1038},4,[782,1040,1041],{"class":940},"        otelHandle",[782,1043,807],{"class":788},[782,1045,1046],{"class":792},"SlogHandler",[782,1048,1049],{"class":788},"(),",[782,1051,1052],{"class":881},"   \u002F\u002F OTLP bridge, prodban\n",[782,1054,1056,1059,1061,1063,1065],{"class":784,"line":1055},5,[782,1057,1058],{"class":940},"        sentryHandle",[782,1060,807],{"class":788},[782,1062,1046],{"class":792},[782,1064,1049],{"class":788},[782,1066,1067],{"class":881}," \u002F\u002F Sentry capture, ha a DSN be van állítva\n",[782,1069,1071],{"class":784,"line":1070},6,[782,1072,1073],{"class":788},"    )),\n",[782,1075,1077],{"class":784,"line":1076},7,[782,1078,1079],{"class":788},"))\n",[448,1081,656,1082,1084,1085,1087,1088,1091],{},[452,1083,967],{}," azért ül legkívül, mert nem minden leaf-handler szűr magától: az OTLP bridge például mindent továbbít, amit kap. A ",[452,1086,990],{}," minden handlernek a rekord saját klónját adja, és az ",[452,1089,1090],{},"Enabled","-et handlerenkénti gate-ként tiszteli: egyetlen handler esetén allokáció nélkül, önmagaként tér vissza.",[448,1093,1094,1095,1098,1099,1098,1102,664,1105,1108],{},"Chassis-on belül ezt sosem írod meg: a ",[452,1096,1097],{},"server.Run"," \u002F ",[452,1100,1101],{},"worker.Run",[452,1103,1104],{},"realtime.Run",[500,1106,1107],{"href":180},"megkapja készen",". Közvetlenül akkor nyúlsz hozzá, ha egy nem-chassis binárisban (CLI, migrátor) ugyanezt a konzol-élményt akarod, vagy egy plusz sinket (pl. fájl-handlert) fűznél a fanoutba.",[488,1110,1112],{"id":1111},"logxmonolog-közelről","logx\u002Fmonolog közelről",[448,1114,1115],{},"A formátum-driver önálló csomag, egyetlen konstruktorral:",[505,1117,1119],{"className":776,"code":1118,"language":778,"meta":511,"style":511},"import \"github.com\u002Fgp-system\u002Ftelemetry\u002Flogx\u002Fmonolog\"\n\nfunc NewHandler(w io.Writer, level slog.Level, channel string) *Handler\n",[452,1120,1121,1136,1142],{"__ignoreMap":511},[782,1122,1123,1127,1130,1133],{"class":784,"line":785},[782,1124,1126],{"class":1125},"s7zQu","import",[782,1128,1129],{"class":788}," \"",[782,1131,1132],{"class":803},"github.com\u002Fgp-system\u002Ftelemetry\u002Flogx\u002Fmonolog",[782,1134,1135],{"class":788},"\"\n",[782,1137,1138],{"class":784,"line":849},[782,1139,1141],{"emptyLinePlaceholder":1140},true,"\n",[782,1143,1144,1146,1149,1151,1153,1155,1157,1159,1161,1164,1166,1168,1170,1172,1174,1176,1178,1181],{"class":784,"line":885},[782,1145,789],{"class":788},[782,1147,1148],{"class":792}," NewHandler",[782,1150,796],{"class":788},[782,1152,800],{"class":799},[782,1154,804],{"class":803},[782,1156,807],{"class":788},[782,1158,810],{"class":803},[782,1160,813],{"class":788},[782,1162,1163],{"class":799}," level",[782,1165,841],{"class":803},[782,1167,807],{"class":788},[782,1169,902],{"class":803},[782,1171,813],{"class":788},[782,1173,833],{"class":799},[782,1175,836],{"class":827},[782,1177,734],{"class":788},[782,1179,1180],{"class":788}," *",[782,1182,846],{"class":803},[448,1184,656,1185,1187,1188,1191,1192,1194],{},[452,1186,497],{}," esetén a ",[452,1189,1190],{},"logx.ConsoleHandler"," ezt adja vissza, de bárhova bekötheted, ahol egy ",[452,1193,772],{}," elvárt. Amit érdemes tudni róla:",[535,1196,1197,1217,1236],{},[538,1198,1199,1204,1205,1208,1209,1212,1213,1216],{},[464,1200,1201,1203],{},[452,1202,865],{},"-natív."," A ",[452,1206,1207],{},"With(...)"," attr-ok és a ",[452,1210,1211],{},"WithGroup(...)"," csoportok helyesen, beágyazott JSON-ként jelennek meg a context-részben (",[452,1214,1215],{},"\"req\":{\"status\":200}",").",[538,1218,1219,1224,1225,1227,1228,1231,1232,1235],{},[464,1220,1221,1222,807],{},"A stackek forrása az ",[452,1223,358],{}," A handler a rekord első hiba-értékű attr-ját emeli ki; ha az (vagy a wrap-láncában bármi) ",[452,1226,358],{}," hiba, az ",[452,1229,1230],{},"errs.FullFrames"," teljes útvonalú stackje renderelődik. Egy sima ",[452,1233,1234],{},"errors.New"," hibánál nincs stack-blokk: helyette a log hívási helye kerül a sorba.",[538,1237,1238,1241],{},[464,1239,1240],{},"Párhuzamos futásban is atomi sorok",": a handler klónjai közös mutexen írnak, torn write nincs.",[488,1243,1245],{"id":1244},"strukturált-hibák-a-logban-errs-nélkül-semmi-ilyen-nincs","Strukturált hibák a logban: errs nélkül semmi ilyen nincs",[448,1247,1248,1249,1253,1254,1257,1258,1261,1262,1265],{},"A Monolog-formátum a stack trace-t az ",[500,1250,1251],{"href":225},[452,1252,358],{}," hibákból nyeri, és ez nem konzol-privilégium: az ",[452,1255,1256],{},"*errs.Error"," implementálja a ",[452,1259,1260],{},"slog.LogValuer","-t, így ",[464,1263,1264],{},"minden"," strukturált sinkben (JSON konzol, OTLP) a hiba csoportként bomlik ki:",[505,1267,1271],{"className":1268,"code":1269,"language":1270,"meta":511,"style":511},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"error\": {\n  \"msg\": \"shop: place order: inventory: decrement: insufficient stock\",\n  \"code\": \"shop_out_of_stock\",\n  \"public\": \"Egy vagy több tétel nincs elegendő készleten.\",\n  \"chain\": [ { \"msg\": \"shop: place order\", \"file\": \"service\u002Forders.go\", \"line\": 52, \"...\" : \"…\" }, \"…\" ],\n  \"stack\": [ { \"file\": \"repository\u002Finventory.go\", \"line\": 87, \"...\" : \"…\" }, \"…\" ]\n}\n","json",[452,1272,1273,1290,1313,1332,1352,1447,1516],{"__ignoreMap":511},[782,1274,1275,1278,1282,1284,1287],{"class":784,"line":785},[782,1276,1277],{"class":788},"\"",[782,1279,1281],{"class":1280},"sfazB","error",[782,1283,1277],{"class":788},[782,1285,1286],{"class":940},": ",[782,1288,1289],{"class":788},"{\n",[782,1291,1292,1295,1298,1300,1303,1305,1308,1310],{"class":784,"line":849},[782,1293,1294],{"class":788},"  \"",[782,1296,1297],{"class":827},"msg",[782,1299,1277],{"class":788},[782,1301,1302],{"class":788},":",[782,1304,1129],{"class":788},[782,1306,1307],{"class":1280},"shop: place order: inventory: decrement: insufficient stock",[782,1309,1277],{"class":788},[782,1311,1312],{"class":788},",\n",[782,1314,1315,1317,1319,1321,1323,1325,1328,1330],{"class":784,"line":885},[782,1316,1294],{"class":788},[782,1318,452],{"class":827},[782,1320,1277],{"class":788},[782,1322,1302],{"class":788},[782,1324,1129],{"class":788},[782,1326,1327],{"class":1280},"shop_out_of_stock",[782,1329,1277],{"class":788},[782,1331,1312],{"class":788},[782,1333,1334,1336,1339,1341,1343,1345,1348,1350],{"class":784,"line":1038},[782,1335,1294],{"class":788},[782,1337,1338],{"class":827},"public",[782,1340,1277],{"class":788},[782,1342,1302],{"class":788},[782,1344,1129],{"class":788},[782,1346,1347],{"class":1280},"Egy vagy több tétel nincs elegendő készleten.",[782,1349,1277],{"class":788},[782,1351,1312],{"class":788},[782,1353,1354,1356,1359,1361,1363,1366,1369,1371,1373,1375,1377,1379,1382,1384,1386,1388,1391,1393,1395,1397,1400,1402,1404,1406,1408,1410,1412,1416,1418,1420,1423,1425,1428,1430,1433,1435,1438,1440,1442,1444],{"class":784,"line":1055},[782,1355,1294],{"class":788},[782,1357,1358],{"class":827},"chain",[782,1360,1277],{"class":788},[782,1362,1302],{"class":788},[782,1364,1365],{"class":788}," [",[782,1367,1368],{"class":788}," {",[782,1370,1129],{"class":788},[782,1372,1297],{"class":803},[782,1374,1277],{"class":788},[782,1376,1302],{"class":788},[782,1378,1129],{"class":788},[782,1380,1381],{"class":1280},"shop: place order",[782,1383,1277],{"class":788},[782,1385,813],{"class":788},[782,1387,1129],{"class":788},[782,1389,1390],{"class":803},"file",[782,1392,1277],{"class":788},[782,1394,1302],{"class":788},[782,1396,1129],{"class":788},[782,1398,1399],{"class":1280},"service\u002Forders.go",[782,1401,1277],{"class":788},[782,1403,813],{"class":788},[782,1405,1129],{"class":788},[782,1407,784],{"class":803},[782,1409,1277],{"class":788},[782,1411,1302],{"class":788},[782,1413,1415],{"class":1414},"sbssI"," 52",[782,1417,813],{"class":788},[782,1419,1129],{"class":788},[782,1421,1422],{"class":803},"...",[782,1424,1277],{"class":788},[782,1426,1427],{"class":788}," :",[782,1429,1129],{"class":788},[782,1431,1432],{"class":1280},"…",[782,1434,1277],{"class":788},[782,1436,1437],{"class":788}," },",[782,1439,1129],{"class":788},[782,1441,1432],{"class":1280},[782,1443,1277],{"class":788},[782,1445,1446],{"class":788}," ],\n",[782,1448,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1474,1476,1478,1480,1482,1484,1486,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509,1511,1513],{"class":784,"line":1070},[782,1450,1294],{"class":788},[782,1452,761],{"class":827},[782,1454,1277],{"class":788},[782,1456,1302],{"class":788},[782,1458,1365],{"class":788},[782,1460,1368],{"class":788},[782,1462,1129],{"class":788},[782,1464,1390],{"class":803},[782,1466,1277],{"class":788},[782,1468,1302],{"class":788},[782,1470,1129],{"class":788},[782,1472,1473],{"class":1280},"repository\u002Finventory.go",[782,1475,1277],{"class":788},[782,1477,813],{"class":788},[782,1479,1129],{"class":788},[782,1481,784],{"class":803},[782,1483,1277],{"class":788},[782,1485,1302],{"class":788},[782,1487,1488],{"class":1414}," 87",[782,1490,813],{"class":788},[782,1492,1129],{"class":788},[782,1494,1422],{"class":803},[782,1496,1277],{"class":788},[782,1498,1427],{"class":788},[782,1500,1129],{"class":788},[782,1502,1432],{"class":1280},[782,1504,1277],{"class":788},[782,1506,1437],{"class":788},[782,1508,1129],{"class":788},[782,1510,1432],{"class":1280},[782,1512,1277],{"class":788},[782,1514,1515],{"class":788}," ]\n",[782,1517,1518],{"class":784,"line":1076},[782,1519,1520],{"class":788},"}\n",[448,1522,1523,1524,1527,1528,1531],{},"Ugyanaz a hiba tehát dev konzolon PHP-stílusú stack trace, prod logban gépi feldolgozásra kész JSON, a ",[500,1525,1526],{"href":194},"Sentryben"," pedig kód szerint csoportosított issue, mindez egyetlen ",[452,1529,1530],{},"return err","-ből.",[488,1533,1535],{"id":1534},"monolog-fogalmak-megfelelői","Monolog-fogalmak megfelelői",[448,1537,1538,1539,1542],{},"Ha a ",[452,1540,1541],{},"config\u002Flogging.php"," felől érkezel, így képződnek le a fogalmak:",[670,1544,1545,1558],{},[673,1546,1547],{},[676,1548,1549,1552,1555],{},[679,1550,1551],{},"Monolog",[679,1553,1554],{},"gpsystem",[679,1556,1557],{},"Hol",[689,1559,1560,1577,1595,1614,1631,1650,1665,1679],{},[676,1561,1562,1565,1570],{},[694,1563,1564],{},"channel neve",[694,1566,1567,1568,734],{},"a service neve (",[452,1569,545],{},[694,1571,1572,1573,1576],{},"a monolog-sor ",[452,1574,1575],{},"shop.INFO"," része",[676,1578,1579,1584,1589],{},[694,1580,1581,1583],{},[452,1582,761],{}," driver (több channel egyben)",[694,1585,1586],{},[452,1587,1588],{},"logx.Fanout",[694,1590,1591,1592,1594],{},"a ",[452,1593,929],{}," építi",[676,1596,1597,1603,1611],{},[694,1598,1599,1600,1602],{},"channel ",[452,1601,765],{}," küszöb",[694,1604,1605,1607,1608],{},[452,1606,698],{}," + ",[452,1609,1610],{},"logx.LevelFilter",[694,1612,1613],{},"env",[676,1615,1616,1625,1628],{},[694,1617,1618,1098,1621,1624],{},[452,1619,1620],{},"single",[452,1622,1623],{},"daily"," file driver",[694,1626,1627],{},"nincs (stdout az egyetlen cél)",[694,1629,1630],{},"lásd lentebb",[676,1632,1633,1640,1648],{},[694,1634,1635,1636,1639],{},"formatter (",[452,1637,1638],{},"LineFormatter",", JSON)",[694,1641,1642,478,1644,1098,1646,734],{},[452,1643,649],{},[452,1645,733],{},[452,1647,740],{},[694,1649,1613],{},[676,1651,1652,1657,1662],{},[694,1653,1654],{},[452,1655,1656],{},"Log::info('msg', ['ctx' => ...])",[694,1658,1659],{},[452,1660,1661],{},"slog.InfoContext(ctx, \"msg\", slog.Any(\"ctx\", ...))",[694,1663,1664],{},"app-kód",[676,1666,1667,1672,1677],{},[694,1668,1669],{},[452,1670,1671],{},"Log::withContext([...])",[694,1673,1674],{},[452,1675,1676],{},"logger := slog.Default().With(...)",[694,1678,1664],{},[676,1680,1681,1684,1687],{},[694,1682,1683],{},"Sentry \u002F Slack channel a stackben",[694,1685,1686],{},"a fanout OTLP- és Sentry-ága",[694,1688,1689],{},"automatikus",[448,1691,1692,1693,1696,1697,1700,1701,1704,1705,1707],{},"Egy csavar van, ami Monologban nem létezett: a ",[464,1694,1695],{},"context a trace-t is hordozza",". A ",[452,1698,1699],{},"slog.InfoContext"," ctx-e nemcsak attr-forrás: az köti a logsort a ",[500,1702,1703],{"href":189},"trace-hez"," és a ",[500,1706,193],{"href":194}," breadcrumb-hubhoz.",[488,1709,1711],{"id":1710},"hova-lettek-a-fájl-logok","Hova lettek a fájl-logok?",[448,1713,1714,1715,1718,1719,1725,1726,1729,1730,1732],{},"Sehova, és ez szándékos. Nincs ",[452,1716,1717],{},"storage\u002Flogs\u002Fshop.log",": a kit a ",[500,1720,1724],{"href":1721,"rel":1722},"https:\u002F\u002F12factor.net\u002Flogs",[1723],"nofollow","12-factor"," elvet követi, a logok ",[464,1727,1728],{},"eseményfolyamként a stdout-ra"," mennek, a gyűjtés-forgatás-őrzés pedig a platform dolga. Konténerben a runtime úgyis elkapja a stdout-ot; a collectorod (vagy ",[452,1731,713],{}," + a konténer-logok) viszik tovább. Prodban jellemzően nem is a konzol a fő csatorna, hanem az OTLP log-bridge: a logok ugyanabba a pipeline-ba érkeznek, mint a trace-ek és metrikák, trace ID-val összekötve.",[448,1734,1735,1736,1739,1740,1742,1743,1746,1747,1749],{},"Ha lokálisan mégis fájlba akarod fogni: ",[452,1737,1738],{},"go run .\u002Fcmd\u002Fshop 2>&1 | tee shop.log",": a monolog-handler pipe-ban automatikusan színek nélkül ír. (Dev módban a kérésenkénti access-log sorokat nem a ",[452,1741,865],{},", hanem a router saját request loggere írja (",[452,1744,1745],{},"chimiddleware.Logger","), ezek formátuma ezért nem követi a ",[452,1748,649],{},"-ot.)",[488,1751,1753],{"id":1752},"hogyan-logolj-a-service-ekben","Hogyan logolj a service-ekben",[448,1755,1756,1757,1760],{},"Két szabály van, és mindkettő a ",[452,1758,1759],{},"context.Context","-ről szól:",[505,1762,1764],{"className":776,"code":1763,"language":778,"meta":511,"style":511},"func (s *OrderService) PlaceOrder(ctx context.Context, in PlaceOrder) error {\n    \u002F\u002F 1. Mindig a *Context változatot, a kérés ctx-ével:\n    slog.InfoContext(ctx, \"order placed\",\n        slog.String(\"order_id\", order.ID),\n        slog.Int(\"total\", order.Total))\n    \u002F\u002F ...\n}\n",[452,1765,1766,1814,1819,1844,1876,1905,1910],{"__ignoreMap":511},[782,1767,1768,1770,1772,1775,1778,1781,1783,1786,1788,1791,1794,1796,1799,1801,1804,1806,1808,1811],{"class":784,"line":785},[782,1769,789],{"class":788},[782,1771,478],{"class":788},[782,1773,1774],{"class":799},"s ",[782,1776,1777],{"class":788},"*",[782,1779,1780],{"class":803},"OrderService",[782,1782,734],{"class":788},[782,1784,1785],{"class":792}," PlaceOrder",[782,1787,796],{"class":788},[782,1789,1790],{"class":799},"ctx",[782,1792,1793],{"class":803}," context",[782,1795,807],{"class":788},[782,1797,1798],{"class":803},"Context",[782,1800,813],{"class":788},[782,1802,1803],{"class":799}," in",[782,1805,1785],{"class":803},[782,1807,734],{"class":788},[782,1809,1810],{"class":827}," error",[782,1812,1813],{"class":788}," {\n",[782,1815,1816],{"class":784,"line":849},[782,1817,1818],{"class":881},"    \u002F\u002F 1. Mindig a *Context változatot, a kérés ctx-ével:\n",[782,1820,1821,1824,1826,1829,1831,1833,1835,1837,1840,1842],{"class":784,"line":885},[782,1822,1823],{"class":940},"    slog",[782,1825,807],{"class":788},[782,1827,1828],{"class":792},"InfoContext",[782,1830,796],{"class":788},[782,1832,1790],{"class":940},[782,1834,813],{"class":788},[782,1836,1129],{"class":788},[782,1838,1839],{"class":1280},"order placed",[782,1841,1277],{"class":788},[782,1843,1312],{"class":788},[782,1845,1846,1849,1851,1854,1856,1858,1861,1863,1865,1868,1870,1873],{"class":784,"line":1038},[782,1847,1848],{"class":940},"        slog",[782,1850,807],{"class":788},[782,1852,1853],{"class":792},"String",[782,1855,796],{"class":788},[782,1857,1277],{"class":788},[782,1859,1860],{"class":1280},"order_id",[782,1862,1277],{"class":788},[782,1864,813],{"class":788},[782,1866,1867],{"class":940}," order",[782,1869,807],{"class":788},[782,1871,1872],{"class":940},"ID",[782,1874,1875],{"class":788},"),\n",[782,1877,1878,1880,1882,1885,1887,1889,1892,1894,1896,1898,1900,1903],{"class":784,"line":1055},[782,1879,1848],{"class":940},[782,1881,807],{"class":788},[782,1883,1884],{"class":792},"Int",[782,1886,796],{"class":788},[782,1888,1277],{"class":788},[782,1890,1891],{"class":1280},"total",[782,1893,1277],{"class":788},[782,1895,813],{"class":788},[782,1897,1867],{"class":940},[782,1899,807],{"class":788},[782,1901,1902],{"class":940},"Total",[782,1904,1079],{"class":788},[782,1906,1907],{"class":784,"line":1070},[782,1908,1909],{"class":881},"    \u002F\u002F ...\n",[782,1911,1912],{"class":784,"line":1076},[782,1913,1520],{"class":788},[1915,1916,1917,1938],"ol",{},[538,1918,1919,1933,1934,1937],{},[464,1920,1921,1098,1923,1098,1926,1929,1930,807],{},[452,1922,1699],{},[452,1924,1925],{},"WarnContext",[452,1927,1928],{},"ErrorContext",", sosem ",[452,1931,1932],{},"slog.Info"," A ctx hordozza az aktív trace-t: az ",[500,1935,1936],{"href":189},"otelslog bridge"," ebből fűzi a trace\u002Fspan ID-t a rekordhoz, a Sentry handler ebből linkeli a hibát a trace waterfallhoz, és a breadcrumb-ok is a kérés hubjára kerülnek. Ctx nélküli log = korrelálatlan log.",[538,1939,1940,1946,1947,1950],{},[464,1941,1942,1943,1945],{},"Hibát ",[452,1944,589],{},"-rel adj át",", ne ",[452,1948,1949],{},"err.Error()"," stringgel: így marad meg a strukturált lánc, a stack és a kód minden sink számára.",[448,1952,1953,1954,1957,1958,1961,1962,1964,1965,1968,1969,1971],{},"Loggert injektálni, konstruálni, DI-ba kötni nem kell: a chassis a ",[452,1955,1956],{},"slog.Default()","-ot állítja be, a csomag-szintű ",[452,1959,1960],{},"slog.*Context"," hívások pont jók. Az ",[452,1963,619],{}," szint pedig nem „hangos log\": az egyben ",[500,1966,1967],{"href":194},"Sentry event is",": 5xx-et a kit logol helyetted, te akkor logolj ",[452,1970,619],{},"-t, ha valami tényleg incidens.",[1973,1974,1975,1976,1982,1983,1985],"tip",{},"A várható, kliens-hibás kimeneteket (404, 409, validáció) nem logolod és nem is kell: egy ",[500,1977,1978,1979,1981],{"href":225},"státusz-mappelt ",[452,1980,358],{}," hiba"," 4xx-ként megy ki, ",[452,1984,636],{}," sor és Sentry event nélkül.",[1987,1988,1989],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":511,"searchDepth":849,"depth":849,"links":1991},[1992,1993,1994,1995,1996,1997,1998,1999],{"id":490,"depth":849,"text":491},{"id":653,"depth":849,"text":204},{"id":754,"depth":849,"text":755},{"id":1111,"depth":849,"text":1112},{"id":1244,"depth":849,"text":1245},{"id":1534,"depth":849,"text":1535},{"id":1710,"depth":849,"text":1711},{"id":1752,"depth":849,"text":1753},"Standard log\u002Fslog, komponálva, és egy Monolog-formátumú dev konzol, PHP-stílusú stack trace-ekkel.","md",null,{},{"icon":186},{"title":183,"description":2000},"cB64DJJkjjS4DmfJuWOFoKcS_h8SA3h0tKKv7B7PV-c",[2008,2010],{"title":52,"path":180,"stem":181,"description":2009,"icon":175,"children":-1},"A telemetry facade: logolás, OpenTelemetry és Sentry egyetlen hívással, egy shutdown-garanciával.",{"title":188,"path":189,"stem":190,"description":2011,"icon":191,"children":-1},"Trace-ek, metrikák és logok egy hívással, HTTP, adatbázis, queue és S3 instrumentáció, standard OTEL_* konfigurációval.",1785445885040]