Python日志添加用户及计算机名:现有实现是否有更优方案?
更优实现方案
推荐方案:直接在日志格式中嵌入用户/计算机名
这是最高效的方式,从日志生成的源头就包含所需信息,避免后续额外的文件读写和DataFrame修改操作,逻辑更简洁,性能更好。
import logging import os import pandas as pd user = os.getlogin() computer = os.environ['COMPUTERNAME'] # 在日志格式字符串中直接加入用户和计算机名变量 logging.basicConfig( level=logging.DEBUG, filename='log.txt', filemode='w', format=f'%(filename)s|Line - %(lineno)s|%(asctime)s|%(levelname)s|{user}|{computer}|%(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 生成日志时,每条记录会自动带上user和computer字段 logging.debug('示例调试日志') logging.info('示例信息日志') # 读取日志到DataFrame,直接包含所有需要的列 log = pd.read_csv('log.txt', sep='|', header=None) log.columns = ['Job_Name', 'Line', 'Date_Time', 'Level', 'User', 'Computer', 'Message'] # 直接将DataFrame导入SQL Server即可
备选方案:优化DataFrame赋值逻辑(若无法修改日志格式)
如果因为某些限制不能修改日志输出格式,那么不要用iterrows()逐行修改,改用pandas的整列向量化赋值,效率会大幅提升(尤其是日志行数较多时)。
import logging import os import pandas as pd user = os.getlogin() computer = os.environ['COMPUTERNAME'] logging.basicConfig( level=logging.DEBUG, filename='log.txt', filemode='w', format='%(filename)s|Line - %(lineno)s|%(asctime)s|%(levelname)s|%(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 生成日志... log = pd.read_csv('log.txt', sep='|', header=None) log.columns = ['Job_Name', 'Line', 'Date_Time', 'Level', 'Message'] # 整列赋值替代逐行循环,性能提升显著 log['User'] = user log['Computer'] = computer # 导入SQL Server
方案优势说明
- 推荐方案:减少了一次文件读取后的修改操作,日志文件本身就完整保存了所有业务需要的字段,后续导入数据库的流程更顺畅,同时降低了IO开销。
- 备选方案:避免了
iterrows()的低效逐行遍历,pandas的向量化操作是基于底层C实现的,处理大量数据时速度会比逐行循环快几十甚至上百倍。
内容的提问来源于stack exchange,提问作者WannabeDev
相关产品推荐
相关产品推荐

