鱼C论坛

 找回密码
 立即注册
查看: 2870|回复: 7

[已解决]求助个关于显示函数名的问题

[复制链接]
发表于 2020-2-11 13:30:13 | 显示全部楼层 |阅读模式
50鱼币
在用装饰器logger记录日志的时候,想显示info某某操作执行成功,但是用func.__name__的话会直接显示函数名,现在想用中文名字代替函数名,比如函数名是print(),日志里打印出来的是“执行打印操作成功!”。而不是“执行print成功”
请问各位大佬有没有办法实现呢?
最佳答案
2020-2-11 13:30:14
本帖最后由 XiaoPaiShen 于 2020-2-12 00:59 编辑
genius_7321 发表于 2020-2-11 23:54
源代码比较多就不发了,大概意思是如下代码这样的:


创建一个字典
{‘a_func':'加速’, ...}
  1. import os
  2. import time
  3. import logging
  4. import sys
  5. from functools import wraps
  6. import traceback

  7. def getFuncDescription(func_name):
  8.     # 该字典中应包含所有方法名的映射
  9.     name_desc = {'a_func':'加钱', 'b_func':'加速', 'main':'主程序'}
  10.     return name_desc.get(func_name, func_name)

  11. def get_logger():
  12.     log_dir1 = "logs"
  13.     today = time.strftime('%Y%m%d', time.localtime(time.time()))
  14.     full_path = os.path.join(log_dir1, today)
  15.     if not os.path.exists(full_path):
  16.         os.makedirs(full_path)
  17.     log_path = os.path.join(full_path, "log.log")
  18.     logger = logging.getLogger("log")
  19.     if not logger.handlers:
  20.         formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
  21.         file_handler = logging.FileHandler(log_path, encoding="utf8")
  22.         file_handler.setFormatter(formatter)
  23.         console_handler = logging.StreamHandler(sys.stdout)
  24.         console_handler.formatter = formatter
  25.         logger.addHandler(file_handler)
  26.         logger.addHandler(console_handler)
  27.         logger.setLevel(logging.INFO)
  28.     return logger


  29. def decoratore(func):
  30.     @wraps(func)
  31.     def log(*args, **kwargs):
  32.         try:
  33.             t0 = time.time()
  34.             t = func(*args, **kwargs)
  35.             get_logger().info(t)
  36.             t1 = time.time()
  37.             func_time = t1 - t0
  38.             description = getFuncDescription(func.__name__)
  39.             get_logger().info(f'{description} 操作执行完成,用时:{func_time}')
  40.             return t
  41.         except Exception as e:
  42.             get_logger().error(f"{func.__name__} 操作出错!以下是错误信息:\n{traceback.format_exc()}")

  43.     return log


  44. # 这个函数在软件中有对应的功能菜单:加钱
  45. @decoratore
  46. def a_func():
  47.     print('开始运行A函数')


  48. # 这个函数在软件中有对应的功能菜单:加速
  49. @decoratore
  50. def b_func():
  51.     print('开始运行B函数')


  52. # 这个函数在软件中有对应的功能菜单:主程序
  53. @decoratore
  54. def main():
  55.     a_func()
  56.     time.sleep(10)
  57.     b_func()


  58. if __name__ == '__main__':
  59.     main()
复制代码

最佳答案

查看完整内容

创建一个字典 {‘a_func':'加速’, ...}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-11 13:30:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 XiaoPaiShen 于 2020-2-12 00:59 编辑
genius_7321 发表于 2020-2-11 23:54
源代码比较多就不发了,大概意思是如下代码这样的:


创建一个字典
{‘a_func':'加速’, ...}
  1. import os
  2. import time
  3. import logging
  4. import sys
  5. from functools import wraps
  6. import traceback

  7. def getFuncDescription(func_name):
  8.     # 该字典中应包含所有方法名的映射
  9.     name_desc = {'a_func':'加钱', 'b_func':'加速', 'main':'主程序'}
  10.     return name_desc.get(func_name, func_name)

  11. def get_logger():
  12.     log_dir1 = "logs"
  13.     today = time.strftime('%Y%m%d', time.localtime(time.time()))
  14.     full_path = os.path.join(log_dir1, today)
  15.     if not os.path.exists(full_path):
  16.         os.makedirs(full_path)
  17.     log_path = os.path.join(full_path, "log.log")
  18.     logger = logging.getLogger("log")
  19.     if not logger.handlers:
  20.         formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
  21.         file_handler = logging.FileHandler(log_path, encoding="utf8")
  22.         file_handler.setFormatter(formatter)
  23.         console_handler = logging.StreamHandler(sys.stdout)
  24.         console_handler.formatter = formatter
  25.         logger.addHandler(file_handler)
  26.         logger.addHandler(console_handler)
  27.         logger.setLevel(logging.INFO)
  28.     return logger


  29. def decoratore(func):
  30.     @wraps(func)
  31.     def log(*args, **kwargs):
  32.         try:
  33.             t0 = time.time()
  34.             t = func(*args, **kwargs)
  35.             get_logger().info(t)
  36.             t1 = time.time()
  37.             func_time = t1 - t0
  38.             description = getFuncDescription(func.__name__)
  39.             get_logger().info(f'{description} 操作执行完成,用时:{func_time}')
  40.             return t
  41.         except Exception as e:
  42.             get_logger().error(f"{func.__name__} 操作出错!以下是错误信息:\n{traceback.format_exc()}")

  43.     return log


  44. # 这个函数在软件中有对应的功能菜单:加钱
  45. @decoratore
  46. def a_func():
  47.     print('开始运行A函数')


  48. # 这个函数在软件中有对应的功能菜单:加速
  49. @decoratore
  50. def b_func():
  51.     print('开始运行B函数')


  52. # 这个函数在软件中有对应的功能菜单:主程序
  53. @decoratore
  54. def main():
  55.     a_func()
  56.     time.sleep(10)
  57.     b_func()


  58. if __name__ == '__main__':
  59.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2020-2-11 14:12:11 | 显示全部楼层
涉及到翻译,有点麻烦。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-11 23:54:52 | 显示全部楼层

源代码比较多就不发了,大概意思是如下代码这样的:
  1. import os
  2. import time
  3. import logging
  4. import sys
  5. from functools import wraps
  6. import traceback

  7. def get_logger():
  8.     log_dir1 = "logs"
  9.     today = time.strftime('%Y%m%d', time.localtime(time.time()))
  10.     full_path = os.path.join(log_dir1, today)
  11.     if not os.path.exists(full_path):
  12.         os.makedirs(full_path)
  13.     log_path = os.path.join(full_path, "log.log")
  14.     logger = logging.getLogger("log")
  15.     if not logger.handlers:
  16.         formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
  17.         file_handler = logging.FileHandler(log_path, encoding="utf8")
  18.         file_handler.setFormatter(formatter)
  19.         console_handler = logging.StreamHandler(sys.stdout)
  20.         console_handler.formatter = formatter
  21.         logger.addHandler(file_handler)
  22.         logger.addHandler(console_handler)
  23.         logger.setLevel(logging.INFO)
  24.     return logger


  25. def decoratore(func):
  26.     @wraps(func)
  27.     def log(*args, **kwargs):
  28.         try:
  29.             t0 = time.time()
  30.             t = func(*args, **kwargs)
  31.             get_logger().info(t)
  32.             t1 = time.time()
  33.             func_time = t1 - t0
  34.             get_logger().info(f'{func.__name__} 操作执行完成,用时:{func_time}')
  35.             return t
  36.         except Exception as e:
  37.             get_logger().error(f"{func.__name__} 操作出错!以下是错误信息:\n{traceback.format_exc()}")

  38.     return log


  39. # 这个函数在软件中有对应的功能菜单:加钱
  40. @decoratore
  41. def a_func():
  42.     print('开始运行A函数')


  43. # 这个函数在软件中有对应的功能菜单:加速
  44. @decoratore
  45. def b_func():
  46.     print('开始运行B函数')


  47. # 这个函数在软件中有对应的功能菜单:主程序
  48. @decoratore
  49. def main():
  50.     a_func()
  51.     time.sleep(10)
  52.     b_func()


  53. if __name__ == '__main__':
  54.     main()
复制代码


程序运行以后 记录的日志是这样的:
  1. 2020-02-11 23:50:48,813 INFO    : None
  2. 2020-02-11 23:50:48,813 INFO    : a_func 操作执行完成,用时:0.0019965171813964844
  3. 2020-02-11 23:50:58,813 INFO    : None
  4. 2020-02-11 23:50:58,814 INFO    : b_func 操作执行完成,用时:0.0
  5. 2020-02-11 23:50:58,814 INFO    : None
  6. 2020-02-11 23:50:58,814 INFO    : main 操作执行完成,用时:10.00338339805603
复制代码


我希望的日志是:
加速操作执行完成
加钱操作执行完成
主程序操作执行完成
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-12 13:22:24 | 显示全部楼层
XiaoPaiShen 发表于 2020-2-12 00:58
创建一个字典
{‘a_func':'加速’, ...}

谢谢,这个方法好使,不过我有一个疑惑,name_desc.get(func_name, func_name)里面为啥要放两个func_name呢? 我试了下name_desc.get(func_name)好像也是可以的呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-12 13:31:51 From FishC Mobile | 显示全部楼层
当function_name 不在字典中存在时,就用它的值作为默认值返回
比如没把 main 对应的中文写到字典中,就把 main 返回
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-12 13:51:35 | 显示全部楼层
XiaoPaiShen 发表于 2020-2-12 13:31
当function_name 不在字典中存在时,就用它的值作为默认值返回
比如没把 main 对应的中文写到字典中,就把 ...

学到了 十分感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-3 14:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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