鱼C论坛

 找回密码
 立即注册
查看: 2686|回复: 2

[技术交流] python3 logging 日志记录

[复制链接]
发表于 2020-12-11 11:43:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# main
  1. #coding=utf-8

  2. import logging
  3. from time import sleep
  4. import time
  5. from subprocess import Popen
  6. from threading import Thread
  7. from parseXml import parsexml
  8. from log import log

  9. def command(args, **kwargs):
  10.     # 子节点
  11.     ch = logging.getLogger('dxdiag.start')
  12.     try:
  13.         # print('\nargs:{}\
  14.                # \nkwargs: {}'.format(args, kwargs))
  15.         pro = Popen(args, **kwargs)
  16.     except Exception as err:
  17.         print('\nargs:{}\
  18.                \nkwargs: {}\
  19.                \nerror:{}'.format(args, kwargs, err))
  20.         ch.exception('启动失败')
  21.         return False
  22.     else:
  23.         return pro


  24. def dxdiag():
  25.     # resultFileName
  26.     global name
  27.     dxdiag = [r'C:\Windows\SysWOW64\dxdiag.exe',
  28.               '/dontskip', '/whql:off', '/64bit', '/x', name+'.xml']
  29.     d = command(dxdiag)
  30.     ch = logging.getLogger('dxdiag')
  31.     ch.info('Dxdiag 正在读取系统配置, 请稍候。。。 ')
  32.     while True:
  33.         d.poll()
  34.         if not d.returncode is None: break
  35.         sleep(0.25)


  36. if __name__ == '__main__':
  37.     # 设置日志父节点, 文件名
  38.     logger = log('dxdiag', 'didxag.log')
  39.     name = 'config'
  40.     a = Thread(target=dxdiag, daemon=True)
  41.     a.start()
  42.     a.join()
  43.     xml = parsexml(name+'.xml')
  44.     xml.getData()
  45.     xml.saveText(name+'.txt', 'w')
复制代码


日志配置模块
  1. # coding=utf-8

  2. import logging

  3. # 默认生成的root logger的level是logging.WARNING,低于该级别的就不输出
  4. # 级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG

  5. class log(object):
  6.     def __init__(self, name, file):
  7.         self.name = name
  8.         self.file = file
  9.         self.logger = logging.getLogger(self.name)
  10.         self.logger.setLevel(logging.INFO)
  11.         
  12.         # 控制台输出
  13.         self.controlHandler = logging.StreamHandler()
  14.         self.controlHandler.setLevel(logging.INFO)
  15.         self.controlHandler.setFormatter(logging.Formatter(
  16.             '%(levelname)s: %(message)s'))
  17.         
  18.         # 文件
  19.         self.logHandler = logging.FileHandler(self.file, 'w')
  20.         self.logHandler.setLevel(logging.DEBUG)
  21.         self.logHandler.setFormatter(logging.Formatter(
  22.             '%(asctime)s %(filename)s %(name)s [Line:%(lineno)d] [ProcessID:%(process)d] %(levelname)s: %(message)s'))
  23.         
  24.         # 处理器
  25.         self.logger.addHandler(self.logHandler)
  26.         self.logger.addHandler(self.controlHandler)
复制代码


解析xml
  1. # coding=utf-8

  2. import logging
  3. import xml.etree.ElementTree as ET
  4. from prettytable import PrettyTable


  5. class parsexml(object):
  6.     def __init__(self, xmlName):
  7.         try:
  8.             self.log = logging.getLogger('dxdiag.parsexml')
  9.             self.xmlName = xmlName
  10.             self._root = ET.parse(self.xmlName).getroot()
  11.             self.sheetList = []
  12.             self.sheettitle = []
  13.         except Exception as err:
  14.             self.log.exception(f'打开文件失败{self.xmlName}')

  15.     @staticmethod
  16.     def _table(elementTree):
  17.         # xml 元素
  18.         tb = PrettyTable()
  19.         tb.field_names = ["Name", "Data"]
  20.         tb.align["Name"] = 'l'
  21.         data = [[each.tag, each.text] for each in elementTree]
  22.         for row in data:
  23.             tb.add_row(row)
  24.         return tb
  25.    
  26.     def saveText(self, fileName, mode):
  27.         self.log.info(f'正在保存数据 {self.xmlName}')
  28.         count = 0
  29.         total = len(self.sheetList)
  30.         with open(fileName, mode) as fp:
  31.             for sheet, title in zip(self.sheetList, self.sheettitle):
  32.                 # 增加标题
  33.                 fp.write(sheet.get_string(title=title))
  34.                 count += 1
  35.                 # 在最后一个表格之前增加换行符
  36.                 if count < total: fp.write('\n')
  37.    
  38.     def getData(self):
  39.         self.log.info(f'正在解析数据 {self.xmlName}')
  40.         si = self._root.find('SystemInformation')
  41.         self.sheetList.append(self._table(si))
  42.         self.sheettitle.append('SystemInformation')
  43.         
  44.         display = self._root.find('DisplayDevices')
  45.         display = display.find('DisplayDevice')
  46.         self.sheetList.append(self._table(display[:12]))
  47.         self.sheettitle.append('DisplayDevices')
  48.         
  49.         disk = self._root.find('LogicalDisks')
  50.         disk = disk.findall('LogicalDisk')
  51.         for each in disk:
  52.             self.sheetList.append(self._table(each))
  53.             self.sheettitle.append('LogicalDisks')

  54.         for i in self.sheetList:
  55.             print(i)




  56. if __name__ == '__main__':
  57.     xml = parsexml('config.xml')
  58.     xml.getData()
  59.     xml.saveText('config.txt','w')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-11 11:54:31 From FishC Mobile | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-11 12:15:10 From FishC Mobile | 显示全部楼层
hrp 发表于 2020-12-11 11:54

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-30 16:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表