[{"data":1,"prerenderedAt":1084},["ShallowReactive",2],{"content:\u002F2025\u002F10\u002Fgo-zap":3,"surround:\u002F2025\u002F10\u002Fgo-zap":1073},{"id":4,"title":5,"body":6,"categories":1051,"date":1053,"description":1054,"draft":1055,"extension":1056,"image":1057,"meta":1058,"navigation":177,"path":1060,"permalink":1057,"published":1057,"readingTime":1061,"recommend":1057,"references":1057,"seo":1066,"sitemap":1067,"stem":1068,"tags":1069,"type":1070,"updated":1071,"__hash__":1072},"content\u002Fposts\u002F2025\u002F10\u002Fgo-zap.md","Go Zap实现日志双写和切割",{"type":7,"value":8,"toc":1044},"minimark",[9,22,41,46,49,80,84,91,118,122,125,146,150,952,956,959,1032,1040],[10,11,12,13,17,18,21],"p",{},"在 Go 项目中，日志系统是不可或缺的一部分。它不仅帮助我们定位问题、分析性能，还能在生产环境中追踪系统行为。\n本文将介绍如何使用 ",[14,15,16],"strong",{},"Zap + Lumberjack"," 实现",[14,19,20],{},"高性能双写日志系统","：",[23,24,25,31,36],"ul",{},[26,27,28],"li",{},[14,29,30],{},"全量日志（控制台 + 文件）",[26,32,33],{},[14,34,35],{},"错误日志（单独文件）",[26,37,38],{},[14,39,40],{},"自动日志切割与压缩",[42,43,45],"h2",{"id":44},"一为什么选择-zap","一、为什么选择 Zap",[10,47,48],{},"Zap 是 Uber 开源的高性能日志库，号称“Go 语言最快的日志库之一”。\n它有以下优点：",[23,50,51,62,68,74],{},[26,52,53,56,57,61],{},[14,54,55],{},"极致性能","：无反射、零分配（",[58,59,60],"code",{"code":60},"Logger"," 模式）",[26,63,64,67],{},[14,65,66],{},"结构化日志","：天然支持键值对输出",[26,69,70,73],{},[14,71,72],{},"灵活扩展","：可自定义 encoder、core、writer",[26,75,76,79],{},[14,77,78],{},"生态完善","：支持 Lumberjack、K8s、ELK 等集成",[42,81,83],{"id":82},"二为什么要用-lumberjack","二、为什么要用 Lumberjack",[10,85,86,87,90],{},"在长时间运行的服务中，日志会不断增大。\n",[14,88,89],{},"Lumberjack"," 是一个简单可靠的日志文件切割库，它支持：",[23,92,93,100,106,112],{},[26,94,95,96,99],{},"按文件大小切割（",[58,97,98],{"code":98},"MaxSize","）",[26,101,102,103,99],{},"按天数保留（",[58,104,105],{"code":105},"MaxAge",[26,107,108,109,99],{},"保留备份数量（",[58,110,111],{"code":111},"MaxBackups",[26,113,114,115,99],{},"自动压缩（",[58,116,117],{"code":117},"Compress",[42,119,121],{"id":120},"三实现效果","三、实现效果",[10,123,124],{},"我们希望实现如下效果：",[126,127,128,134,140,143],"ol",{},[26,129,130,133],{},[14,131,132],{},"server.log","\n保存所有 Info 级别及以上的日志（包括终端输出）",[26,135,136,139],{},[14,137,138],{},"error.log","\n仅保存 Error 级别及以上的日志",[26,141,142],{},"日志文件自动切割、压缩",[26,144,145],{},"控制台实时输出",[42,147,149],{"id":148},"四完整代码示例","四、完整代码示例",[151,152,157],"pre",{"className":153,"code":154,"language":155,"meta":156,"style":156},"language-go shiki shiki-themes github-light github-dark","package main\n\nimport (\n\t\"io\"\n\t\"os\"\n\n\t\"go.uber.org\u002Fzap\"\n\t\"go.uber.org\u002Fzap\u002Fzapcore\"\n\t\"gopkg.in\u002Fnatefinch\u002Flumberjack.v2\"\n)\n\nfunc main() {\n\t\u002F\u002F 定义编码器：使用 JSON 格式输出\n\tencoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())\n\n\t\u002F\u002F 全量日志：控制台 + 文件\n\tcoreFull := zapcore.NewCore(encoder, getFullLogWriter(), zapcore.InfoLevel)\n\n\t\u002F\u002F 错误日志：仅文件\n\tcoreError := zapcore.NewCore(encoder, getErrorLogWriter(), zapcore.ErrorLevel)\n\n\t\u002F\u002F 合并两个 core\n\tcore := zapcore.NewTee(coreFull, coreError)\n\n\t\u002F\u002F 构建 logger\n\tlogger := zap.New(core)\n\tsugarLogger := logger.Sugar()\n\n\t\u002F\u002F 测试日志\n\tsugarLogger.Debug(\"这条不会输出，因为级别低于 Info\")\n\tsugarLogger.Info(\"系统启动成功\")\n\tsugarLogger.Error(\"这是错误日志\")\n}\n\n\u002F\u002F 全量日志（控制台 + 文件）\nfunc getFullLogWriter() zapcore.WriteSyncer {\n\tfullLogger := &lumberjack.Logger{\n\t\tFilename:   \".\u002Fserver.log\", \u002F\u002F 日志文件路径\n\t\tMaxSize:    10,             \u002F\u002F 单个文件最大 10MB\n\t\tMaxBackups: 5,              \u002F\u002F 保留 5 个旧文件\n\t\tMaxAge:     30,             \u002F\u002F 保留 30 天\n\t\tCompress:   true,           \u002F\u002F 启用压缩\n\t}\n\tws := io.MultiWriter(fullLogger, os.Stdout)\n\treturn zapcore.AddSync(ws)\n}\n\n\u002F\u002F 错误日志（仅文件）\nfunc getErrorLogWriter() zapcore.WriteSyncer {\n\terrLogger := &lumberjack.Logger{\n\t\tFilename:   \".\u002Ferror.log\",\n\t\tMaxSize:    10,\n\t\tMaxBackups: 5,\n\t\tMaxAge:     30,\n\t\tCompress:   true,\n\t}\n\treturn zapcore.AddSync(errLogger)\n}\n","go","",[58,158,159,172,179,193,210,222,227,239,251,263,269,274,294,303,336,341,349,381,386,394,424,429,437,459,464,472,495,515,520,528,546,563,580,586,591,597,624,646,665,685,704,722,741,750,773,793,798,803,809,833,853,868,881,894,907,920,929,947],{"__ignoreMap":156},[160,161,164,168],"span",{"class":162,"data-line":163,"line":163},"line",1,[160,165,167],{"class":166},"szBVR","package",[160,169,171],{"class":170},"sScJk"," main\n",[160,173,175],{"class":162,"data-line":174,"line":174},2,[160,176,178],{"emptyLinePlaceholder":177},true,"\n",[160,180,182,185,189],{"class":162,"data-line":181,"line":181},3,[160,183,184],{"class":166},"import",[160,186,188],{"class":187},"sVt8B"," ",[160,190,192],{"class":191},"sSDpw","(\n",[160,194,196,200,204,207],{"class":162,"data-line":195,"line":195},4,[160,197,199],{"class":198},"indent","\t",[160,201,203],{"class":202},"sZZnC","\"",[160,205,206],{"class":170},"io",[160,208,209],{"class":202},"\"\n",[160,211,213,215,217,220],{"class":162,"data-line":212,"line":212},5,[160,214,199],{"class":198},[160,216,203],{"class":202},[160,218,219],{"class":170},"os",[160,221,209],{"class":202},[160,223,225],{"class":162,"data-line":224,"line":224},6,[160,226,178],{"emptyLinePlaceholder":177},[160,228,230,232,234,237],{"class":162,"data-line":229,"line":229},7,[160,231,199],{"class":198},[160,233,203],{"class":202},[160,235,236],{"class":170},"go.uber.org\u002Fzap",[160,238,209],{"class":202},[160,240,242,244,246,249],{"class":162,"data-line":241,"line":241},8,[160,243,199],{"class":198},[160,245,203],{"class":202},[160,247,248],{"class":170},"go.uber.org\u002Fzap\u002Fzapcore",[160,250,209],{"class":202},[160,252,254,256,258,261],{"class":162,"data-line":253,"line":253},9,[160,255,199],{"class":198},[160,257,203],{"class":202},[160,259,260],{"class":170},"gopkg.in\u002Fnatefinch\u002Flumberjack.v2",[160,262,209],{"class":202},[160,264,266],{"class":162,"data-line":265,"line":265},10,[160,267,268],{"class":191},")\n",[160,270,272],{"class":162,"data-line":271,"line":271},11,[160,273,178],{"emptyLinePlaceholder":177},[160,275,277,280,283,286,289,291],{"class":162,"data-line":276,"line":276},12,[160,278,279],{"class":166},"func",[160,281,282],{"class":170}," main",[160,284,285],{"class":191},"(",[160,287,288],{"class":191},")",[160,290,188],{"class":187},[160,292,293],{"class":191},"{\n",[160,295,297,299],{"class":162,"data-line":296,"line":296},13,[160,298,199],{"class":198},[160,300,302],{"class":301},"sJ8bj","\u002F\u002F 定义编码器：使用 JSON 格式输出\n",[160,304,306,308,311,314,317,320,323,326,329,332,334],{"class":162,"data-line":305,"line":305},14,[160,307,199],{"class":198},[160,309,310],{"class":187},"encoder ",[160,312,313],{"class":166},":=",[160,315,316],{"class":187}," zapcore.",[160,318,319],{"class":170},"NewJSONEncoder",[160,321,285],{"class":322},"sJX2D",[160,324,325],{"class":187},"zap.",[160,327,328],{"class":170},"NewProductionEncoderConfig",[160,330,285],{"class":331},"sqkie",[160,333,288],{"class":331},[160,335,268],{"class":322},[160,337,339],{"class":162,"data-line":338,"line":338},15,[160,340,178],{"emptyLinePlaceholder":177},[160,342,344,346],{"class":162,"data-line":343,"line":343},16,[160,345,199],{"class":198},[160,347,348],{"class":301},"\u002F\u002F 全量日志：控制台 + 文件\n",[160,350,352,354,357,359,361,364,366,369,372,374,376,379],{"class":162,"data-line":351,"line":351},17,[160,353,199],{"class":198},[160,355,356],{"class":187},"coreFull ",[160,358,313],{"class":166},[160,360,316],{"class":187},[160,362,363],{"class":170},"NewCore",[160,365,285],{"class":322},[160,367,368],{"class":187},"encoder, ",[160,370,371],{"class":170},"getFullLogWriter",[160,373,285],{"class":331},[160,375,288],{"class":331},[160,377,378],{"class":187},", zapcore.InfoLevel",[160,380,268],{"class":322},[160,382,384],{"class":162,"data-line":383,"line":383},18,[160,385,178],{"emptyLinePlaceholder":177},[160,387,389,391],{"class":162,"data-line":388,"line":388},19,[160,390,199],{"class":198},[160,392,393],{"class":301},"\u002F\u002F 错误日志：仅文件\n",[160,395,397,399,402,404,406,408,410,412,415,417,419,422],{"class":162,"data-line":396,"line":396},20,[160,398,199],{"class":198},[160,400,401],{"class":187},"coreError ",[160,403,313],{"class":166},[160,405,316],{"class":187},[160,407,363],{"class":170},[160,409,285],{"class":322},[160,411,368],{"class":187},[160,413,414],{"class":170},"getErrorLogWriter",[160,416,285],{"class":331},[160,418,288],{"class":331},[160,420,421],{"class":187},", zapcore.ErrorLevel",[160,423,268],{"class":322},[160,425,427],{"class":162,"data-line":426,"line":426},21,[160,428,178],{"emptyLinePlaceholder":177},[160,430,432,434],{"class":162,"data-line":431,"line":431},22,[160,433,199],{"class":198},[160,435,436],{"class":301},"\u002F\u002F 合并两个 core\n",[160,438,440,442,445,447,449,452,454,457],{"class":162,"data-line":439,"line":439},23,[160,441,199],{"class":198},[160,443,444],{"class":187},"core ",[160,446,313],{"class":166},[160,448,316],{"class":187},[160,450,451],{"class":170},"NewTee",[160,453,285],{"class":322},[160,455,456],{"class":187},"coreFull, coreError",[160,458,268],{"class":322},[160,460,462],{"class":162,"data-line":461,"line":461},24,[160,463,178],{"emptyLinePlaceholder":177},[160,465,467,469],{"class":162,"data-line":466,"line":466},25,[160,468,199],{"class":198},[160,470,471],{"class":301},"\u002F\u002F 构建 logger\n",[160,473,475,477,480,482,485,488,490,493],{"class":162,"data-line":474,"line":474},26,[160,476,199],{"class":198},[160,478,479],{"class":187},"logger ",[160,481,313],{"class":166},[160,483,484],{"class":187}," zap.",[160,486,487],{"class":170},"New",[160,489,285],{"class":322},[160,491,492],{"class":187},"core",[160,494,268],{"class":322},[160,496,498,500,503,505,508,511,513],{"class":162,"data-line":497,"line":497},27,[160,499,199],{"class":198},[160,501,502],{"class":187},"sugarLogger ",[160,504,313],{"class":166},[160,506,507],{"class":187}," logger.",[160,509,510],{"class":170},"Sugar",[160,512,285],{"class":322},[160,514,268],{"class":322},[160,516,518],{"class":162,"data-line":517,"line":517},28,[160,519,178],{"emptyLinePlaceholder":177},[160,521,523,525],{"class":162,"data-line":522,"line":522},29,[160,524,199],{"class":198},[160,526,527],{"class":301},"\u002F\u002F 测试日志\n",[160,529,531,533,536,539,541,544],{"class":162,"data-line":530,"line":530},30,[160,532,199],{"class":198},[160,534,535],{"class":187},"sugarLogger.",[160,537,538],{"class":170},"Debug",[160,540,285],{"class":322},[160,542,543],{"class":202},"\"这条不会输出，因为级别低于 Info\"",[160,545,268],{"class":322},[160,547,549,551,553,556,558,561],{"class":162,"data-line":548,"line":548},31,[160,550,199],{"class":198},[160,552,535],{"class":187},[160,554,555],{"class":170},"Info",[160,557,285],{"class":322},[160,559,560],{"class":202},"\"系统启动成功\"",[160,562,268],{"class":322},[160,564,566,568,570,573,575,578],{"class":162,"data-line":565,"line":565},32,[160,567,199],{"class":198},[160,569,535],{"class":187},[160,571,572],{"class":170},"Error",[160,574,285],{"class":322},[160,576,577],{"class":202},"\"这是错误日志\"",[160,579,268],{"class":322},[160,581,583],{"class":162,"data-line":582,"line":582},33,[160,584,585],{"class":191},"}\n",[160,587,589],{"class":162,"data-line":588,"line":588},34,[160,590,178],{"emptyLinePlaceholder":177},[160,592,594],{"class":162,"data-line":593,"line":593},35,[160,595,596],{"class":301},"\u002F\u002F 全量日志（控制台 + 文件）\n",[160,598,600,602,605,607,609,611,614,617,620,622],{"class":162,"data-line":599,"line":599},36,[160,601,279],{"class":166},[160,603,604],{"class":170}," getFullLogWriter",[160,606,285],{"class":191},[160,608,288],{"class":191},[160,610,188],{"class":187},[160,612,613],{"class":170},"zapcore",[160,615,616],{"class":187},".",[160,618,619],{"class":170},"WriteSyncer",[160,621,188],{"class":187},[160,623,293],{"class":191},[160,625,627,629,632,634,637,640,642,644],{"class":162,"data-line":626,"line":626},37,[160,628,199],{"class":198},[160,630,631],{"class":187},"fullLogger ",[160,633,313],{"class":166},[160,635,636],{"class":166}," &",[160,638,639],{"class":170},"lumberjack",[160,641,616],{"class":187},[160,643,60],{"class":170},[160,645,293],{"class":322},[160,647,649,651,653,656,659,662],{"class":162,"data-line":648,"line":648},38,[160,650,199],{"class":198},[160,652,199],{"class":198},[160,654,655],{"class":187},"Filename:   ",[160,657,658],{"class":202},"\".\u002Fserver.log\"",[160,660,661],{"class":187},", ",[160,663,664],{"class":301},"\u002F\u002F 日志文件路径\n",[160,666,668,670,672,675,679,682],{"class":162,"data-line":667,"line":667},39,[160,669,199],{"class":198},[160,671,199],{"class":198},[160,673,674],{"class":187},"MaxSize:    ",[160,676,678],{"class":677},"sj4cs","10",[160,680,681],{"class":187},",             ",[160,683,684],{"class":301},"\u002F\u002F 单个文件最大 10MB\n",[160,686,688,690,692,695,698,701],{"class":162,"data-line":687,"line":687},40,[160,689,199],{"class":198},[160,691,199],{"class":198},[160,693,694],{"class":187},"MaxBackups: ",[160,696,697],{"class":677},"5",[160,699,700],{"class":187},",              ",[160,702,703],{"class":301},"\u002F\u002F 保留 5 个旧文件\n",[160,705,707,709,711,714,717,719],{"class":162,"data-line":706,"line":706},41,[160,708,199],{"class":198},[160,710,199],{"class":198},[160,712,713],{"class":187},"MaxAge:     ",[160,715,716],{"class":677},"30",[160,718,681],{"class":187},[160,720,721],{"class":301},"\u002F\u002F 保留 30 天\n",[160,723,725,727,729,732,735,738],{"class":162,"data-line":724,"line":724},42,[160,726,199],{"class":198},[160,728,199],{"class":198},[160,730,731],{"class":187},"Compress:   ",[160,733,734],{"class":677},"true",[160,736,737],{"class":187},",           ",[160,739,740],{"class":301},"\u002F\u002F 启用压缩\n",[160,742,744,746,748],{"class":162,"data-line":743,"line":743},43,[160,745,199],{"class":198},[160,747,156],{"class":187},[160,749,585],{"class":322},[160,751,753,755,758,760,763,766,768,771],{"class":162,"data-line":752,"line":752},44,[160,754,199],{"class":198},[160,756,757],{"class":187},"ws ",[160,759,313],{"class":166},[160,761,762],{"class":187}," io.",[160,764,765],{"class":170},"MultiWriter",[160,767,285],{"class":322},[160,769,770],{"class":187},"fullLogger, os.Stdout",[160,772,268],{"class":322},[160,774,776,778,781,783,786,788,791],{"class":162,"data-line":775,"line":775},45,[160,777,199],{"class":198},[160,779,780],{"class":166},"return",[160,782,316],{"class":187},[160,784,785],{"class":170},"AddSync",[160,787,285],{"class":322},[160,789,790],{"class":187},"ws",[160,792,268],{"class":322},[160,794,796],{"class":162,"data-line":795,"line":795},46,[160,797,585],{"class":191},[160,799,801],{"class":162,"data-line":800,"line":800},47,[160,802,178],{"emptyLinePlaceholder":177},[160,804,806],{"class":162,"data-line":805,"line":805},48,[160,807,808],{"class":301},"\u002F\u002F 错误日志（仅文件）\n",[160,810,812,814,817,819,821,823,825,827,829,831],{"class":162,"data-line":811,"line":811},49,[160,813,279],{"class":166},[160,815,816],{"class":170}," getErrorLogWriter",[160,818,285],{"class":191},[160,820,288],{"class":191},[160,822,188],{"class":187},[160,824,613],{"class":170},[160,826,616],{"class":187},[160,828,619],{"class":170},[160,830,188],{"class":187},[160,832,293],{"class":191},[160,834,836,838,841,843,845,847,849,851],{"class":162,"data-line":835,"line":835},50,[160,837,199],{"class":198},[160,839,840],{"class":187},"errLogger ",[160,842,313],{"class":166},[160,844,636],{"class":166},[160,846,639],{"class":170},[160,848,616],{"class":187},[160,850,60],{"class":170},[160,852,293],{"class":322},[160,854,856,858,860,862,865],{"class":162,"data-line":855,"line":855},51,[160,857,199],{"class":198},[160,859,199],{"class":198},[160,861,655],{"class":187},[160,863,864],{"class":202},"\".\u002Ferror.log\"",[160,866,867],{"class":187},",\n",[160,869,871,873,875,877,879],{"class":162,"data-line":870,"line":870},52,[160,872,199],{"class":198},[160,874,199],{"class":198},[160,876,674],{"class":187},[160,878,678],{"class":677},[160,880,867],{"class":187},[160,882,884,886,888,890,892],{"class":162,"data-line":883,"line":883},53,[160,885,199],{"class":198},[160,887,199],{"class":198},[160,889,694],{"class":187},[160,891,697],{"class":677},[160,893,867],{"class":187},[160,895,897,899,901,903,905],{"class":162,"data-line":896,"line":896},54,[160,898,199],{"class":198},[160,900,199],{"class":198},[160,902,713],{"class":187},[160,904,716],{"class":677},[160,906,867],{"class":187},[160,908,910,912,914,916,918],{"class":162,"data-line":909,"line":909},55,[160,911,199],{"class":198},[160,913,199],{"class":198},[160,915,731],{"class":187},[160,917,734],{"class":677},[160,919,867],{"class":187},[160,921,923,925,927],{"class":162,"data-line":922,"line":922},56,[160,924,199],{"class":198},[160,926,156],{"class":187},[160,928,585],{"class":322},[160,930,932,934,936,938,940,942,945],{"class":162,"data-line":931,"line":931},57,[160,933,199],{"class":198},[160,935,780],{"class":166},[160,937,316],{"class":187},[160,939,785],{"class":170},[160,941,285],{"class":322},[160,943,944],{"class":187},"errLogger",[160,946,268],{"class":322},[160,948,950],{"class":162,"data-line":949,"line":949},58,[160,951,585],{"class":191},[42,953,955],{"id":954},"五运行效果","五、运行效果",[10,957,958],{},"终端输出：",[151,960,964],{"className":961,"code":962,"language":963,"meta":156,"style":156},"language-json shiki shiki-themes github-light github-dark","{\"level\":\"info\",\"ts\":1730265598.123,\"msg\":\"系统启动成功\"}\n{\"level\":\"error\",\"ts\":1730265598.125,\"msg\":\"这是错误日志\"}\n","json",[58,965,966,1002],{"__ignoreMap":156},[160,967,968,971,974,977,980,983,986,988,991,993,996,998,1000],{"class":162,"data-line":163,"line":163},[160,969,970],{"class":191},"{",[160,972,973],{"class":677},"\"level\"",[160,975,976],{"class":187},":",[160,978,979],{"class":202},"\"info\"",[160,981,982],{"class":187},",",[160,984,985],{"class":677},"\"ts\"",[160,987,976],{"class":187},[160,989,990],{"class":677},"1730265598.123",[160,992,982],{"class":187},[160,994,995],{"class":677},"\"msg\"",[160,997,976],{"class":187},[160,999,560],{"class":202},[160,1001,585],{"class":191},[160,1003,1004,1006,1008,1010,1013,1015,1017,1019,1022,1024,1026,1028,1030],{"class":162,"data-line":174,"line":174},[160,1005,970],{"class":191},[160,1007,973],{"class":677},[160,1009,976],{"class":187},[160,1011,1012],{"class":202},"\"error\"",[160,1014,982],{"class":187},[160,1016,985],{"class":677},[160,1018,976],{"class":187},[160,1020,1021],{"class":677},"1730265598.125",[160,1023,982],{"class":187},[160,1025,995],{"class":677},[160,1027,976],{"class":187},[160,1029,577],{"class":202},[160,1031,585],{"class":191},[10,1033,1034,1036,1037,1039],{},[58,1035,132],{"code":132}," 文件中会保存全部 Info 以上日志。\n",[58,1038,138],{"code":138}," 文件中仅保存 Error 以上日志。",[1041,1042,1043],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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);}",{"title":156,"searchDepth":195,"depth":195,"links":1045},[1046,1047,1048,1049,1050],{"id":44,"depth":174,"text":45},{"id":82,"depth":174,"text":83},{"id":120,"depth":174,"text":121},{"id":148,"depth":174,"text":149},{"id":954,"depth":174,"text":955},[1052],"Go语言","2025-10-30","go-zap日志双写，日志切割，使用的zap库中的sugar版本",false,"md",null,{"slots":1059},{},"\u002F2025\u002F10\u002Fgo-zap",{"text":1062,"minutes":1063,"time":1064,"words":1065},"3 min read",2.84,170400,568,{"title":5,"description":1054},{"loc":1060},"posts\u002F2025\u002F10\u002Fgo-zap",[155],"tech","2025-10-31","OaGpj01hvY-nGn2im9VAkNqrZ_ICg9hxhrJf9Z-t3ww",[1074,1079],{"title":1075,"path":1076,"stem":1077,"date":1078,"type":1070,"children":-1},"使用 kafka-go 实现消息生产与消费","\u002F2025\u002F10\u002Fkafka-go","posts\u002F2025\u002F10\u002Fkafka-go","2025-10-28",{"title":1080,"path":1081,"stem":1082,"date":1083,"type":1070,"children":-1},"GitLab Runner 使用与 CICD 全面指南","\u002F2025\u002F11\u002Fgitlab-ci","posts\u002F2025\u002F11\u002Fgitlab-ci","2025-11-10",1786555054890]