LoggingUtil.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. # -*- coding: utf-8 -*-
  2. import json
  3. import logging
  4. import os
  5. import sys
  6. import time
  7. import datetime
  8. import numpy as np
  9. import struct
  10. import binascii
  11. from ssat_sdk.utils.string_util import pathToWindowsPath
  12. from ssat_sdk.sat_environment import getSATTmpDIR, writeIsSendKeyTakePicture
  13. from ssat_sdk.sat_environment import getRunnerTcpPort
  14. import socket
  15. _IsLoggerCreated = None
  16. # log tcp 客户端;
  17. class logClient:
  18. def __init__(self):
  19. self.sock = None
  20. self.port = getRunnerTcpPort()
  21. self.constate = False
  22. def __del__(self):
  23. self.disconnect()
  24. # 连接服务器;
  25. def connect(self):
  26. try:
  27. self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  28. self.port = getRunnerTcpPort() # 再读取一次端口号;
  29. self.sock.connect(('127.0.0.1', self.port)) #没有返回值;
  30. self.constate = True
  31. except Exception, e:
  32. print "LoggingUtil:client=> socket connect error:", e, self.port
  33. self.constate = False
  34. return self.constate
  35. # 发送消息;
  36. def sendmsg(self, msg, type = 'printLog'):
  37. if self.constate is False:
  38. if self.connect() is False:
  39. return
  40. msg_json = ""
  41. msg_dict = {'ReportType': type, 'prinMsg': msg}
  42. try:
  43. msg_json = json.dumps(msg_dict)
  44. except Exception:
  45. print "LoggingUtil:client=> to json error:", msg
  46. return
  47. try:
  48. self.sock.settimeout(1)
  49. self.sock.sendall(msg_json)
  50. self.sock.settimeout(None)
  51. except Exception, e:
  52. print "LoggingUtil:client=>无Runner接收结果。Error:", e, 'runner_sender_port:', self.port
  53. self.disconnect()
  54. self.connect()
  55. # 断开连接;
  56. def disconnect(self):
  57. if self.sock is None:
  58. return
  59. try:
  60. self.sock.shutdown(2)
  61. self.sock.close()
  62. except Exception, e:
  63. print "LoggingUtil:client=> socket disconnect error:", e
  64. # 定义:
  65. DataHeader = np.dtype({'names': ['protocol', 'len', 'cmd'], 'formats': ['u1', 'u4', 'u1']}, align=False)
  66. # 通知SATService正常关机、重启;
  67. NoticeResp = np.dtype({'names': ['TimeStamp', 'NoticeType'], 'formats': ['u8', 'u4']}, align=False)
  68. class noticeClient:
  69. def __init__(self):
  70. '''通信sock'''
  71. self.sock = None
  72. '''通信端口号'''
  73. self.port = getRunnerTcpPort()
  74. '''通信状态'''
  75. self.constate = False
  76. def __def__(self):
  77. self.disconnect()
  78. '''连接服务器'''
  79. def connect(self):
  80. try:
  81. self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  82. self.sock.connect(('127.0.0.1', self.port)) # 没有返回值;
  83. self.sock.sendall("2222")
  84. self.constate = True
  85. except Exception, e:
  86. print "noticeClient=> socket connect error:", e, self.port
  87. self.constate = False
  88. return self.constate
  89. # 发送通知,不接收返回;
  90. def sendnotice(self, type):
  91. '''是否连接'''
  92. if self.constate is False:
  93. if self.connect() is False:
  94. print u'连接服务器失败'
  95. return False
  96. '''拼装要发送的数据包'''
  97. notice = np.array([(time.time(), type)], dtype=NoticeResp)
  98. '''发送请求数据'''
  99. try:
  100. self.sock.settimeout(5)
  101. phead = np.array([(0xAA, notice.itemsize + np.array([(0xAA, 0, 0x01)], dtype=DataHeader).itemsize, 0x06)], dtype=DataHeader)
  102. '''一次性发送完整包'''
  103. self.sock.sendall(bytearray(phead.tobytes() + notice.tobytes()))
  104. self.sock.settimeout(None)
  105. except Exception, e:
  106. print "noticeClient=> send Error:", e
  107. self.disconnect()
  108. self.connect()
  109. return False
  110. print u'成功发送'
  111. return True
  112. '''断开连接'''
  113. def disconnect(self):
  114. try:
  115. self.sock.shutdown(2)
  116. self.sock.close()
  117. except Exception, e:
  118. print "noticeClient=> socket disconnect error:", e
  119. # 单例模块;
  120. logClient_singleton = logClient()
  121. noticeClient_singleton = noticeClient()
  122. def sendKey(keyname, keyExit):
  123. if keyExit:
  124. msg = currentTime() + '执行sendKey:' + keyname
  125. else:
  126. msg = currentTime() + 'sendKey:' + keyname + '不存在'
  127. print msg
  128. def takePicpure(result, picpath):
  129. # msg = {'ReportType': "takePicpure", 'data': {'result': result, 'picpath': picpath}}
  130. msg = currentTime() + 'takePicture:' + '截图结果:' + \
  131. str(result) + '截图路径:' + picpath
  132. print msg
  133. def printLog(tag='', logmsg=''):
  134. # msg = {'ReportType': "printLog", 'data': {'logmsg': logmsg}}
  135. if logmsg == '':
  136. msg = currentTime() + 'printLog:%s' % str(tag)
  137. tcpMsg = str(tag)
  138. else:
  139. msg = currentTime() + 'printLog:%s:%s' % (str(tag), str(logmsg))
  140. tcpMsg = str(tag) + str(logmsg)
  141. print msg
  142. # logClient_singleton.sendmsg(tcpMsg)
  143. def NotifyShutdown():
  144. # 参数0表示正常关机;
  145. noticeClient_singleton.sendnotice(0)
  146. def NotifyReboot():
  147. # 参数1表示正常重启;
  148. noticeClient_singleton.sendnotice(1)
  149. def caseResult(caseresult):
  150. # msg = {'ReportType': "printLog", 'data': {'logmsg': logmsg}}
  151. # 改用TCP方式发送结果给Runner端
  152. msg = currentTime() + u'TcpClient发送的信息caseResult:' + caseresult
  153. print msg
  154. def currentTime():
  155. return time.strftime('%Y-%m-%d %H:%M:%S ', time.localtime(time.time()))
  156. # log标签
  157. createdlogTab = 'default'
  158. # 记录当前保存的log的文件夹路径
  159. caseRunLogDirPath = os.path.join(getSATTmpDIR(), 'case_run_no_created')
  160. # 记录关闭之前保存的log的文件夹路径
  161. debugCaseRunLogDirPath = os.path.join(getSATTmpDIR(), 'case_run_no_created')
  162. # 自定义DebugLogger对象
  163. debugLogger = None
  164. Tag_pyFileName = os.path.split(__file__)[-1]
  165. class DebugLogger():
  166. def info(self, pyFileName, className, funName, msg):
  167. # 打印Log信息
  168. logtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
  169. logMsg = "%s %s %s.%s INFO %s \n" % (logtime, pyFileName, className, funName, msg)
  170. print "调试信息=>",logMsg
  171. # 往文件里面写log信息
  172. mkCasedir(caseRunLogDirPath)
  173. filePath = os.path.join(caseRunLogDirPath, 'case_run.log')
  174. fp = open(filePath, 'a')
  175. fp.write(logMsg)
  176. fp.close()
  177. # writeDeviceMsgLine(fp,logMsg)
  178. def getDebugLogger():
  179. global debugLogger
  180. if not debugLogger:
  181. debugLogger = DebugLogger()
  182. return debugLogger
  183. def closeFileHandler(logTab='default'):
  184. global createdlogTab, caseRunLogDirPath
  185. # 如果传进来的创建log文件来源和关闭来源相等,则关闭该文件流
  186. print 'createdlogTab:', createdlogTab, 'logTab:', logTab
  187. # 关闭log打印流时候,把按键打印截图开关 关闭
  188. closeSendKeyTakePicture()
  189. if logTab != 'default' and logTab == createdlogTab:
  190. debugLogPath = os.path.join(caseRunLogDirPath, 'case_run.log')
  191. getDebugLogger().info('Loggger.py', 'NoClass', 'closeFileHandler',
  192. u'关闭Tab:%s的case_run.log文件保存路径:%s' % (logTab, pathToWindowsPath(debugLogPath)))
  193. caseRunLogDirPath = os.path.join(getSATTmpDIR(), 'case_run_no_created')
  194. createdlogTab = 'default'
  195. def createFileHandler(logTab='default'):
  196. global createdlogTab, caseRunLogDirPath, debugCaseRunLogDirPath
  197. # closeFileHandler()
  198. print 'createFileHandler createdlogTab:', createdlogTab
  199. # 创建log文件夹时,把按键打印截图开关打开
  200. startSendKeyTakePicture()
  201. if createdlogTab == 'default':
  202. print '创建文件'
  203. caseRunLogDir = 'case_run_' + \
  204. '{0:%Y%m%d%H%M%S%f}'.format(datetime.datetime.now())
  205. caseRunLogDirPath = os.path.join(getSATTmpDIR(), caseRunLogDir)
  206. # 在调试的时候,记录调试信息路径
  207. debugCaseRunLogDirPath = caseRunLogDirPath
  208. mkCasedir(caseRunLogDirPath)
  209. debugLogPath = os.path.join(caseRunLogDirPath, 'case_run.log')
  210. getDebugLogger().info('Loggger.py', 'NoClass', 'closeFileHandler',
  211. u'创建Tab:%s的case_run.log文件保存路径:%s' % (logTab, pathToWindowsPath(debugLogPath)))
  212. # 用于编辑该log文件创建的来源
  213. createdlogTab = logTab
  214. def startSendKeyTakePicture():
  215. writeIsSendKeyTakePicture("True")
  216. def closeSendKeyTakePicture():
  217. writeIsSendKeyTakePicture("False")
  218. def getCaseRunLogDirPath():
  219. global caseRunLogDirPath
  220. mkCasedir(caseRunLogDirPath)
  221. return caseRunLogDirPath
  222. def getDebugCaseRunLogDirPath():
  223. global debugCaseRunLogDirPath
  224. return debugCaseRunLogDirPath
  225. def mkCasedir(dir):
  226. if (not os.path.exists(dir)):
  227. os.mkdir(dir)
  228. if __name__ == "__main__":
  229. # getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面000")
  230. # createFileHandler('scrpt')
  231. # getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面")
  232. # createFileHandler('toDestUI')
  233. # getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面222")
  234. # getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面333")
  235. # getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面444")
  236. # closeFileHandler('toDestUI')
  237. # getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面555")
  238. # closeFileHandler('scrpt')
  239. # createFileHandler('toDestUI')
  240. # getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面666")
  241. # time.sleep(15)
  242. # getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面222")
  243. # deleteDebugLofFile()
  244. # getDebugLogger().info('')
  245. # deleteDebugLofFile()
  246. # print os.times()
  247. # now_time = datetime.datetime.now()
  248. # print now_time
  249. # print '{0:%Y%m%d%H%M%S%f}'.format(datetime.datetime.now())
  250. # createFileHandler('script')
  251. # getDebugLogger().info(u"当前界面即为目标界面")
  252. # getDebugLogger().info(u"当前界面即为目标界面22")
  253. # getDebugLogger().info(u"当前界面即为目标界面33")
  254. # print 'getCaseRunLogDirPath:', getCaseRunLogDirPath()
  255. # closeFileHandler('script')
  256. # # time.sleep(5)
  257. # createFileHandler('toDestUI')
  258. # getDebugLogger().info(u"当前界面即为目标界面")
  259. # print 'getCaseRunLogDirPath:', getCaseRunLogDirPath()
  260. # closeFileHandler('toDestUI')
  261. NotifyReboot()