[{"data":1,"prerenderedAt":2169},["ShallowReactive",2],{"post-2026-02-15-logging-guide":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"body":14,"_type":2163,"_id":2164,"_source":2165,"_file":2166,"_stem":2167,"_extension":2168},"\u002Fblog\u002F2026-02-15-logging-guide","blog",false,"","Python Logging 日志打印库详解","Python logging 标准库完整教程，包含日志分级、Handler配置、Formatter格式化、文件切割与配置文件管理。","2026-02-15",[12,13],"Python","日志",{"type":15,"children":16,"toc":2146},"root",[17,34,41,97,103,108,183,189,194,366,390,396,403,488,494,837,843,855,1063,1069,1082,1283,1289,1294,1300,1305,1311,1324,1337,1608,1614,1712,1718,1730,2074,2080,2140],{"type":18,"tag":19,"props":20,"children":21},"element","p",{},[22,25,32],{"type":23,"value":24},"text","你想了解 Python 的 logging 日志库，它是 Python 内置的标准日志处理库（无需额外安装），相比简单的",{"type":18,"tag":26,"props":27,"children":29},"code",{"className":28},[],[30],{"type":23,"value":31},"print()",{"type":23,"value":33},"函数，提供了更灵活、更强大的日志分级、输出控制、持久化存储等功能，是项目开发（尤其是中大型项目）中日志记录的首选工具。",{"type":18,"tag":35,"props":36,"children":38},"h2",{"id":37},"一logging-库的核心优势对比-print",[39],{"type":23,"value":40},"一、logging 库的核心优势（对比 print）",{"type":18,"tag":42,"props":43,"children":44},"ol",{},[45,57,67,77,87],{"type":18,"tag":46,"props":47,"children":48},"li",{},[49,55],{"type":18,"tag":50,"props":51,"children":52},"strong",{},[53],{"type":23,"value":54},"日志分级管理",{"type":23,"value":56},"：可按严重程度划分日志级别，按需输出不同重要性的日志信息，避免无关日志干扰调试；",{"type":18,"tag":46,"props":58,"children":59},{},[60,65],{"type":18,"tag":50,"props":61,"children":62},{},[63],{"type":23,"value":64},"灵活输出目标",{"type":23,"value":66},"：日志可同时输出到控制台、文件、数据库等多个目标，支持按文件大小 \u002F 时间切割日志文件；",{"type":18,"tag":46,"props":68,"children":69},{},[70,75],{"type":18,"tag":50,"props":71,"children":72},{},[73],{"type":23,"value":74},"丰富的日志格式",{"type":23,"value":76},"：可自定义日志包含的内容（如时间、模块、行号、日志级别等），便于问题排查；",{"type":18,"tag":46,"props":78,"children":79},{},[80,85],{"type":18,"tag":50,"props":81,"children":82},{},[83],{"type":23,"value":84},"模块化配置",{"type":23,"value":86},"：支持通过代码、配置文件等方式配置日志，便于在不同环境（开发 \u002F 测试 \u002F 生产）中切换日志策略；",{"type":18,"tag":46,"props":88,"children":89},{},[90,95],{"type":18,"tag":50,"props":91,"children":92},{},[93],{"type":23,"value":94},"线程安全",{"type":23,"value":96},"：原生支持多线程环境下的日志记录，无需额外处理线程同步问题。",{"type":18,"tag":35,"props":98,"children":100},{"id":99},"二logging-库的核心组件",[101],{"type":23,"value":102},"二、logging 库的核心组件",{"type":18,"tag":19,"props":104,"children":105},{},[106],{"type":23,"value":107},"logging 库通过四大核心组件协同工作，构成完整的日志处理流程：",{"type":18,"tag":42,"props":109,"children":110},{},[111,129,163,173],{"type":18,"tag":46,"props":112,"children":113},{},[114,119,121,127],{"type":18,"tag":50,"props":115,"children":116},{},[117],{"type":23,"value":118},"Logger（日志器）",{"type":23,"value":120},"：入口组件，负责创建日志记录对象，应用程序通过 Logger 实例调用日志方法（如",{"type":18,"tag":26,"props":122,"children":124},{"className":123},[],[125],{"type":23,"value":126},"logger.debug()",{"type":23,"value":128},"）；",{"type":18,"tag":46,"props":130,"children":131},{},[132,137,139,145,147,153,155,161],{"type":18,"tag":50,"props":133,"children":134},{},[135],{"type":23,"value":136},"Handler（处理器）",{"type":23,"value":138},"：负责将日志分发到不同目标，常见 Handler 包括",{"type":18,"tag":26,"props":140,"children":142},{"className":141},[],[143],{"type":23,"value":144},"StreamHandler",{"type":23,"value":146},"（输出到控制台）、",{"type":18,"tag":26,"props":148,"children":150},{"className":149},[],[151],{"type":23,"value":152},"FileHandler",{"type":23,"value":154},"（输出到文件）、",{"type":18,"tag":26,"props":156,"children":158},{"className":157},[],[159],{"type":23,"value":160},"RotatingFileHandler",{"type":23,"value":162},"（按大小切割文件）等；",{"type":18,"tag":46,"props":164,"children":165},{},[166,171],{"type":18,"tag":50,"props":167,"children":168},{},[169],{"type":23,"value":170},"Formatter（格式化器）",{"type":23,"value":172},"：负责定义日志的输出格式，控制日志信息的展示样式；",{"type":18,"tag":46,"props":174,"children":175},{},[176,181],{"type":18,"tag":50,"props":177,"children":178},{},[179],{"type":23,"value":180},"Filter（过滤器）",{"type":23,"value":182},"：可选组件，用于对日志进行过滤，只保留符合条件的日志（如只记录指定模块的日志）。",{"type":18,"tag":35,"props":184,"children":186},{"id":185},"三日志级别从低到高",[187],{"type":23,"value":188},"三、日志级别（从低到高）",{"type":18,"tag":19,"props":190,"children":191},{},[192],{"type":23,"value":193},"logging 库定义了 5 个标准日志级别，可通过级别控制日志的输出范围，级别越高，日志越重要：",{"type":18,"tag":195,"props":196,"children":197},"table",{},[198,227],{"type":18,"tag":199,"props":200,"children":201},"thead",{},[202],{"type":18,"tag":203,"props":204,"children":205},"tr",{},[206,212,217,222],{"type":18,"tag":207,"props":208,"children":209},"th",{},[210],{"type":23,"value":211},"级别名称",{"type":18,"tag":207,"props":213,"children":214},{},[215],{"type":23,"value":216},"对应方法",{"type":18,"tag":207,"props":218,"children":219},{},[220],{"type":23,"value":221},"描述",{"type":18,"tag":207,"props":223,"children":224},{},[225],{"type":23,"value":226},"常用场景",{"type":18,"tag":228,"props":229,"children":230},"tbody",{},[231,258,285,312,339],{"type":18,"tag":203,"props":232,"children":233},{},[234,240,248,253],{"type":18,"tag":235,"props":236,"children":237},"td",{},[238],{"type":23,"value":239},"DEBUG",{"type":18,"tag":235,"props":241,"children":242},{},[243],{"type":18,"tag":26,"props":244,"children":246},{"className":245},[],[247],{"type":23,"value":126},{"type":18,"tag":235,"props":249,"children":250},{},[251],{"type":23,"value":252},"调试信息，用于开发阶段排查问题",{"type":18,"tag":235,"props":254,"children":255},{},[256],{"type":23,"value":257},"开发环境调试代码、打印变量",{"type":18,"tag":203,"props":259,"children":260},{},[261,266,275,280],{"type":18,"tag":235,"props":262,"children":263},{},[264],{"type":23,"value":265},"INFO",{"type":18,"tag":235,"props":267,"children":268},{},[269],{"type":18,"tag":26,"props":270,"children":272},{"className":271},[],[273],{"type":23,"value":274},"logger.info()",{"type":18,"tag":235,"props":276,"children":277},{},[278],{"type":23,"value":279},"普通信息，记录程序正常运行状态",{"type":18,"tag":235,"props":281,"children":282},{},[283],{"type":23,"value":284},"记录程序启动、流程完成等",{"type":18,"tag":203,"props":286,"children":287},{},[288,293,302,307],{"type":18,"tag":235,"props":289,"children":290},{},[291],{"type":23,"value":292},"WARNING",{"type":18,"tag":235,"props":294,"children":295},{},[296],{"type":18,"tag":26,"props":297,"children":299},{"className":298},[],[300],{"type":23,"value":301},"logger.warning()",{"type":18,"tag":235,"props":303,"children":304},{},[305],{"type":23,"value":306},"警告信息，程序存在潜在风险但不影响运行",{"type":18,"tag":235,"props":308,"children":309},{},[310],{"type":23,"value":311},"配置缺失、资源不足等",{"type":18,"tag":203,"props":313,"children":314},{},[315,320,329,334],{"type":18,"tag":235,"props":316,"children":317},{},[318],{"type":23,"value":319},"ERROR",{"type":18,"tag":235,"props":321,"children":322},{},[323],{"type":18,"tag":26,"props":324,"children":326},{"className":325},[],[327],{"type":23,"value":328},"logger.error()",{"type":18,"tag":235,"props":330,"children":331},{},[332],{"type":23,"value":333},"错误信息，程序部分功能异常",{"type":18,"tag":235,"props":335,"children":336},{},[337],{"type":23,"value":338},"接口调用失败、数据处理出错",{"type":18,"tag":203,"props":340,"children":341},{},[342,347,356,361],{"type":18,"tag":235,"props":343,"children":344},{},[345],{"type":23,"value":346},"CRITICAL",{"type":18,"tag":235,"props":348,"children":349},{},[350],{"type":18,"tag":26,"props":351,"children":353},{"className":352},[],[354],{"type":23,"value":355},"logger.critical()",{"type":18,"tag":235,"props":357,"children":358},{},[359],{"type":23,"value":360},"严重错误，程序无法继续运行",{"type":18,"tag":235,"props":362,"children":363},{},[364],{"type":23,"value":365},"数据库连接失败、核心模块崩溃",{"type":18,"tag":19,"props":367,"children":368},{},[369,374,376,381,383,388],{"type":18,"tag":50,"props":370,"children":371},{},[372],{"type":23,"value":373},"默认级别",{"type":23,"value":375},"：logging 库默认日志级别为",{"type":18,"tag":26,"props":377,"children":379},{"className":378},[],[380],{"type":23,"value":292},{"type":23,"value":382},"，即只输出",{"type":18,"tag":26,"props":384,"children":386},{"className":385},[],[387],{"type":23,"value":292},{"type":23,"value":389},"及以上级别的日志（WARNING、ERROR、CRITICAL）。",{"type":18,"tag":35,"props":391,"children":393},{"id":392},"四基本使用示例",[394],{"type":23,"value":395},"四、基本使用示例",{"type":18,"tag":397,"props":398,"children":400},"h3",{"id":399},"_1-简单使用默认配置输出到控制台",[401],{"type":23,"value":402},"1. 简单使用（默认配置，输出到控制台）",{"type":18,"tag":404,"props":405,"children":409},"pre",{"className":406,"code":407,"language":408,"meta":7,"style":7},"language-python shiki shiki-themes github-dark","import logging\n\n# 直接使用根日志器（简单场景快速上手）\nlogging.debug(\"这是DEBUG级别的调试日志（默认不输出）\")\nlogging.info(\"这是INFO级别的普通日志（默认不输出）\")\nlogging.warning(\"这是WARNING级别的警告日志（默认输出）\")\nlogging.error(\"这是ERROR级别的错误日志（默认输出）\")\nlogging.critical(\"这是CRITICAL级别的严重错误日志（默认输出）\")\n","python",[410],{"type":18,"tag":26,"props":411,"children":412},{"__ignoreMap":7},[413,424,434,443,452,461,470,479],{"type":18,"tag":414,"props":415,"children":418},"span",{"class":416,"line":417},"line",1,[419],{"type":18,"tag":414,"props":420,"children":421},{},[422],{"type":23,"value":423},"import logging\n",{"type":18,"tag":414,"props":425,"children":427},{"class":416,"line":426},2,[428],{"type":18,"tag":414,"props":429,"children":431},{"emptyLinePlaceholder":430},true,[432],{"type":23,"value":433},"\n",{"type":18,"tag":414,"props":435,"children":437},{"class":416,"line":436},3,[438],{"type":18,"tag":414,"props":439,"children":440},{},[441],{"type":23,"value":442},"# 直接使用根日志器（简单场景快速上手）\n",{"type":18,"tag":414,"props":444,"children":446},{"class":416,"line":445},4,[447],{"type":18,"tag":414,"props":448,"children":449},{},[450],{"type":23,"value":451},"logging.debug(\"这是DEBUG级别的调试日志（默认不输出）\")\n",{"type":18,"tag":414,"props":453,"children":455},{"class":416,"line":454},5,[456],{"type":18,"tag":414,"props":457,"children":458},{},[459],{"type":23,"value":460},"logging.info(\"这是INFO级别的普通日志（默认不输出）\")\n",{"type":18,"tag":414,"props":462,"children":464},{"class":416,"line":463},6,[465],{"type":18,"tag":414,"props":466,"children":467},{},[468],{"type":23,"value":469},"logging.warning(\"这是WARNING级别的警告日志（默认输出）\")\n",{"type":18,"tag":414,"props":471,"children":473},{"class":416,"line":472},7,[474],{"type":18,"tag":414,"props":475,"children":476},{},[477],{"type":23,"value":478},"logging.error(\"这是ERROR级别的错误日志（默认输出）\")\n",{"type":18,"tag":414,"props":480,"children":482},{"class":416,"line":481},8,[483],{"type":18,"tag":414,"props":484,"children":485},{},[486],{"type":23,"value":487},"logging.critical(\"这是CRITICAL级别的严重错误日志（默认输出）\")\n",{"type":18,"tag":397,"props":489,"children":491},{"id":490},"_2-自定义配置输出到控制台-文件自定义格式",[492],{"type":23,"value":493},"2. 自定义配置（输出到控制台 + 文件，自定义格式）",{"type":18,"tag":404,"props":495,"children":497},{"className":406,"code":496,"language":408,"meta":7,"style":7},"import logging\n\n# 1. 创建日志器（设置全局日志级别，低于该级别的日志会被过滤）\nlogger = logging.getLogger(\"my_project_logger\")\nlogger.setLevel(logging.DEBUG)  # 全局级别设为DEBUG，确保所有级别日志都能被处理\n\n# 2. 创建处理器（控制台处理器+文件处理器）\n# 控制台处理器\nstream_handler = logging.StreamHandler()\n# 文件处理器（将日志写入文件，追加模式）\nfile_handler = logging.FileHandler(\"project_log.log\", mode=\"a\", encoding=\"utf-8\")\n\n# 3. 创建格式化器（定义日志输出格式）\nformatter = logging.Formatter(\n    \"%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s\"\n)\n# 格式化器说明：\n# %(asctime)s：日志记录时间\n# %(name)s：日志器名称\n# %(levelname)s：日志级别名称\n# %(filename)s：日志所在文件名\n# %(lineno)d：日志所在行号\n# %(message)s：日志核心内容\n\n# 4. 为处理器绑定格式化器\nstream_handler.setFormatter(formatter)\nfile_handler.setFormatter(formatter)\n\n# 5. 为日志器添加处理器\nlogger.addHandler(stream_handler)\nlogger.addHandler(file_handler)\n\n# 6. 打印不同级别的日志\nif __name__ == \"__main__\":\n    logger.debug(\"调试：用户进入登录页面\")\n    logger.info(\"信息：用户登录成功，用户名：test_user\")\n    logger.warning(\"警告：用户密码强度过低\")\n    logger.error(\"错误：用户提交订单时，数据库连接超时\")\n    logger.critical(\"严重：核心服务崩溃，无法提供服务\")\n",[498],{"type":18,"tag":26,"props":499,"children":500},{"__ignoreMap":7},[501,508,515,523,531,539,546,554,562,571,580,589,597,606,615,624,633,642,651,660,669,678,687,696,704,713,722,731,739,748,757,766,774,783,792,801,810,819,828],{"type":18,"tag":414,"props":502,"children":503},{"class":416,"line":417},[504],{"type":18,"tag":414,"props":505,"children":506},{},[507],{"type":23,"value":423},{"type":18,"tag":414,"props":509,"children":510},{"class":416,"line":426},[511],{"type":18,"tag":414,"props":512,"children":513},{"emptyLinePlaceholder":430},[514],{"type":23,"value":433},{"type":18,"tag":414,"props":516,"children":517},{"class":416,"line":436},[518],{"type":18,"tag":414,"props":519,"children":520},{},[521],{"type":23,"value":522},"# 1. 创建日志器（设置全局日志级别，低于该级别的日志会被过滤）\n",{"type":18,"tag":414,"props":524,"children":525},{"class":416,"line":445},[526],{"type":18,"tag":414,"props":527,"children":528},{},[529],{"type":23,"value":530},"logger = logging.getLogger(\"my_project_logger\")\n",{"type":18,"tag":414,"props":532,"children":533},{"class":416,"line":454},[534],{"type":18,"tag":414,"props":535,"children":536},{},[537],{"type":23,"value":538},"logger.setLevel(logging.DEBUG)  # 全局级别设为DEBUG，确保所有级别日志都能被处理\n",{"type":18,"tag":414,"props":540,"children":541},{"class":416,"line":463},[542],{"type":18,"tag":414,"props":543,"children":544},{"emptyLinePlaceholder":430},[545],{"type":23,"value":433},{"type":18,"tag":414,"props":547,"children":548},{"class":416,"line":472},[549],{"type":18,"tag":414,"props":550,"children":551},{},[552],{"type":23,"value":553},"# 2. 创建处理器（控制台处理器+文件处理器）\n",{"type":18,"tag":414,"props":555,"children":556},{"class":416,"line":481},[557],{"type":18,"tag":414,"props":558,"children":559},{},[560],{"type":23,"value":561},"# 控制台处理器\n",{"type":18,"tag":414,"props":563,"children":565},{"class":416,"line":564},9,[566],{"type":18,"tag":414,"props":567,"children":568},{},[569],{"type":23,"value":570},"stream_handler = logging.StreamHandler()\n",{"type":18,"tag":414,"props":572,"children":574},{"class":416,"line":573},10,[575],{"type":18,"tag":414,"props":576,"children":577},{},[578],{"type":23,"value":579},"# 文件处理器（将日志写入文件，追加模式）\n",{"type":18,"tag":414,"props":581,"children":583},{"class":416,"line":582},11,[584],{"type":18,"tag":414,"props":585,"children":586},{},[587],{"type":23,"value":588},"file_handler = logging.FileHandler(\"project_log.log\", mode=\"a\", encoding=\"utf-8\")\n",{"type":18,"tag":414,"props":590,"children":592},{"class":416,"line":591},12,[593],{"type":18,"tag":414,"props":594,"children":595},{"emptyLinePlaceholder":430},[596],{"type":23,"value":433},{"type":18,"tag":414,"props":598,"children":600},{"class":416,"line":599},13,[601],{"type":18,"tag":414,"props":602,"children":603},{},[604],{"type":23,"value":605},"# 3. 创建格式化器（定义日志输出格式）\n",{"type":18,"tag":414,"props":607,"children":609},{"class":416,"line":608},14,[610],{"type":18,"tag":414,"props":611,"children":612},{},[613],{"type":23,"value":614},"formatter = logging.Formatter(\n",{"type":18,"tag":414,"props":616,"children":618},{"class":416,"line":617},15,[619],{"type":18,"tag":414,"props":620,"children":621},{},[622],{"type":23,"value":623},"    \"%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s\"\n",{"type":18,"tag":414,"props":625,"children":627},{"class":416,"line":626},16,[628],{"type":18,"tag":414,"props":629,"children":630},{},[631],{"type":23,"value":632},")\n",{"type":18,"tag":414,"props":634,"children":636},{"class":416,"line":635},17,[637],{"type":18,"tag":414,"props":638,"children":639},{},[640],{"type":23,"value":641},"# 格式化器说明：\n",{"type":18,"tag":414,"props":643,"children":645},{"class":416,"line":644},18,[646],{"type":18,"tag":414,"props":647,"children":648},{},[649],{"type":23,"value":650},"# %(asctime)s：日志记录时间\n",{"type":18,"tag":414,"props":652,"children":654},{"class":416,"line":653},19,[655],{"type":18,"tag":414,"props":656,"children":657},{},[658],{"type":23,"value":659},"# %(name)s：日志器名称\n",{"type":18,"tag":414,"props":661,"children":663},{"class":416,"line":662},20,[664],{"type":18,"tag":414,"props":665,"children":666},{},[667],{"type":23,"value":668},"# %(levelname)s：日志级别名称\n",{"type":18,"tag":414,"props":670,"children":672},{"class":416,"line":671},21,[673],{"type":18,"tag":414,"props":674,"children":675},{},[676],{"type":23,"value":677},"# %(filename)s：日志所在文件名\n",{"type":18,"tag":414,"props":679,"children":681},{"class":416,"line":680},22,[682],{"type":18,"tag":414,"props":683,"children":684},{},[685],{"type":23,"value":686},"# %(lineno)d：日志所在行号\n",{"type":18,"tag":414,"props":688,"children":690},{"class":416,"line":689},23,[691],{"type":18,"tag":414,"props":692,"children":693},{},[694],{"type":23,"value":695},"# %(message)s：日志核心内容\n",{"type":18,"tag":414,"props":697,"children":699},{"class":416,"line":698},24,[700],{"type":18,"tag":414,"props":701,"children":702},{"emptyLinePlaceholder":430},[703],{"type":23,"value":433},{"type":18,"tag":414,"props":705,"children":707},{"class":416,"line":706},25,[708],{"type":18,"tag":414,"props":709,"children":710},{},[711],{"type":23,"value":712},"# 4. 为处理器绑定格式化器\n",{"type":18,"tag":414,"props":714,"children":716},{"class":416,"line":715},26,[717],{"type":18,"tag":414,"props":718,"children":719},{},[720],{"type":23,"value":721},"stream_handler.setFormatter(formatter)\n",{"type":18,"tag":414,"props":723,"children":725},{"class":416,"line":724},27,[726],{"type":18,"tag":414,"props":727,"children":728},{},[729],{"type":23,"value":730},"file_handler.setFormatter(formatter)\n",{"type":18,"tag":414,"props":732,"children":734},{"class":416,"line":733},28,[735],{"type":18,"tag":414,"props":736,"children":737},{"emptyLinePlaceholder":430},[738],{"type":23,"value":433},{"type":18,"tag":414,"props":740,"children":742},{"class":416,"line":741},29,[743],{"type":18,"tag":414,"props":744,"children":745},{},[746],{"type":23,"value":747},"# 5. 为日志器添加处理器\n",{"type":18,"tag":414,"props":749,"children":751},{"class":416,"line":750},30,[752],{"type":18,"tag":414,"props":753,"children":754},{},[755],{"type":23,"value":756},"logger.addHandler(stream_handler)\n",{"type":18,"tag":414,"props":758,"children":760},{"class":416,"line":759},31,[761],{"type":18,"tag":414,"props":762,"children":763},{},[764],{"type":23,"value":765},"logger.addHandler(file_handler)\n",{"type":18,"tag":414,"props":767,"children":769},{"class":416,"line":768},32,[770],{"type":18,"tag":414,"props":771,"children":772},{"emptyLinePlaceholder":430},[773],{"type":23,"value":433},{"type":18,"tag":414,"props":775,"children":777},{"class":416,"line":776},33,[778],{"type":18,"tag":414,"props":779,"children":780},{},[781],{"type":23,"value":782},"# 6. 打印不同级别的日志\n",{"type":18,"tag":414,"props":784,"children":786},{"class":416,"line":785},34,[787],{"type":18,"tag":414,"props":788,"children":789},{},[790],{"type":23,"value":791},"if __name__ == \"__main__\":\n",{"type":18,"tag":414,"props":793,"children":795},{"class":416,"line":794},35,[796],{"type":18,"tag":414,"props":797,"children":798},{},[799],{"type":23,"value":800},"    logger.debug(\"调试：用户进入登录页面\")\n",{"type":18,"tag":414,"props":802,"children":804},{"class":416,"line":803},36,[805],{"type":18,"tag":414,"props":806,"children":807},{},[808],{"type":23,"value":809},"    logger.info(\"信息：用户登录成功，用户名：test_user\")\n",{"type":18,"tag":414,"props":811,"children":813},{"class":416,"line":812},37,[814],{"type":18,"tag":414,"props":815,"children":816},{},[817],{"type":23,"value":818},"    logger.warning(\"警告：用户密码强度过低\")\n",{"type":18,"tag":414,"props":820,"children":822},{"class":416,"line":821},38,[823],{"type":18,"tag":414,"props":824,"children":825},{},[826],{"type":23,"value":827},"    logger.error(\"错误：用户提交订单时，数据库连接超时\")\n",{"type":18,"tag":414,"props":829,"children":831},{"class":416,"line":830},39,[832],{"type":18,"tag":414,"props":833,"children":834},{},[835],{"type":23,"value":836},"    logger.critical(\"严重：核心服务崩溃，无法提供服务\")\n",{"type":18,"tag":397,"props":838,"children":840},{"id":839},"_3-高级使用按文件大小切割日志",[841],{"type":23,"value":842},"3. 高级使用：按文件大小切割日志",{"type":18,"tag":19,"props":844,"children":845},{},[846,848,853],{"type":23,"value":847},"当日志文件过大时，可使用",{"type":18,"tag":26,"props":849,"children":851},{"className":850},[],[852],{"type":23,"value":160},{"type":23,"value":854},"按大小切割，避免单个日志文件过大难以管理：",{"type":18,"tag":404,"props":856,"children":858},{"className":406,"code":857,"language":408,"meta":7,"style":7},"import logging\nfrom logging.handlers import RotatingFileHandler\n\n# 创建日志器\nlogger = logging.getLogger(\"size_rotating_logger\")\nlogger.setLevel(logging.DEBUG)\n\n# 创建按大小切割的文件处理器（单个文件最大10MB，最多保留5个备份文件）\nrotating_handler = RotatingFileHandler(\n    \"rotating_project.log\",\n    mode=\"a\",\n    encoding=\"utf-8\",\n    maxBytes=10 * 1024 * 1024,  # 10MB\n    backupCount=5  # 保留5个备份（rotating_project.log.1 ~ rotating_project.log.5）\n)\n\n# 配置格式化器\nformatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(message)s\")\nrotating_handler.setFormatter(formatter)\n\n# 添加处理器\nlogger.addHandler(rotating_handler)\n\n# 测试日志输出\nfor i in range(1000):\n    logger.info(f\"这是第{i+1}条测试日志，用于验证日志切割功能\")\n",[859],{"type":18,"tag":26,"props":860,"children":861},{"__ignoreMap":7},[862,869,877,884,892,900,908,915,923,931,939,947,955,963,971,978,985,993,1001,1009,1016,1024,1032,1039,1047,1055],{"type":18,"tag":414,"props":863,"children":864},{"class":416,"line":417},[865],{"type":18,"tag":414,"props":866,"children":867},{},[868],{"type":23,"value":423},{"type":18,"tag":414,"props":870,"children":871},{"class":416,"line":426},[872],{"type":18,"tag":414,"props":873,"children":874},{},[875],{"type":23,"value":876},"from logging.handlers import RotatingFileHandler\n",{"type":18,"tag":414,"props":878,"children":879},{"class":416,"line":436},[880],{"type":18,"tag":414,"props":881,"children":882},{"emptyLinePlaceholder":430},[883],{"type":23,"value":433},{"type":18,"tag":414,"props":885,"children":886},{"class":416,"line":445},[887],{"type":18,"tag":414,"props":888,"children":889},{},[890],{"type":23,"value":891},"# 创建日志器\n",{"type":18,"tag":414,"props":893,"children":894},{"class":416,"line":454},[895],{"type":18,"tag":414,"props":896,"children":897},{},[898],{"type":23,"value":899},"logger = logging.getLogger(\"size_rotating_logger\")\n",{"type":18,"tag":414,"props":901,"children":902},{"class":416,"line":463},[903],{"type":18,"tag":414,"props":904,"children":905},{},[906],{"type":23,"value":907},"logger.setLevel(logging.DEBUG)\n",{"type":18,"tag":414,"props":909,"children":910},{"class":416,"line":472},[911],{"type":18,"tag":414,"props":912,"children":913},{"emptyLinePlaceholder":430},[914],{"type":23,"value":433},{"type":18,"tag":414,"props":916,"children":917},{"class":416,"line":481},[918],{"type":18,"tag":414,"props":919,"children":920},{},[921],{"type":23,"value":922},"# 创建按大小切割的文件处理器（单个文件最大10MB，最多保留5个备份文件）\n",{"type":18,"tag":414,"props":924,"children":925},{"class":416,"line":564},[926],{"type":18,"tag":414,"props":927,"children":928},{},[929],{"type":23,"value":930},"rotating_handler = RotatingFileHandler(\n",{"type":18,"tag":414,"props":932,"children":933},{"class":416,"line":573},[934],{"type":18,"tag":414,"props":935,"children":936},{},[937],{"type":23,"value":938},"    \"rotating_project.log\",\n",{"type":18,"tag":414,"props":940,"children":941},{"class":416,"line":582},[942],{"type":18,"tag":414,"props":943,"children":944},{},[945],{"type":23,"value":946},"    mode=\"a\",\n",{"type":18,"tag":414,"props":948,"children":949},{"class":416,"line":591},[950],{"type":18,"tag":414,"props":951,"children":952},{},[953],{"type":23,"value":954},"    encoding=\"utf-8\",\n",{"type":18,"tag":414,"props":956,"children":957},{"class":416,"line":599},[958],{"type":18,"tag":414,"props":959,"children":960},{},[961],{"type":23,"value":962},"    maxBytes=10 * 1024 * 1024,  # 10MB\n",{"type":18,"tag":414,"props":964,"children":965},{"class":416,"line":608},[966],{"type":18,"tag":414,"props":967,"children":968},{},[969],{"type":23,"value":970},"    backupCount=5  # 保留5个备份（rotating_project.log.1 ~ rotating_project.log.5）\n",{"type":18,"tag":414,"props":972,"children":973},{"class":416,"line":617},[974],{"type":18,"tag":414,"props":975,"children":976},{},[977],{"type":23,"value":632},{"type":18,"tag":414,"props":979,"children":980},{"class":416,"line":626},[981],{"type":18,"tag":414,"props":982,"children":983},{"emptyLinePlaceholder":430},[984],{"type":23,"value":433},{"type":18,"tag":414,"props":986,"children":987},{"class":416,"line":635},[988],{"type":18,"tag":414,"props":989,"children":990},{},[991],{"type":23,"value":992},"# 配置格式化器\n",{"type":18,"tag":414,"props":994,"children":995},{"class":416,"line":644},[996],{"type":18,"tag":414,"props":997,"children":998},{},[999],{"type":23,"value":1000},"formatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(message)s\")\n",{"type":18,"tag":414,"props":1002,"children":1003},{"class":416,"line":653},[1004],{"type":18,"tag":414,"props":1005,"children":1006},{},[1007],{"type":23,"value":1008},"rotating_handler.setFormatter(formatter)\n",{"type":18,"tag":414,"props":1010,"children":1011},{"class":416,"line":662},[1012],{"type":18,"tag":414,"props":1013,"children":1014},{"emptyLinePlaceholder":430},[1015],{"type":23,"value":433},{"type":18,"tag":414,"props":1017,"children":1018},{"class":416,"line":671},[1019],{"type":18,"tag":414,"props":1020,"children":1021},{},[1022],{"type":23,"value":1023},"# 添加处理器\n",{"type":18,"tag":414,"props":1025,"children":1026},{"class":416,"line":680},[1027],{"type":18,"tag":414,"props":1028,"children":1029},{},[1030],{"type":23,"value":1031},"logger.addHandler(rotating_handler)\n",{"type":18,"tag":414,"props":1033,"children":1034},{"class":416,"line":689},[1035],{"type":18,"tag":414,"props":1036,"children":1037},{"emptyLinePlaceholder":430},[1038],{"type":23,"value":433},{"type":18,"tag":414,"props":1040,"children":1041},{"class":416,"line":698},[1042],{"type":18,"tag":414,"props":1043,"children":1044},{},[1045],{"type":23,"value":1046},"# 测试日志输出\n",{"type":18,"tag":414,"props":1048,"children":1049},{"class":416,"line":706},[1050],{"type":18,"tag":414,"props":1051,"children":1052},{},[1053],{"type":23,"value":1054},"for i in range(1000):\n",{"type":18,"tag":414,"props":1056,"children":1057},{"class":416,"line":715},[1058],{"type":18,"tag":414,"props":1059,"children":1060},{},[1061],{"type":23,"value":1062},"    logger.info(f\"这是第{i+1}条测试日志，用于验证日志切割功能\")\n",{"type":18,"tag":397,"props":1064,"children":1066},{"id":1065},"_4-高级使用按时间切割日志",[1067],{"type":23,"value":1068},"4. 高级使用：按时间切割日志",{"type":18,"tag":19,"props":1070,"children":1071},{},[1072,1074,1080],{"type":23,"value":1073},"使用",{"type":18,"tag":26,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":23,"value":1079},"TimedRotatingFileHandler",{"type":23,"value":1081},"可按时间周期（如按天、按小时）切割日志，便于按时间维度归档日志：",{"type":18,"tag":404,"props":1083,"children":1085},{"className":406,"code":1084,"language":408,"meta":7,"style":7},"import logging\nfrom logging.handlers import TimedRotatingFileHandler\n\n# 创建日志器\nlogger = logging.getLogger(\"time_rotating_logger\")\nlogger.setLevel(logging.DEBUG)\n\n# 创建按时间切割的文件处理器（按天切割，保留7天备份，后缀为年月日）\ntimed_handler = TimedRotatingFileHandler(\n    \"timed_project.log\",\n    when=\"D\",  # 切割单位：S(秒)、M(分)、H(小时)、D(天)、W0-W6(星期)\n    interval=1,  # 每隔1个单位切割一次\n    backupCount=7,  # 保留7天备份\n    encoding=\"utf-8\",\n    delay=False\n)\n\n# 配置格式化器\nformatter = logging.Formatter(\"%(asctime)s - %(levelname)s - %(message)s\")\ntimed_handler.setFormatter(formatter)\n\n# 添加处理器\nlogger.addHandler(timed_handler)\n\n# 测试日志输出\nlogger.info(\"按天切割的日志示例，每天生成一个新的日志文件\")\n",[1086],{"type":18,"tag":26,"props":1087,"children":1088},{"__ignoreMap":7},[1089,1096,1104,1111,1118,1126,1133,1140,1148,1156,1164,1172,1180,1188,1195,1203,1210,1217,1224,1231,1239,1246,1253,1261,1268,1275],{"type":18,"tag":414,"props":1090,"children":1091},{"class":416,"line":417},[1092],{"type":18,"tag":414,"props":1093,"children":1094},{},[1095],{"type":23,"value":423},{"type":18,"tag":414,"props":1097,"children":1098},{"class":416,"line":426},[1099],{"type":18,"tag":414,"props":1100,"children":1101},{},[1102],{"type":23,"value":1103},"from logging.handlers import TimedRotatingFileHandler\n",{"type":18,"tag":414,"props":1105,"children":1106},{"class":416,"line":436},[1107],{"type":18,"tag":414,"props":1108,"children":1109},{"emptyLinePlaceholder":430},[1110],{"type":23,"value":433},{"type":18,"tag":414,"props":1112,"children":1113},{"class":416,"line":445},[1114],{"type":18,"tag":414,"props":1115,"children":1116},{},[1117],{"type":23,"value":891},{"type":18,"tag":414,"props":1119,"children":1120},{"class":416,"line":454},[1121],{"type":18,"tag":414,"props":1122,"children":1123},{},[1124],{"type":23,"value":1125},"logger = logging.getLogger(\"time_rotating_logger\")\n",{"type":18,"tag":414,"props":1127,"children":1128},{"class":416,"line":463},[1129],{"type":18,"tag":414,"props":1130,"children":1131},{},[1132],{"type":23,"value":907},{"type":18,"tag":414,"props":1134,"children":1135},{"class":416,"line":472},[1136],{"type":18,"tag":414,"props":1137,"children":1138},{"emptyLinePlaceholder":430},[1139],{"type":23,"value":433},{"type":18,"tag":414,"props":1141,"children":1142},{"class":416,"line":481},[1143],{"type":18,"tag":414,"props":1144,"children":1145},{},[1146],{"type":23,"value":1147},"# 创建按时间切割的文件处理器（按天切割，保留7天备份，后缀为年月日）\n",{"type":18,"tag":414,"props":1149,"children":1150},{"class":416,"line":564},[1151],{"type":18,"tag":414,"props":1152,"children":1153},{},[1154],{"type":23,"value":1155},"timed_handler = TimedRotatingFileHandler(\n",{"type":18,"tag":414,"props":1157,"children":1158},{"class":416,"line":573},[1159],{"type":18,"tag":414,"props":1160,"children":1161},{},[1162],{"type":23,"value":1163},"    \"timed_project.log\",\n",{"type":18,"tag":414,"props":1165,"children":1166},{"class":416,"line":582},[1167],{"type":18,"tag":414,"props":1168,"children":1169},{},[1170],{"type":23,"value":1171},"    when=\"D\",  # 切割单位：S(秒)、M(分)、H(小时)、D(天)、W0-W6(星期)\n",{"type":18,"tag":414,"props":1173,"children":1174},{"class":416,"line":591},[1175],{"type":18,"tag":414,"props":1176,"children":1177},{},[1178],{"type":23,"value":1179},"    interval=1,  # 每隔1个单位切割一次\n",{"type":18,"tag":414,"props":1181,"children":1182},{"class":416,"line":599},[1183],{"type":18,"tag":414,"props":1184,"children":1185},{},[1186],{"type":23,"value":1187},"    backupCount=7,  # 保留7天备份\n",{"type":18,"tag":414,"props":1189,"children":1190},{"class":416,"line":608},[1191],{"type":18,"tag":414,"props":1192,"children":1193},{},[1194],{"type":23,"value":954},{"type":18,"tag":414,"props":1196,"children":1197},{"class":416,"line":617},[1198],{"type":18,"tag":414,"props":1199,"children":1200},{},[1201],{"type":23,"value":1202},"    delay=False\n",{"type":18,"tag":414,"props":1204,"children":1205},{"class":416,"line":626},[1206],{"type":18,"tag":414,"props":1207,"children":1208},{},[1209],{"type":23,"value":632},{"type":18,"tag":414,"props":1211,"children":1212},{"class":416,"line":635},[1213],{"type":18,"tag":414,"props":1214,"children":1215},{"emptyLinePlaceholder":430},[1216],{"type":23,"value":433},{"type":18,"tag":414,"props":1218,"children":1219},{"class":416,"line":644},[1220],{"type":18,"tag":414,"props":1221,"children":1222},{},[1223],{"type":23,"value":992},{"type":18,"tag":414,"props":1225,"children":1226},{"class":416,"line":653},[1227],{"type":18,"tag":414,"props":1228,"children":1229},{},[1230],{"type":23,"value":1000},{"type":18,"tag":414,"props":1232,"children":1233},{"class":416,"line":662},[1234],{"type":18,"tag":414,"props":1235,"children":1236},{},[1237],{"type":23,"value":1238},"timed_handler.setFormatter(formatter)\n",{"type":18,"tag":414,"props":1240,"children":1241},{"class":416,"line":671},[1242],{"type":18,"tag":414,"props":1243,"children":1244},{"emptyLinePlaceholder":430},[1245],{"type":23,"value":433},{"type":18,"tag":414,"props":1247,"children":1248},{"class":416,"line":680},[1249],{"type":18,"tag":414,"props":1250,"children":1251},{},[1252],{"type":23,"value":1023},{"type":18,"tag":414,"props":1254,"children":1255},{"class":416,"line":689},[1256],{"type":18,"tag":414,"props":1257,"children":1258},{},[1259],{"type":23,"value":1260},"logger.addHandler(timed_handler)\n",{"type":18,"tag":414,"props":1262,"children":1263},{"class":416,"line":698},[1264],{"type":18,"tag":414,"props":1265,"children":1266},{"emptyLinePlaceholder":430},[1267],{"type":23,"value":433},{"type":18,"tag":414,"props":1269,"children":1270},{"class":416,"line":706},[1271],{"type":18,"tag":414,"props":1272,"children":1273},{},[1274],{"type":23,"value":1046},{"type":18,"tag":414,"props":1276,"children":1277},{"class":416,"line":715},[1278],{"type":18,"tag":414,"props":1279,"children":1280},{},[1281],{"type":23,"value":1282},"logger.info(\"按天切割的日志示例，每天生成一个新的日志文件\")\n",{"type":18,"tag":35,"props":1284,"children":1286},{"id":1285},"五配置方式",[1287],{"type":23,"value":1288},"五、配置方式",{"type":18,"tag":19,"props":1290,"children":1291},{},[1292],{"type":23,"value":1293},"logging 库支持多种配置方式，满足不同项目场景的需求：",{"type":18,"tag":397,"props":1295,"children":1297},{"id":1296},"_1-代码配置如上示例",[1298],{"type":23,"value":1299},"1. 代码配置（如上示例）",{"type":18,"tag":19,"props":1301,"children":1302},{},[1303],{"type":23,"value":1304},"通过代码直接创建 Logger、Handler、Formatter，灵活度高，适合简单项目或需要动态调整配置的场景。",{"type":18,"tag":397,"props":1306,"children":1308},{"id":1307},"_2-配置文件配置推荐中大型项目",[1309],{"type":23,"value":1310},"2. 配置文件配置（推荐中大型项目）",{"type":18,"tag":19,"props":1312,"children":1313},{},[1314,1316,1322],{"type":23,"value":1315},"通过",{"type":18,"tag":26,"props":1317,"children":1319},{"className":1318},[],[1320],{"type":23,"value":1321},"logging.config.fileConfig()",{"type":23,"value":1323},"加载配置文件（ini 格式），便于统一管理和环境切换：",{"type":18,"tag":1325,"props":1326,"children":1328},"h4",{"id":1327},"步骤-1创建日志配置文件-logging_configini",[1329,1331],{"type":23,"value":1330},"步骤 1：创建日志配置文件 ",{"type":18,"tag":26,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":23,"value":1336},"logging_config.ini",{"type":18,"tag":404,"props":1338,"children":1342},{"className":1339,"code":1340,"language":1341,"meta":7,"style":7},"language-ini shiki shiki-themes github-dark","[loggers]\nkeys=root,my_project_logger\n\n[handlers]\nkeys=stream_handler,file_handler\n\n[formatters]\nkeys=default_formatter\n\n[logger_root]\nlevel=WARNING\nhandlers=stream_handler\n\n[logger_my_project_logger]\nlevel=DEBUG\nhandlers=stream_handler,file_handler\nqualname=my_project_logger\npropagate=0\n\n[handler_stream_handler]\nclass=StreamHandler\nlevel=DEBUG\nformatter=default_formatter\nargs=(sys.stdout,)\n\n[handler_file_handler]\nclass=FileHandler\nlevel=DEBUG\nformatter=default_formatter\nargs=(\"project_log.ini.log\", \"a\", \"utf-8\")\n\n[formatter_default_formatter]\nformat=%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s\ndatefmt=%Y-%m-%d %H:%M:%S\n","ini",[1343],{"type":18,"tag":26,"props":1344,"children":1345},{"__ignoreMap":7},[1346,1354,1362,1369,1377,1385,1392,1400,1408,1415,1423,1431,1439,1446,1454,1462,1470,1478,1486,1493,1501,1509,1516,1524,1532,1539,1547,1555,1562,1569,1577,1584,1592,1600],{"type":18,"tag":414,"props":1347,"children":1348},{"class":416,"line":417},[1349],{"type":18,"tag":414,"props":1350,"children":1351},{},[1352],{"type":23,"value":1353},"[loggers]\n",{"type":18,"tag":414,"props":1355,"children":1356},{"class":416,"line":426},[1357],{"type":18,"tag":414,"props":1358,"children":1359},{},[1360],{"type":23,"value":1361},"keys=root,my_project_logger\n",{"type":18,"tag":414,"props":1363,"children":1364},{"class":416,"line":436},[1365],{"type":18,"tag":414,"props":1366,"children":1367},{"emptyLinePlaceholder":430},[1368],{"type":23,"value":433},{"type":18,"tag":414,"props":1370,"children":1371},{"class":416,"line":445},[1372],{"type":18,"tag":414,"props":1373,"children":1374},{},[1375],{"type":23,"value":1376},"[handlers]\n",{"type":18,"tag":414,"props":1378,"children":1379},{"class":416,"line":454},[1380],{"type":18,"tag":414,"props":1381,"children":1382},{},[1383],{"type":23,"value":1384},"keys=stream_handler,file_handler\n",{"type":18,"tag":414,"props":1386,"children":1387},{"class":416,"line":463},[1388],{"type":18,"tag":414,"props":1389,"children":1390},{"emptyLinePlaceholder":430},[1391],{"type":23,"value":433},{"type":18,"tag":414,"props":1393,"children":1394},{"class":416,"line":472},[1395],{"type":18,"tag":414,"props":1396,"children":1397},{},[1398],{"type":23,"value":1399},"[formatters]\n",{"type":18,"tag":414,"props":1401,"children":1402},{"class":416,"line":481},[1403],{"type":18,"tag":414,"props":1404,"children":1405},{},[1406],{"type":23,"value":1407},"keys=default_formatter\n",{"type":18,"tag":414,"props":1409,"children":1410},{"class":416,"line":564},[1411],{"type":18,"tag":414,"props":1412,"children":1413},{"emptyLinePlaceholder":430},[1414],{"type":23,"value":433},{"type":18,"tag":414,"props":1416,"children":1417},{"class":416,"line":573},[1418],{"type":18,"tag":414,"props":1419,"children":1420},{},[1421],{"type":23,"value":1422},"[logger_root]\n",{"type":18,"tag":414,"props":1424,"children":1425},{"class":416,"line":582},[1426],{"type":18,"tag":414,"props":1427,"children":1428},{},[1429],{"type":23,"value":1430},"level=WARNING\n",{"type":18,"tag":414,"props":1432,"children":1433},{"class":416,"line":591},[1434],{"type":18,"tag":414,"props":1435,"children":1436},{},[1437],{"type":23,"value":1438},"handlers=stream_handler\n",{"type":18,"tag":414,"props":1440,"children":1441},{"class":416,"line":599},[1442],{"type":18,"tag":414,"props":1443,"children":1444},{"emptyLinePlaceholder":430},[1445],{"type":23,"value":433},{"type":18,"tag":414,"props":1447,"children":1448},{"class":416,"line":608},[1449],{"type":18,"tag":414,"props":1450,"children":1451},{},[1452],{"type":23,"value":1453},"[logger_my_project_logger]\n",{"type":18,"tag":414,"props":1455,"children":1456},{"class":416,"line":617},[1457],{"type":18,"tag":414,"props":1458,"children":1459},{},[1460],{"type":23,"value":1461},"level=DEBUG\n",{"type":18,"tag":414,"props":1463,"children":1464},{"class":416,"line":626},[1465],{"type":18,"tag":414,"props":1466,"children":1467},{},[1468],{"type":23,"value":1469},"handlers=stream_handler,file_handler\n",{"type":18,"tag":414,"props":1471,"children":1472},{"class":416,"line":635},[1473],{"type":18,"tag":414,"props":1474,"children":1475},{},[1476],{"type":23,"value":1477},"qualname=my_project_logger\n",{"type":18,"tag":414,"props":1479,"children":1480},{"class":416,"line":644},[1481],{"type":18,"tag":414,"props":1482,"children":1483},{},[1484],{"type":23,"value":1485},"propagate=0\n",{"type":18,"tag":414,"props":1487,"children":1488},{"class":416,"line":653},[1489],{"type":18,"tag":414,"props":1490,"children":1491},{"emptyLinePlaceholder":430},[1492],{"type":23,"value":433},{"type":18,"tag":414,"props":1494,"children":1495},{"class":416,"line":662},[1496],{"type":18,"tag":414,"props":1497,"children":1498},{},[1499],{"type":23,"value":1500},"[handler_stream_handler]\n",{"type":18,"tag":414,"props":1502,"children":1503},{"class":416,"line":671},[1504],{"type":18,"tag":414,"props":1505,"children":1506},{},[1507],{"type":23,"value":1508},"class=StreamHandler\n",{"type":18,"tag":414,"props":1510,"children":1511},{"class":416,"line":680},[1512],{"type":18,"tag":414,"props":1513,"children":1514},{},[1515],{"type":23,"value":1461},{"type":18,"tag":414,"props":1517,"children":1518},{"class":416,"line":689},[1519],{"type":18,"tag":414,"props":1520,"children":1521},{},[1522],{"type":23,"value":1523},"formatter=default_formatter\n",{"type":18,"tag":414,"props":1525,"children":1526},{"class":416,"line":698},[1527],{"type":18,"tag":414,"props":1528,"children":1529},{},[1530],{"type":23,"value":1531},"args=(sys.stdout,)\n",{"type":18,"tag":414,"props":1533,"children":1534},{"class":416,"line":706},[1535],{"type":18,"tag":414,"props":1536,"children":1537},{"emptyLinePlaceholder":430},[1538],{"type":23,"value":433},{"type":18,"tag":414,"props":1540,"children":1541},{"class":416,"line":715},[1542],{"type":18,"tag":414,"props":1543,"children":1544},{},[1545],{"type":23,"value":1546},"[handler_file_handler]\n",{"type":18,"tag":414,"props":1548,"children":1549},{"class":416,"line":724},[1550],{"type":18,"tag":414,"props":1551,"children":1552},{},[1553],{"type":23,"value":1554},"class=FileHandler\n",{"type":18,"tag":414,"props":1556,"children":1557},{"class":416,"line":733},[1558],{"type":18,"tag":414,"props":1559,"children":1560},{},[1561],{"type":23,"value":1461},{"type":18,"tag":414,"props":1563,"children":1564},{"class":416,"line":741},[1565],{"type":18,"tag":414,"props":1566,"children":1567},{},[1568],{"type":23,"value":1523},{"type":18,"tag":414,"props":1570,"children":1571},{"class":416,"line":750},[1572],{"type":18,"tag":414,"props":1573,"children":1574},{},[1575],{"type":23,"value":1576},"args=(\"project_log.ini.log\", \"a\", \"utf-8\")\n",{"type":18,"tag":414,"props":1578,"children":1579},{"class":416,"line":759},[1580],{"type":18,"tag":414,"props":1581,"children":1582},{"emptyLinePlaceholder":430},[1583],{"type":23,"value":433},{"type":18,"tag":414,"props":1585,"children":1586},{"class":416,"line":768},[1587],{"type":18,"tag":414,"props":1588,"children":1589},{},[1590],{"type":23,"value":1591},"[formatter_default_formatter]\n",{"type":18,"tag":414,"props":1593,"children":1594},{"class":416,"line":776},[1595],{"type":18,"tag":414,"props":1596,"children":1597},{},[1598],{"type":23,"value":1599},"format=%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s\n",{"type":18,"tag":414,"props":1601,"children":1602},{"class":416,"line":785},[1603],{"type":18,"tag":414,"props":1604,"children":1605},{},[1606],{"type":23,"value":1607},"datefmt=%Y-%m-%d %H:%M:%S\n",{"type":18,"tag":1325,"props":1609,"children":1611},{"id":1610},"步骤-2加载配置文件并使用",[1612],{"type":23,"value":1613},"步骤 2：加载配置文件并使用",{"type":18,"tag":404,"props":1615,"children":1617},{"className":406,"code":1616,"language":408,"meta":7,"style":7},"import logging\nimport logging.config\n\n# 加载ini配置文件\nlogging.config.fileConfig(\"logging_config.ini\")\n\n# 获取日志器\nlogger = logging.getLogger(\"my_project_logger\")\n\n# 打印日志\nlogger.debug(\"通过配置文件加载的调试日志\")\nlogger.info(\"通过配置文件加载的普通日志\")\n",[1618],{"type":18,"tag":26,"props":1619,"children":1620},{"__ignoreMap":7},[1621,1628,1636,1643,1651,1659,1666,1674,1681,1688,1696,1704],{"type":18,"tag":414,"props":1622,"children":1623},{"class":416,"line":417},[1624],{"type":18,"tag":414,"props":1625,"children":1626},{},[1627],{"type":23,"value":423},{"type":18,"tag":414,"props":1629,"children":1630},{"class":416,"line":426},[1631],{"type":18,"tag":414,"props":1632,"children":1633},{},[1634],{"type":23,"value":1635},"import logging.config\n",{"type":18,"tag":414,"props":1637,"children":1638},{"class":416,"line":436},[1639],{"type":18,"tag":414,"props":1640,"children":1641},{"emptyLinePlaceholder":430},[1642],{"type":23,"value":433},{"type":18,"tag":414,"props":1644,"children":1645},{"class":416,"line":445},[1646],{"type":18,"tag":414,"props":1647,"children":1648},{},[1649],{"type":23,"value":1650},"# 加载ini配置文件\n",{"type":18,"tag":414,"props":1652,"children":1653},{"class":416,"line":454},[1654],{"type":18,"tag":414,"props":1655,"children":1656},{},[1657],{"type":23,"value":1658},"logging.config.fileConfig(\"logging_config.ini\")\n",{"type":18,"tag":414,"props":1660,"children":1661},{"class":416,"line":463},[1662],{"type":18,"tag":414,"props":1663,"children":1664},{"emptyLinePlaceholder":430},[1665],{"type":23,"value":433},{"type":18,"tag":414,"props":1667,"children":1668},{"class":416,"line":472},[1669],{"type":18,"tag":414,"props":1670,"children":1671},{},[1672],{"type":23,"value":1673},"# 获取日志器\n",{"type":18,"tag":414,"props":1675,"children":1676},{"class":416,"line":481},[1677],{"type":18,"tag":414,"props":1678,"children":1679},{},[1680],{"type":23,"value":530},{"type":18,"tag":414,"props":1682,"children":1683},{"class":416,"line":564},[1684],{"type":18,"tag":414,"props":1685,"children":1686},{"emptyLinePlaceholder":430},[1687],{"type":23,"value":433},{"type":18,"tag":414,"props":1689,"children":1690},{"class":416,"line":573},[1691],{"type":18,"tag":414,"props":1692,"children":1693},{},[1694],{"type":23,"value":1695},"# 打印日志\n",{"type":18,"tag":414,"props":1697,"children":1698},{"class":416,"line":582},[1699],{"type":18,"tag":414,"props":1700,"children":1701},{},[1702],{"type":23,"value":1703},"logger.debug(\"通过配置文件加载的调试日志\")\n",{"type":18,"tag":414,"props":1705,"children":1706},{"class":416,"line":591},[1707],{"type":18,"tag":414,"props":1708,"children":1709},{},[1710],{"type":23,"value":1711},"logger.info(\"通过配置文件加载的普通日志\")\n",{"type":18,"tag":397,"props":1713,"children":1715},{"id":1714},"_3-字典配置现代-python-项目推荐",[1716],{"type":23,"value":1717},"3. 字典配置（现代 Python 项目推荐）",{"type":18,"tag":19,"props":1719,"children":1720},{},[1721,1722,1728],{"type":23,"value":1315},{"type":18,"tag":26,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":23,"value":1727},"logging.config.dictConfig()",{"type":23,"value":1729},"加载字典格式配置，支持更复杂的配置逻辑（如自定义 Handler）：",{"type":18,"tag":404,"props":1731,"children":1733},{"className":406,"code":1732,"language":408,"meta":7,"style":7},"import logging\nimport logging.config\n\n# 日志配置字典\nLOGGING_CONFIG = {\n    \"version\": 1,\n    \"disable_existing_loggers\": False,\n    \"formatters\": {\n        \"default\": {\n            \"format\": \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\",\n            \"datefmt\": \"%Y-%m-%d %H:%M:%S\"\n        }\n    },\n    \"handlers\": {\n        \"console\": {\n            \"class\": \"logging.StreamHandler\",\n            \"level\": \"DEBUG\",\n            \"formatter\": \"default\",\n            \"stream\": \"ext:\u002F\u002Fsys.stdout\"\n        },\n        \"file\": {\n            \"class\": \"logging.FileHandler\",\n            \"level\": \"INFO\",\n            \"formatter\": \"default\",\n            \"filename\": \"project_log.dict.log\",\n            \"encoding\": \"utf-8\"\n        }\n    },\n    \"loggers\": {\n        \"my_project_logger\": {\n            \"level\": \"DEBUG\",\n            \"handlers\": [\"console\", \"file\"],\n            \"propagate\": False\n        }\n    }\n}\n\n# 加载字典配置\nlogging.config.dictConfig(LOGGING_CONFIG)\n\n# 获取日志器并使用\nlogger = logging.getLogger(\"my_project_logger\")\nlogger.info(\"通过字典配置加载的日志信息\")\n",[1734],{"type":18,"tag":26,"props":1735,"children":1736},{"__ignoreMap":7},[1737,1744,1751,1758,1766,1774,1782,1790,1798,1806,1814,1822,1830,1838,1846,1854,1862,1870,1878,1886,1894,1902,1910,1918,1925,1933,1941,1948,1955,1963,1971,1978,1986,1994,2001,2009,2017,2024,2032,2040,2048,2057,2065],{"type":18,"tag":414,"props":1738,"children":1739},{"class":416,"line":417},[1740],{"type":18,"tag":414,"props":1741,"children":1742},{},[1743],{"type":23,"value":423},{"type":18,"tag":414,"props":1745,"children":1746},{"class":416,"line":426},[1747],{"type":18,"tag":414,"props":1748,"children":1749},{},[1750],{"type":23,"value":1635},{"type":18,"tag":414,"props":1752,"children":1753},{"class":416,"line":436},[1754],{"type":18,"tag":414,"props":1755,"children":1756},{"emptyLinePlaceholder":430},[1757],{"type":23,"value":433},{"type":18,"tag":414,"props":1759,"children":1760},{"class":416,"line":445},[1761],{"type":18,"tag":414,"props":1762,"children":1763},{},[1764],{"type":23,"value":1765},"# 日志配置字典\n",{"type":18,"tag":414,"props":1767,"children":1768},{"class":416,"line":454},[1769],{"type":18,"tag":414,"props":1770,"children":1771},{},[1772],{"type":23,"value":1773},"LOGGING_CONFIG = {\n",{"type":18,"tag":414,"props":1775,"children":1776},{"class":416,"line":463},[1777],{"type":18,"tag":414,"props":1778,"children":1779},{},[1780],{"type":23,"value":1781},"    \"version\": 1,\n",{"type":18,"tag":414,"props":1783,"children":1784},{"class":416,"line":472},[1785],{"type":18,"tag":414,"props":1786,"children":1787},{},[1788],{"type":23,"value":1789},"    \"disable_existing_loggers\": False,\n",{"type":18,"tag":414,"props":1791,"children":1792},{"class":416,"line":481},[1793],{"type":18,"tag":414,"props":1794,"children":1795},{},[1796],{"type":23,"value":1797},"    \"formatters\": {\n",{"type":18,"tag":414,"props":1799,"children":1800},{"class":416,"line":564},[1801],{"type":18,"tag":414,"props":1802,"children":1803},{},[1804],{"type":23,"value":1805},"        \"default\": {\n",{"type":18,"tag":414,"props":1807,"children":1808},{"class":416,"line":573},[1809],{"type":18,"tag":414,"props":1810,"children":1811},{},[1812],{"type":23,"value":1813},"            \"format\": \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\",\n",{"type":18,"tag":414,"props":1815,"children":1816},{"class":416,"line":582},[1817],{"type":18,"tag":414,"props":1818,"children":1819},{},[1820],{"type":23,"value":1821},"            \"datefmt\": \"%Y-%m-%d %H:%M:%S\"\n",{"type":18,"tag":414,"props":1823,"children":1824},{"class":416,"line":591},[1825],{"type":18,"tag":414,"props":1826,"children":1827},{},[1828],{"type":23,"value":1829},"        }\n",{"type":18,"tag":414,"props":1831,"children":1832},{"class":416,"line":599},[1833],{"type":18,"tag":414,"props":1834,"children":1835},{},[1836],{"type":23,"value":1837},"    },\n",{"type":18,"tag":414,"props":1839,"children":1840},{"class":416,"line":608},[1841],{"type":18,"tag":414,"props":1842,"children":1843},{},[1844],{"type":23,"value":1845},"    \"handlers\": {\n",{"type":18,"tag":414,"props":1847,"children":1848},{"class":416,"line":617},[1849],{"type":18,"tag":414,"props":1850,"children":1851},{},[1852],{"type":23,"value":1853},"        \"console\": {\n",{"type":18,"tag":414,"props":1855,"children":1856},{"class":416,"line":626},[1857],{"type":18,"tag":414,"props":1858,"children":1859},{},[1860],{"type":23,"value":1861},"            \"class\": \"logging.StreamHandler\",\n",{"type":18,"tag":414,"props":1863,"children":1864},{"class":416,"line":635},[1865],{"type":18,"tag":414,"props":1866,"children":1867},{},[1868],{"type":23,"value":1869},"            \"level\": \"DEBUG\",\n",{"type":18,"tag":414,"props":1871,"children":1872},{"class":416,"line":644},[1873],{"type":18,"tag":414,"props":1874,"children":1875},{},[1876],{"type":23,"value":1877},"            \"formatter\": \"default\",\n",{"type":18,"tag":414,"props":1879,"children":1880},{"class":416,"line":653},[1881],{"type":18,"tag":414,"props":1882,"children":1883},{},[1884],{"type":23,"value":1885},"            \"stream\": \"ext:\u002F\u002Fsys.stdout\"\n",{"type":18,"tag":414,"props":1887,"children":1888},{"class":416,"line":662},[1889],{"type":18,"tag":414,"props":1890,"children":1891},{},[1892],{"type":23,"value":1893},"        },\n",{"type":18,"tag":414,"props":1895,"children":1896},{"class":416,"line":671},[1897],{"type":18,"tag":414,"props":1898,"children":1899},{},[1900],{"type":23,"value":1901},"        \"file\": {\n",{"type":18,"tag":414,"props":1903,"children":1904},{"class":416,"line":680},[1905],{"type":18,"tag":414,"props":1906,"children":1907},{},[1908],{"type":23,"value":1909},"            \"class\": \"logging.FileHandler\",\n",{"type":18,"tag":414,"props":1911,"children":1912},{"class":416,"line":689},[1913],{"type":18,"tag":414,"props":1914,"children":1915},{},[1916],{"type":23,"value":1917},"            \"level\": \"INFO\",\n",{"type":18,"tag":414,"props":1919,"children":1920},{"class":416,"line":698},[1921],{"type":18,"tag":414,"props":1922,"children":1923},{},[1924],{"type":23,"value":1877},{"type":18,"tag":414,"props":1926,"children":1927},{"class":416,"line":706},[1928],{"type":18,"tag":414,"props":1929,"children":1930},{},[1931],{"type":23,"value":1932},"            \"filename\": \"project_log.dict.log\",\n",{"type":18,"tag":414,"props":1934,"children":1935},{"class":416,"line":715},[1936],{"type":18,"tag":414,"props":1937,"children":1938},{},[1939],{"type":23,"value":1940},"            \"encoding\": \"utf-8\"\n",{"type":18,"tag":414,"props":1942,"children":1943},{"class":416,"line":724},[1944],{"type":18,"tag":414,"props":1945,"children":1946},{},[1947],{"type":23,"value":1829},{"type":18,"tag":414,"props":1949,"children":1950},{"class":416,"line":733},[1951],{"type":18,"tag":414,"props":1952,"children":1953},{},[1954],{"type":23,"value":1837},{"type":18,"tag":414,"props":1956,"children":1957},{"class":416,"line":741},[1958],{"type":18,"tag":414,"props":1959,"children":1960},{},[1961],{"type":23,"value":1962},"    \"loggers\": {\n",{"type":18,"tag":414,"props":1964,"children":1965},{"class":416,"line":750},[1966],{"type":18,"tag":414,"props":1967,"children":1968},{},[1969],{"type":23,"value":1970},"        \"my_project_logger\": {\n",{"type":18,"tag":414,"props":1972,"children":1973},{"class":416,"line":759},[1974],{"type":18,"tag":414,"props":1975,"children":1976},{},[1977],{"type":23,"value":1869},{"type":18,"tag":414,"props":1979,"children":1980},{"class":416,"line":768},[1981],{"type":18,"tag":414,"props":1982,"children":1983},{},[1984],{"type":23,"value":1985},"            \"handlers\": [\"console\", \"file\"],\n",{"type":18,"tag":414,"props":1987,"children":1988},{"class":416,"line":776},[1989],{"type":18,"tag":414,"props":1990,"children":1991},{},[1992],{"type":23,"value":1993},"            \"propagate\": False\n",{"type":18,"tag":414,"props":1995,"children":1996},{"class":416,"line":785},[1997],{"type":18,"tag":414,"props":1998,"children":1999},{},[2000],{"type":23,"value":1829},{"type":18,"tag":414,"props":2002,"children":2003},{"class":416,"line":794},[2004],{"type":18,"tag":414,"props":2005,"children":2006},{},[2007],{"type":23,"value":2008},"    }\n",{"type":18,"tag":414,"props":2010,"children":2011},{"class":416,"line":803},[2012],{"type":18,"tag":414,"props":2013,"children":2014},{},[2015],{"type":23,"value":2016},"}\n",{"type":18,"tag":414,"props":2018,"children":2019},{"class":416,"line":812},[2020],{"type":18,"tag":414,"props":2021,"children":2022},{"emptyLinePlaceholder":430},[2023],{"type":23,"value":433},{"type":18,"tag":414,"props":2025,"children":2026},{"class":416,"line":821},[2027],{"type":18,"tag":414,"props":2028,"children":2029},{},[2030],{"type":23,"value":2031},"# 加载字典配置\n",{"type":18,"tag":414,"props":2033,"children":2034},{"class":416,"line":830},[2035],{"type":18,"tag":414,"props":2036,"children":2037},{},[2038],{"type":23,"value":2039},"logging.config.dictConfig(LOGGING_CONFIG)\n",{"type":18,"tag":414,"props":2041,"children":2043},{"class":416,"line":2042},40,[2044],{"type":18,"tag":414,"props":2045,"children":2046},{"emptyLinePlaceholder":430},[2047],{"type":23,"value":433},{"type":18,"tag":414,"props":2049,"children":2051},{"class":416,"line":2050},41,[2052],{"type":18,"tag":414,"props":2053,"children":2054},{},[2055],{"type":23,"value":2056},"# 获取日志器并使用\n",{"type":18,"tag":414,"props":2058,"children":2060},{"class":416,"line":2059},42,[2061],{"type":18,"tag":414,"props":2062,"children":2063},{},[2064],{"type":23,"value":530},{"type":18,"tag":414,"props":2066,"children":2068},{"class":416,"line":2067},43,[2069],{"type":18,"tag":414,"props":2070,"children":2071},{},[2072],{"type":23,"value":2073},"logger.info(\"通过字典配置加载的日志信息\")\n",{"type":18,"tag":35,"props":2075,"children":2077},{"id":2076},"六总结",[2078],{"type":23,"value":2079},"六、总结",{"type":18,"tag":42,"props":2081,"children":2082},{},[2083,2100,2110,2120,2130],{"type":18,"tag":46,"props":2084,"children":2085},{},[2086,2091,2093,2098],{"type":18,"tag":50,"props":2087,"children":2088},{},[2089],{"type":23,"value":2090},"logging 是 Python 内置标准库",{"type":23,"value":2092},"，无需额外安装，是项目日志处理的首选工具，优于",{"type":18,"tag":26,"props":2094,"children":2096},{"className":2095},[],[2097],{"type":23,"value":31},{"type":23,"value":2099},"函数；",{"type":18,"tag":46,"props":2101,"children":2102},{},[2103,2108],{"type":18,"tag":50,"props":2104,"children":2105},{},[2106],{"type":23,"value":2107},"核心要素",{"type":23,"value":2109},"：四大组件（Logger\u002FHandler\u002FFormatter\u002FFilter）、五级日志级别（DEBUG~CRITICAL），支撑灵活的日志管理；",{"type":18,"tag":46,"props":2111,"children":2112},{},[2113,2118],{"type":18,"tag":50,"props":2114,"children":2115},{},[2116],{"type":23,"value":2117},"核心功能",{"type":23,"value":2119},"：日志分级输出、多目标持久化、自定义格式、日志切割，满足开发 \u002F 测试 \u002F 生产环境的不同需求；",{"type":18,"tag":46,"props":2121,"children":2122},{},[2123,2128],{"type":18,"tag":50,"props":2124,"children":2125},{},[2126],{"type":23,"value":2127},"配置方式",{"type":23,"value":2129},"：代码配置（简单场景）、ini 配置文件（传统项目）、字典配置（现代项目），可按需选择；",{"type":18,"tag":46,"props":2131,"children":2132},{},[2133,2138],{"type":18,"tag":50,"props":2134,"children":2135},{},[2136],{"type":23,"value":2137},"适用场景",{"type":23,"value":2139},"：中大型 Python 项目开发、后端服务调试、生产环境问题排查、数据监控等，是 Python 工程师必备技能。",{"type":18,"tag":2141,"props":2142,"children":2143},"style",{},[2144],{"type":23,"value":2145},"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);}",{"title":7,"searchDepth":426,"depth":426,"links":2147},[2148,2149,2150,2151,2157,2162],{"id":37,"depth":426,"text":40},{"id":99,"depth":426,"text":102},{"id":185,"depth":426,"text":188},{"id":392,"depth":426,"text":395,"children":2152},[2153,2154,2155,2156],{"id":399,"depth":436,"text":402},{"id":490,"depth":436,"text":493},{"id":839,"depth":436,"text":842},{"id":1065,"depth":436,"text":1068},{"id":1285,"depth":426,"text":1288,"children":2158},[2159,2160,2161],{"id":1296,"depth":436,"text":1299},{"id":1307,"depth":436,"text":1310},{"id":1714,"depth":436,"text":1717},{"id":2076,"depth":426,"text":2079},"markdown","content:blog:2026-02-15-logging-guide.md","content","blog\u002F2026-02-15-logging-guide.md","blog\u002F2026-02-15-logging-guide","md",1780801017869]