You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Excel、Pandas构建有效日志系统?程序更新日志遇阻求助

解决方案:更新结构化运行日志并修复DataFrame拼接问题

一、修复日志更新代码问题

你当前的代码仅尝试拼接Run_ID列,既忽略了日志中其他必填字段(如请求时间、请求者等),还会因列长度不匹配导致DataFrame无变化。正确做法是构造完整的新记录行,再合并到原日志DataFrame中:

步骤1:构造新的运行记录

先为新的ResponseId补充完整日志字段(比如用当前时间填充请求时间、指定请求者邮箱等):

import pandas as pd
from datetime import datetime

# 读取原日志和新请求文件
log = pd.read_excel('run_log.xlsx')
new_run_requests = pd.read_csv('Run+Request+Sheet_September+6,+2022_14.28.csv')

# 获取当前时间,拆分日期和时间(匹配原日志格式)
current_datetime = datetime.now()
request_date = current_datetime.strftime('%m/%d/%Y')
request_time = current_datetime.strftime('%H%M')

# 构造新记录DataFrame,严格匹配原日志列结构
new_records = pd.DataFrame({
    'Run_ID': new_run_requests['ResponseId'],
    'Date_Requested': request_date,
    'Time_Requested': request_time,
    'Requestor': 'actual_requestor@example.com',  # 替换为实际请求者邮箱
    'Date_Completed': None,
    'Time_Completed': None
})

步骤2:合并原日志与新记录

使用pd.concat合并整个DataFrame,而非单独修改某一列:

# 合并原日志和新记录,重置索引
updated_log = pd.concat([log, new_records], ignore_index=True)

# 去重(避免重复添加同一Run_ID)
updated_log = updated_log.drop_duplicates(subset='Run_ID', keep='first')

# 保存回Excel文件
updated_log.to_excel('run_log.xlsx', index=False)

二、结构化日志的替代方案

你提到logging模块似乎不满足需求,其实它可以通过自定义配置实现结构化日志,同时还有其他更适配的方案:

1. 优化使用logging模块

通过dictConfig配置日志输出为JSON格式,方便后续解析为DataFrame:

import logging
import json
from datetime import datetime

class StructuredFormatter(logging.Formatter):
    def format(self, record):
        log_record = {
            'Run_ID': getattr(record, 'run_id', 'unknown'),
            'Date_Requested': datetime.now().strftime('%m/%d/%Y'),
            'Time_Requested': datetime.now().strftime('%H%M'),
            'Requestor': getattr(record, 'requestor', 'unknown'),
            'Date_Completed': getattr(record, 'date_completed', None),
            'Time_Completed': getattr(record, 'time_completed', None)
        }
        return json.dumps(log_record)

# 配置日志
logging.basicConfig(level=logging.INFO)
handler = logging.FileHandler('structured_log.json')
handler.setFormatter(StructuredFormatter())
logger = logging.getLogger('run_logger')
logger.addHandler(handler)

# 记录日志
logger.info('New run initiated', extra={'run_id': 'R_jals893', 'requestor': 'email@email.com'})

后续可通过pd.read_json读取JSON日志,转换为DataFrame处理。

2. 使用SQLite数据库

如果日志量较大,SQLite比Excel/CSV更高效,支持查询、去重、更新等操作:

import sqlite3
from datetime import datetime

conn = sqlite3.connect('run_log.db')
cursor = conn.cursor()

# 首次运行创建日志表
cursor.execute('''
CREATE TABLE IF NOT EXISTS run_log (
    Run_ID TEXT PRIMARY KEY,
    Date_Requested TEXT,
    Time_Requested TEXT,
    Requestor TEXT,
    Date_Completed TEXT,
    Time_Completed TEXT
)
''')

# 插入新记录(忽略已存在的Run_ID)
current_datetime = datetime.now()
run_id = 'R_jals893'
cursor.execute('''
INSERT OR IGNORE INTO run_log (Run_ID, Date_Requested, Time_Requested, Requestor)
VALUES (?, ?, ?, ?)
''', (run_id, current_datetime.strftime('%m/%d/%Y'), current_datetime.strftime('%H%M'), 'email@email.com'))

conn.commit()
conn.close()

3. 继续使用Excel/CSV(小体量日志场景)

即前面提到的pandas方案,操作简单直观,适合日志量不大的场景。

内容的提问来源于stack exchange,提问作者a tired engineer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:54:22