Guest User

Untitled

a guest
Oct 19th, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.26 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import logging, os, re, time, datetime
  3. import multiprocessing
  4. import sys
  5. import inspect
  6. import os
  7. import time
  8. from stat import *
  9. from logging.handlers import TimedRotatingFileHandler
  10. try:
  11. import codecs
  12. except ImportError:
  13. codecs = None
  14.  
  15. _MIDNIGHT = 24 * 60 * 60 # number of seconds in a day
  16.  
  17.  
  18. class MyLoggerHandler(logging.FileHandler):
  19. def __init__(self, filename, when='D', interval=1, backupCount=0, encoding=None, delay=False):
  20. self.prefix = filename
  21. self.when = when.upper()
  22. # S - Every second a new file
  23. # M - Every minute a new file
  24. # H - Every hour a new file
  25. # D - Every day a new file
  26. if self.when == 'S':
  27. self.interval = 1 # one second
  28. self.suffix = "%Y-%m-%d_%H-%M-%S"
  29. self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$"
  30. elif self.when == 'M':
  31. self.interval = 60 # one minute
  32. self.suffix = "%Y-%m-%d_%H-%M"
  33. self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$"
  34. elif self.when == 'H':
  35. self.interval = 60 * 60 # one hour
  36. self.suffix = "%Y-%m-%d_%H"
  37. self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}$"
  38. elif self.when == 'D' or self.when == 'MIDNIGHT':
  39. self.interval = 60 * 60 * 24 # one day
  40. self.suffix = "%Y-%m-%d"
  41. self.extMatch = r"^\d{4}-\d{2}-\d{2}$"
  42. elif self.when.startswith('W'):
  43. self.interval = 60 * 60 * 24 * 7 # one week
  44. if len(self.when) != 2:
  45. raise ValueError("You must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s" % self.when)
  46. if self.when[1] < '0' or self.when[1] > '6':
  47. raise ValueError("Invalid day specified for weekly rollover: %s" % self.when)
  48. self.dayOfWeek = int(self.when[1])
  49. self.suffix = "%Y-%m-%d"
  50. self.extMatch = r"^\d{4}-\d{2}-\d{2}$"
  51. else:
  52. raise ValueError("Invalid rollover interval specified: %s" % self.when)
  53.  
  54.  
  55. self.interval = self.interval * interval # multiply by units requested
  56. self.filefmt = "%s.%s" % (self.prefix, self.suffix)
  57. # print "### self.filefmt = %s" % self.filefmt
  58.  
  59. self.filePath = datetime.datetime.now().strftime(self.filefmt)
  60.  
  61. _dir = os.path.dirname(self.filePath)
  62. try:
  63. if os.path.exists(_dir) is False:
  64. os.makedirs(_dir)
  65. except Exception:
  66. print("can not make dirs")
  67. print("filepath is " + self.filePath)
  68. pass
  69.  
  70. self.backupCount = backupCount
  71. if codecs is None:
  72. encoding = None
  73. logging.FileHandler.__init__(self, self.filePath, 'a', encoding, delay)
  74.  
  75. if os.path.exists(filename):
  76. t = os.stat(filename)[ST_MTIME]
  77. else:
  78. t = int(time.time())
  79.  
  80. self.rolloverAt = self.computeRollover(t)
  81. #print "t = %d" % t
  82. #print "self.rolloverAt = %d" % self.rolloverAt
  83. def computeRollover(self, currentTime):
  84. """
  85. Work out the rollover time based on the specified time.
  86. """
  87. result = currentTime + self.interval
  88. # If we are rolling over at midnight or weekly, then the interval is already known.
  89. # What we need to figure out is WHEN the next interval is. In other words,
  90. # if you are rolling over at midnight, then your base interval is 1 day,
  91. # but you want to start that one day clock at midnight, not now. So, we
  92. # have to fudge the rolloverAt value in order to trigger the first rollover
  93. # at the right time. After that, the regular interval will take care of
  94. # the rest. Note that this code doesn't care about leap seconds. :)
  95. if self.when == 'MIDNIGHT' or self.when.startswith('W'):
  96. # This could be done with less code, but I wanted it to be clear
  97. # if self.utc:
  98. # t = time.gmtime(currentTime)
  99. # else:
  100. t = time.localtime(currentTime)
  101. currentHour = t[3]
  102. currentMinute = t[4]
  103. currentSecond = t[5]
  104. # r is the number of seconds left between now and midnight
  105. r = _MIDNIGHT - ((currentHour * 60 + currentMinute) * 60 +
  106. currentSecond)
  107. result = currentTime + r
  108. # If we are rolling over on a certain day, add in the number of days until
  109. # the next rollover, but offset by 1 since we just calculated the time
  110. # until the next day starts. There are three cases:
  111. # Case 1) The day to rollover is today; in this case, do nothing
  112. # Case 2) The day to rollover is further in the interval (i.e., today is
  113. # day 2 (Wednesday) and rollover is on day 6 (Sunday). Days to
  114. # next rollover is simply 6 - 2 - 1, or 3.
  115. # Case 3) The day to rollover is behind us in the interval (i.e., today
  116. # is day 5 (Saturday) and rollover is on day 3 (Thursday).
  117. # Days to rollover is 6 - 5 + 3, or 4. In this case, it's the
  118. # number of days left in the current week (1) plus the number
  119. # of days in the next week until the rollover day (3).
  120. # The calculations described in 2) and 3) above need to have a day added.
  121. # This is because the above time calculation takes us to midnight on this
  122. # day, i.e. the start of the next day.
  123. if self.when.startswith('W'):
  124. day = t[6] # 0 is Monday
  125. if day != self.dayOfWeek:
  126. if day < self.dayOfWeek:
  127. daysToWait = self.dayOfWeek - day
  128. else:
  129. daysToWait = 6 - day + self.dayOfWeek + 1
  130. newRolloverAt = result + (daysToWait * (60 * 60 * 24))
  131. if not self.utc:
  132. dstNow = t[-1]
  133. dstAtRollover = time.localtime(newRolloverAt)[-1]
  134. if dstNow != dstAtRollover:
  135. if not dstNow: # DST kicks in before next rollover, so we need to deduct an hour
  136. addend = -3600
  137. else: # DST bows out before next rollover, so we need to add an hour
  138. addend = 3600
  139. newRolloverAt += addend
  140. result = newRolloverAt
  141. return result
  142.  
  143. def shouldRollover(self):
  144. """
  145. Determine if rollover should occur.
  146.  
  147. record is not used, as we are just comparing times, but it is needed so
  148. the method signatures are the same
  149. """
  150. #_filePath = datetime.datetime.now().strftime(self.filefmt)
  151. #print "_filePath = %s" % _filePath
  152.  
  153. self.filePath = time.strftime(self.filefmt, time.localtime(self.rolloverAt))
  154. #print "self.filePath = %s" % self.filePath
  155. t = int(time.time())
  156. if t >= self.rolloverAt:
  157. return 1
  158. #print "No need to rollover: %d, %d" % (t, self.rolloverAt)
  159. return 0
  160.  
  161.  
  162.  
  163. def doChangeFile(self):
  164. self.baseFilename = os.path.abspath(self.filePath)
  165. if self.stream is not None:
  166. self.stream.flush()
  167. self.stream.close()
  168.  
  169. # if sys.version_info < (2, 7, 6):
  170. # # Do stuff for old version...
  171. # self.stream = self._open()
  172. # else:
  173. if not self.delay:
  174. self.stream = self._open()
  175. if self.backupCount > 0:
  176. for s in self.getFilesToDelete():
  177. os.remove(s)
  178.  
  179. def getFilesToDelete(self):
  180.  
  181. dirName, baseName = os.path.split(self.baseFilename)
  182. #print dirName, baseName
  183. fileNames = os.listdir(dirName)
  184. #print("fileNames: ", fileNames)
  185. #print("self.extMatch: ", self.extMatch)
  186. result = []
  187. prefix = self.prefix + "."
  188. #print prefix
  189. tag = dirName + '/'
  190.  
  191. prefix = prefix.split(tag)[1]
  192. # print prefix
  193. plen = len(prefix)
  194. # print plen
  195. for fileName in fileNames:
  196. # print fileName[:plen]
  197. if fileName[:plen] == prefix:
  198. suffix = fileName[plen:]
  199. # print suffix
  200. if re.compile(self.extMatch).match(suffix):
  201. result.append(os.path.join(dirName, fileName))
  202. result.sort()
  203. # print(result)
  204. if len(result) < self.backupCount:
  205. result = []
  206. else:
  207. result = result[:len(result) - self.backupCount]
  208. return result
  209.  
  210. def emit(self, record):
  211. """
  212. Emit a record.
  213. """
  214. try:
  215.  
  216. # if self.shouldChangeFileToWrite():
  217. if self.shouldRollover():
  218. self.doChangeFile()
  219. self.rolloverAt = self.rolloverAt + self.interval
  220. logging.FileHandler.emit(self, record)
  221. except (KeyboardInterrupt, SystemExit):
  222. raise
  223. except:
  224. self.handleError(record)
  225.  
  226. class log_helper():
  227. def __init__(self, filename, logger):
  228.  
  229. logdir = os.getcwd()+"/"+"logs"
  230. if not os.path.exists(logdir):
  231. os.mkdir(logdir)
  232. filename = logdir+"/"+filename
  233.  
  234. lh = MyLoggerHandler(filename, when='MIDNIGHT',interval=1, backupCount=30)
  235. # lh = MyLoggerHandler(filename, when='M',interval=2, backupCount=5)
  236. # lh = logging.handlers.TimedRotatingFileHandler(filename, when='M',interval=1) # , backupCount=5)
  237. fm = logging.Formatter('%(asctime)s %(filename)s(%(lineno)d) %(levelname)s %(name)s - %(message)s')
  238. lh.setFormatter(fm)
  239. self.logger = logging.getLogger(logger)
  240. self.logger.addHandler(lh)
  241. self.logger.setLevel(logging.DEBUG)
  242. console = logging.StreamHandler()
  243. console.setLevel(logging.DEBUG)
  244. console.setFormatter(fm)
  245. logging.getLogger(logger).addHandler(console)
  246. self.debug_lock = multiprocessing.Lock()
  247. self.info_lock = multiprocessing.Lock()
  248. self.warn_lock = multiprocessing.Lock()
  249. self.error_lock = multiprocessing.Lock()
  250. self.critical_lock = multiprocessing.Lock()
  251.  
  252. def debug(self, message):
  253. with self.debug_lock:
  254. frame, filename, line, module, code, unknow = inspect.stack()[1]
  255. message = "%s(%d) - %s" % (os.path.basename(filename), line, message)
  256. self.logger.debug(message)
  257.  
  258. def info(self, message):
  259. with self.info_lock:
  260. frame, filename, line, module, code, unknow = inspect.stack()[1]
  261. message = "%s(%d) - %s" % (os.path.basename(filename), line, message)
  262. self.logger.info(message)
  263. def warn(self, message):
  264. with self.warn_lock:
  265. frame, filename, line, module, code, unknow = inspect.stack()[1]
  266. message = "%s(%d) - %s" % (os.path.basename(filename), line, message)
  267. self.logger.warn(message)
  268.  
  269. def error(self, message):
  270. with self.error_lock:
  271. frame, filename, line, module, code, unknow = inspect.stack()[1]
  272. message = "%s(%d) - %s" % (os.path.basename(filename), line, message)
  273. self.logger.error(message)
  274.  
  275. def critical(self, message):
  276. with self.critical_lock:
  277. frame, filename, line, module, code, unknow = inspect.stack()[1]
  278. message = "%s(%d) - %s" % (os.path.basename(filename), line, message)
  279. self.logger.critical(message)
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287. class Logger:
  288. def __init__(self):
  289. self.logger = log_helper("active3.log","active3")
  290.  
  291. def AddLoghandle(filename):
  292. return log_helper(filename)
  293.  
  294.  
  295. #lock = multiprocessing.Lock()
  296. #with lock:
  297. log = Logger()
  298.  
  299. def worker():
  300. i = 0
  301.  
  302. while i < int(sys.argv[2]):
  303.  
  304. ss = "Hello world " + ' ' + str(os.getpid()) + ' ' +str(i)
  305. log.logger.info(ss)
  306. log.logger.debug(ss)
  307. i += 1
  308. # log.logger.warn(ss)
  309. # time.sleep(1)
  310. # log.logger.error(ss)
  311. # time.sleep(1)
  312. while True:
  313. pass
  314. #
  315.  
  316. if __name__ == "__main__":
  317. processnum = int(sys.argv[1])
  318. record = []
  319. for i in range(processnum):
  320. print("1111111111111, index = %d" % i)
  321. process = multiprocessing.Process(target=worker)
  322. process.start()
  323. record.append(process)
  324.  
  325. for process in record:
  326. process.join()
  327.  
  328. while True:
  329. pass
Add Comment
Please, Sign In to add comment