如何将logger.warning输出的pandapower诊断日志通过f.write写入txt文件
问题根源
- pandapower内置诊断模块的所有
report_*方法均无返回值(默认返回None):方法执行时仅将诊断信息推送到日志流输出到控制台,不会将诊断文本作为函数返回值返回,因此直接通过f.write(report_methods[key]())无法获取到任何有效内容。 - 原实现存在冗余执行问题:判断返回值时调用了一次报告方法,写入文件时又重复调用一次,平白增加了不必要的执行开销。
推荐实现方案
最简便、对原有逻辑侵入最小的方案是直接给pandapower的日志对象绑定文件输出处理器,日志会自动同时输出到控制台和目标txt文件,无需修改原有诊断执行逻辑。
完整实现代码如下:
import logging # ---------------------- 新增日志文件配置部分 ---------------------- # 初始化文件日志处理器,指定输出文件路径、写入模式、编码避免中文乱码 file_log_handler = logging.FileHandler( filename="pandapower_diagnostic_report.txt", mode="w", encoding="utf-8" ) # 设置日志输出格式,和控制台输出保持一致(仅输出日志内容,不额外加级别、时间前缀) file_log_handler.setFormatter(logging.Formatter("%(message)s")) # 获取pandapower使用的根日志对象,绑定文件处理器 pp_logger = logging.getLogger("pandapower") pp_logger.addHandler(file_log_handler) # ---------------------------------------------------------------- # 以下是原有的诊断执行逻辑,无需任何修改 report_methods = { "missing_bus_indices": diag_report.report_missing_bus_indices, "disconnected_elements": diag_report.report_disconnected_elements, "different_voltage_levels_connected": diag_report.report_different_voltage_levels_connected, "impedance_values_close_to_zero": diag_report.report_impedance_values_close_to_zero, "nominal_voltages_dont_match": diag_report.report_nominal_voltages_dont_match, "invalid_values": diag_report.report_invalid_values, "overload": diag_report.report_overload, "multiple_voltage_controlling_elements_per_bus": diag_report.report_multiple_voltage_controlling_elements_per_bus, "wrong_switch_configuration": diag_report.report_wrong_switch_configuration, "no_ext_grid": diag_report.report_no_ext_grid, "wrong_reference_system": diag_report.report_wrong_reference_system, "deviation_from_std_type": diag_report.report_deviation_from_std_type, "numba_comparison": diag_report.report_numba_comparison, "parallel_switches": diag_report.report_parallel_switches } log_message_sep = ("\n --------\n") logger.warning("\n\n_____________ PANDAPOWER DIAGNOSTIC TOOL _____________ \n") for key in report_methods: if key in diag_results: report_methods[key]() logger.warning(log_message_sep) logger.warning("_____________ END OF PANDAPOWER DIAGNOSTIC _____________ ") # ---------------------- 诊断结束后清理资源 ---------------------- pp_logger.removeHandler(file_log_handler) file_log_handler.close()
注意事项
- 该方案完全复用pandapower原生的诊断输出逻辑,不会出现内容缺失、格式错乱的问题
- 无需手动拼接诊断内容,所有控制台输出的日志都会自动同步写入txt文件
- 诊断完成后记得移除文件处理器并关闭句柄,避免后续运行pandapower时日志被重复写入该文件
内容的提问来源于stack exchange,提问作者Thomas LESIEUR
相关产品推荐
相关产品推荐

