You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_log.py 10 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. # Copyright 2020 Huawei Technologies Co., Ltd
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. # ============================================================================
  15. """
  16. log test
  17. """
  18. import logging
  19. import os
  20. import re
  21. import shutil
  22. import sys
  23. import time
  24. def test_log_stdout():
  25. # Clean up environment variables
  26. _rm_env_config()
  27. # print the logs without raising an exception.
  28. from mindspore import log as logger
  29. log_str = 'print informations'
  30. logger.error("1 test log message info :%s", log_str)
  31. logger.info("2 test log message info")
  32. logger.warning("3 test log message warning")
  33. logger.debug("4 test log message debug:%s", log_str)
  34. # Clean up _global_logger to avoid affecting for next usecase
  35. _clear_logger(logger)
  36. def test_log_default():
  37. _rm_env_config()
  38. from mindspore import log as logger
  39. configdict = logger.get_log_config()
  40. targetdict = {'GLOG_v': '2', 'GLOG_logtostderr': '1'}
  41. assert configdict == targetdict
  42. # Clean up _global_logger to avoid affecting for next usecase
  43. _clear_logger(logger)
  44. def test_log_setlevel():
  45. _rm_env_config()
  46. os.environ['GLOG_v'] = '0'
  47. from mindspore import log as logger
  48. # logger_instance = logger._get_logger()
  49. # del logger_instance
  50. loglevel = logger.get_level()
  51. log_str = 'print debug informations'
  52. logger.debug("5 test log message debug:%s", log_str)
  53. assert loglevel == '0'
  54. # Clean up _global_logger to avoid affecting for next usecase
  55. _clear_logger(logger)
  56. def test_log_file():
  57. """
  58. test the log content written in log file
  59. """
  60. _rm_env_config()
  61. file_path = '/tmp/log/mindspore_test'
  62. os.environ['GLOG_v'] = '2'
  63. os.environ['GLOG_logtostderr'] = '0'
  64. os.environ['GLOG_log_dir'] = file_path
  65. if os.path.exists(file_path):
  66. shutil.rmtree(file_path)
  67. filename = ''
  68. os.makedirs(file_path, exist_ok=True)
  69. from mindspore import log as logger
  70. _clear_logger(logger)
  71. logger.warning("test log message warning")
  72. file_path += '/rank_0/logs'
  73. f_list = os.listdir(file_path)
  74. # print f_list
  75. for file_name in f_list:
  76. if file_name.startswith('mindspore.log'):
  77. filename = f'{file_path}/{file_name}'
  78. cmd = f'cat {filename}'
  79. result = os.popen(cmd).read()
  80. # pylint: disable=anomalous-backslash-in-string
  81. pattern = "\[WARNING\] ME\(.*[0-9]:.*[0-9]\,.*[a-zA-Z0-9]\):.* " \
  82. "\[.*:.*[0-9]\] test log message warning"
  83. match_obj = re.match(pattern, result)
  84. # Clear test file
  85. if os.path.exists(file_path):
  86. shutil.rmtree(file_path)
  87. assert match_obj
  88. # Clean up _global_logger to avoid affecting for next usecase
  89. _clear_logger(logger)
  90. def test_log_backup_count():
  91. """
  92. test backup count
  93. """
  94. # logger.reset_log_config(level=logging.INFO, console=False,
  95. # filepath=file_path, maxBytes=1000, backupCount=10)
  96. _rm_env_config()
  97. file_path = '/tmp/log/mindspore_test'
  98. os.environ['GLOG_v'] = '1'
  99. os.environ['GLOG_logtostderr'] = '0'
  100. os.environ['GLOG_log_dir'] = file_path
  101. os.environ['logger_maxBytes'] = '1000'
  102. os.environ['logger_backupCount'] = '10'
  103. if os.path.exists(file_path):
  104. shutil.rmtree(file_path)
  105. os.makedirs(file_path, exist_ok=True)
  106. from mindspore import log as logger
  107. _clear_logger(logger)
  108. log_count = 100
  109. for i in range(0, log_count, 1):
  110. logger.warning("test log message warning %r", i)
  111. file_path += '/rank_0/logs'
  112. cmd = f'cd {file_path};ls -l | grep \'mindspore.log.*\'|wc -l'
  113. backup_count = '11'
  114. file_count = os.popen(cmd).read().strip()
  115. if os.path.exists(file_path):
  116. shutil.rmtree(file_path)
  117. assert file_count == backup_count
  118. # Clean up _global_logger to avoid affecting for next usecase
  119. _clear_logger(logger)
  120. def test_log_verify_envconfig():
  121. """
  122. test reset config
  123. """
  124. dictlist = []
  125. from mindspore import log as logger
  126. file_path = '/tmp'
  127. # level is not a number
  128. _rm_env_config()
  129. os.environ['GLOG_v'] = 'test'
  130. verify_dict_0 = logger._get_env_config()
  131. # level is not in range
  132. _rm_env_config()
  133. os.environ['GLOG_v'] = '100'
  134. verify_dict_1 = logger._get_env_config()
  135. # console is not a number
  136. _rm_env_config()
  137. os.environ['GLOG_logtostderr'] = 'test'
  138. verify_dict_2 = logger._get_env_config()
  139. # console is not in range
  140. _rm_env_config()
  141. os.environ['GLOG_logtostderr'] = '6'
  142. verify_dict_3 = logger._get_env_config()
  143. # path does not exist
  144. _rm_env_config()
  145. os.environ['GLOG_logtostderr'] = '0'
  146. os.environ['GLOG_log_dir'] = '/test'
  147. verify_dict_4 = logger._get_env_config()
  148. # path is not configured
  149. _rm_env_config()
  150. os.environ['GLOG_logtostderr'] = '0'
  151. verify_dict_5 = logger._get_env_config()
  152. # logger_maxBytes is not a number
  153. _rm_env_config()
  154. os.environ['GLOG_logtostderr'] = '0'
  155. os.environ['GLOG_log_dir'] = '/tmp'
  156. os.environ['logger_maxBytes'] = 'test'
  157. os.environ['logger_backupCount'] = '10'
  158. verify_dict_6 = logger._get_env_config()
  159. # logger_maxBytes is a negative number
  160. _rm_env_config()
  161. os.environ['GLOG_logtostderr'] = '0'
  162. os.environ['GLOG_log_dir'] = '/tmp'
  163. os.environ['logger_maxBytes'] = '-1'
  164. os.environ['logger_backupCount'] = '10'
  165. verify_dict_7 = logger._get_env_config()
  166. # logger_backupCount is not a number
  167. _rm_env_config()
  168. os.environ['GLOG_logtostderr'] = '0'
  169. os.environ['GLOG_log_dir'] = '/tmp'
  170. os.environ['logger_maxBytes'] = '0'
  171. os.environ['logger_backupCount'] = 'test'
  172. verify_dict_8 = logger._get_env_config()
  173. # logger_backupCount is a negative number
  174. _rm_env_config()
  175. os.environ['GLOG_logtostderr'] = '0'
  176. os.environ['GLOG_log_dir'] = '/tmp'
  177. os.environ['logger_maxBytes'] = '0'
  178. os.environ['logger_backupCount'] = '-1'
  179. verify_dict_9 = logger._get_env_config()
  180. for i in range(0, 10, 1):
  181. variable_name = f'verify_dict_{i}'
  182. dictlist.append(locals()[variable_name])
  183. for verify_dict in dictlist:
  184. try:
  185. logger._verify_config(verify_dict)
  186. except ValueError as ve:
  187. print(ve)
  188. assert True
  189. except TypeError as te:
  190. print(te)
  191. assert True
  192. else:
  193. assert False
  194. # Clean up _global_logger to avoid affecting for next usecase
  195. _clear_logger(logger)
  196. def test_log_repeated_print():
  197. """
  198. test Log repeated printing
  199. # Print one log is right, otherwise error
  200. """
  201. _rm_env_config()
  202. from mindspore import log as logger
  203. py_logging = logging.getLogger()
  204. handler = logging.StreamHandler(sys.stdout)
  205. handler.setLevel(logging.DEBUG)
  206. py_logging.addHandler(handler)
  207. logger.info("test log message info test ")
  208. # Clean up _global_logger to avoid affecting for next usecase
  209. _clear_logger(logger)
  210. def test_log_getconfig():
  211. _rm_env_config()
  212. os.environ['GLOG_v'] = '3'
  213. os.environ['GLOG_logtostderr'] = '0'
  214. os.environ['GLOG_log_dir'] = '/tmp/log/'
  215. os.environ['logger_maxBytes'] = '1000'
  216. os.environ['logger_backupCount'] = '10'
  217. from mindspore import log as logger
  218. _clear_logger(logger)
  219. logger.info("test log message info test")
  220. configdict = logger.get_log_config()
  221. targetdict = {'GLOG_v': '3', 'GLOG_log_dir': '/tmp/log/rank_0/logs',
  222. 'GLOG_logtostderr': '0', 'logger_maxBytes': 1000,
  223. 'logger_backupCount': 10, 'GLOG_stderrthreshold': '2'}
  224. assert configdict == targetdict
  225. # Clean up _global_logger to avoid affecting for next usecase
  226. _clear_logger(logger)
  227. def test_log_perf():
  228. """
  229. Performance test with python logging
  230. """
  231. _rm_env_config()
  232. os.environ['GLOG_v'] = '3'
  233. from mindspore import log as logger
  234. loglevel = logging.ERROR
  235. logging.basicConfig()
  236. py_logging = logging.getLogger()
  237. py_logging.setLevel(loglevel)
  238. log_count = 100000
  239. print("logger level:", logger.get_level())
  240. print("py_logging level:", py_logging.getEffectiveLevel())
  241. # Calculate PY logging execution time
  242. start_time_py_logging = int(round(time.time() * 1000))
  243. for i in range(0, log_count, 1):
  244. py_logging.info("test log message info :%r", i)
  245. end_time_py_logging = int(round(time.time() * 1000))
  246. time_diff_py_logging = end_time_py_logging - start_time_py_logging
  247. # Calculate MS logger execution time
  248. start_time_logger = int(round(time.time() * 1000))
  249. for i in range(0, log_count, 1):
  250. logger.info("test log message info :%r", i)
  251. end_time_logger = int(round(time.time() * 1000))
  252. time_diff_logger = end_time_logger - start_time_logger
  253. # Calculate time difference
  254. time_diff = time_diff_logger - time_diff_py_logging
  255. strprint = f'time difference between MS logger ' \
  256. f'and Python logging: {time_diff} ms'
  257. print(strprint)
  258. std_time = 2000
  259. assert time_diff < std_time
  260. # Clean up _global_logger to avoid affecting for next usecase
  261. _clear_logger(logger)
  262. def test_log_ms_import():
  263. _rm_env_config()
  264. import mindspore as ms
  265. configdict = ms.get_log_config()
  266. targetdict = {'GLOG_v': '2', 'GLOG_logtostderr': '1'}
  267. level = ms.get_level()
  268. assert configdict == targetdict and level == '2'
  269. def _clear_logger(logger):
  270. if logger._global_logger:
  271. for handler in logger._global_logger.handlers:
  272. logger._global_logger.removeHandler(handler)
  273. logger._global_logger = None
  274. def _rm_env_config():
  275. envlist = ['GLOG_v', 'GLOG_logtostderr', 'GLOG_log_dir', 'logger_maxBytes', 'logger_backupCount']
  276. for env in envlist:
  277. if os.environ.get(env):
  278. del os.environ[env]