nb_log_config.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. # coding=utf8
  2. """
  3. 此文件nb_log_config.py是自动生成到python项目的根目录的,因为是自动生成到 sys.path[1]。
  4. 在这里面写的变量会覆盖此文件nb_log_config_default中的值。对nb_log包进行默认的配置。用户是无需修改nb_log安装包位置里面的配置文件的。
  5. 但最终配置方式是由get_logger_and_add_handlers方法的各种传参决定,如果方法相应的传参为None则使用这里面的配置。
  6. """
  7. """
  8. 如果反对日志有各种彩色,可以设置 DEFAULUT_USE_COLOR_HANDLER = False
  9. 如果反对日志有块状背景彩色,可以设置 DISPLAY_BACKGROUD_COLOR_IN_CONSOLE = False
  10. 如果想屏蔽nb_log包对怎么设置pycahrm的颜色的提示,可以设置 WARNING_PYCHARM_COLOR_SETINGS = False
  11. 如果想改变日志模板,可以设置 FORMATTER_KIND 参数,只带了7种模板,可以自定义添加喜欢的模板
  12. LOG_PATH 配置文件日志的保存路径的文件夹。
  13. """
  14. import sys
  15. # noinspection PyUnresolvedReferences
  16. import logging
  17. import os
  18. # noinspection PyUnresolvedReferences
  19. from pathlib import Path # noqa
  20. import socket
  21. from pythonjsonlogger.jsonlogger import JsonFormatter
  22. def get_host_ip():
  23. ip = ''
  24. host_name = ''
  25. # noinspection PyBroadException
  26. try:
  27. sc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  28. sc.connect(('8.8.8.8', 80))
  29. ip = sc.getsockname()[0]
  30. host_name = socket.gethostname()
  31. sc.close()
  32. except Exception:
  33. pass
  34. return ip, host_name
  35. computer_ip, computer_name = get_host_ip()
  36. class JsonFormatterJumpAble(JsonFormatter):
  37. def add_fields(self, log_record, record, message_dict):
  38. # log_record['jump_click'] = f"""File '{record.__dict__.get('pathname')}', line {record.__dict__.get('lineno')}"""
  39. log_record[f"{record.__dict__.get('pathname')}:{record.__dict__.get('lineno')}"] = '' # 加个能点击跳转的字段。
  40. log_record['ip'] = computer_ip
  41. log_record['host_name'] = computer_name
  42. super().add_fields(log_record, record, message_dict)
  43. if 'for_segmentation_color' in log_record:
  44. del log_record['for_segmentation_color']
  45. DING_TALK_TOKEN = '3dd0eexxxxxadab014bd604XXXXXXXXXXXX' # 钉钉报警机器人
  46. EMAIL_HOST = ('smtp.sohu.com', 465)
  47. EMAIL_FROMADDR = 'aaa0509@sohu.com' # 'matafyhotel-techl@matafy.com',
  48. EMAIL_TOADDRS = ('cccc.cheng@silknets.com', 'yan@dingtalk.com',)
  49. EMAIL_CREDENTIALS = ('aaa0509@sohu.com', 'abcdefg')
  50. ELASTIC_HOST = '127.0.0.1'
  51. ELASTIC_PORT = 9200
  52. KAFKA_BOOTSTRAP_SERVERS = ['192.168.199.202:9092']
  53. ALWAYS_ADD_KAFKA_HANDLER_IN_TEST_ENVIRONENT = False
  54. MONGO_URL = 'mongodb://myUserAdmin:mimamiama@127.0.0.1:27016/admin'
  55. # 项目中的print是否自动写入到文件中。值为None则不重定向print到文件中。 自动每天一个文件, 2023-06-30.my_proj.print,生成的文件位置在定义的LOG_PATH
  56. # 如果你设置了环境变量,export PRINT_WRTIE_FILE_NAME="my_proj.print" (linux临时环境变量语法,windows语法自己百度这里不举例),那就优先使用环境变量中设置的文件名字,而不是nb_log_config.py中设置的名字
  57. PRINT_WRTIE_FILE_NAME = Path(sys.path[1]).name + '.print'
  58. # 项目中的所有标准输出(不仅包括print,还包括了streamHandler日志)都写入到这个文件,为None将不把标准输出重定向到文件。自动每天一个文件, 2023-06-30.my_proj.std,生成的文件位置在定义的LOG_PATH
  59. # 如果你设置了环境变量,export SYS_STD_FILE_NAME="my_proj.std" (linux临时环境变量语法,windows语法自己百度这里不举例),那就优先使用环境变量中设置的文件名字,,而不是nb_log_config.py中设置的名字
  60. SYS_STD_FILE_NAME = Path(sys.path[1]).name + '.std'
  61. USE_BULK_STDOUT_ON_WINDOWS = True # 在win上是否每隔0.1秒批量stdout,win的io太差了
  62. DEFAULUT_USE_COLOR_HANDLER = True # 是否默认使用有彩的日志。
  63. DISPLAY_BACKGROUD_COLOR_IN_CONSOLE = True # 在控制台是否显示彩色块状的日志。为False则不使用大块的背景颜色。
  64. AUTO_PATCH_PRINT = True # 是否自动打print的猴子补丁,如果打了猴子补丁,print自动变色和可点击跳转。
  65. SHOW_PYCHARM_COLOR_SETINGS = True # 有的人很反感启动代码时候提示教你怎么优化pycahrm控制台颜色,可以把这里设置为False
  66. DEFAULT_ADD_MULTIPROCESSING_SAFE_ROATING_FILE_HANDLER = False # 是否默认同时将日志记录到记log文件记事本中,就是用户不指定 log_filename的值,会自动写入日志命名空间.log文件中。
  67. LOG_FILE_SIZE = 100 # 单位是M,每个文件的切片大小,超过多少后就自动切割
  68. LOG_FILE_BACKUP_COUNT = 10 # 对同一个日志文件,默认最多备份几个文件,超过就删除了。
  69. LOG_PATH = '/pythonlogs' # 默认的日志文件夹,如果不写明磁盘名,则是项目代码所在磁盘的根目录下的/pythonlogs
  70. # LOG_PATH = Path(__file__).absolute().parent / Path("pythonlogs") #这么配置就会自动在你项目的根目录下创建pythonlogs文件夹了并写入。
  71. if os.name == 'posix': # linux非root用户和mac用户无法操作 /pythonlogs 文件夹,没有权限,默认修改为 home/[username] 下面了。例如你的linux用户名是 xiaomin,那么默认会创建并在 /home/xiaomin/pythonlogs文件夹下写入日志文件。
  72. home_path = os.environ.get("HOME", '/') # 这个是获取linux系统的当前用户的主目录,不需要亲自设置
  73. LOG_PATH = Path(home_path) / Path('pythonlogs') # linux mac 权限很严格,非root权限不能在/pythonlogs写入,修改一下默认值。
  74. # print('LOG_PATH:',LOG_PATH)
  75. LOG_FILE_HANDLER_TYPE = 6 # 1 2 3 4 5 6
  76. """
  77. LOG_FILE_HANDLER_TYPE 这个值可以设置为 1 2 3 4 5 四种值,
  78. 1为使用多进程安全按日志文件大小切割的文件日志,这是本人实现的批量写入日志,减少操作文件锁次数,测试10进程快速写入文件,win上性能比第5种提高了100倍,linux提升5倍
  79. 2为多进程安全按天自动切割的文件日志,同一个文件,每天生成一个新的日志文件。日志文件名字后缀自动加上日期。
  80. 3为不自动切割的单个文件的日志(不切割文件就不会出现所谓进程安不安全的问题)
  81. 4为 WatchedFileHandler,这个是需要在linux下才能使用,需要借助lograte外力进行日志文件的切割,多进程安全。
  82. 5 为第三方的concurrent_log_handler.ConcurrentRotatingFileHandler按日志文件大小切割的文件日志,
  83. 这个是采用了文件锁,多进程安全切割,文件锁在linux上使用fcntl性能还行,win上使用win32con性能非常惨。按大小切割建议不要选第5个个filehandler而是选择第1个。
  84. 6 BothDayAndSizeRotatingFileHandler 使用本人完全彻底开发的,同时按照时间和大小切割,无论是文件的大小、还是时间达到了需要切割的条件就切割。
  85. """
  86. LOG_LEVEL_FILTER = logging.DEBUG # 默认日志级别,低于此级别的日志不记录了。例如设置为INFO,那么logger.debug的不会记录,只会记录logger.info以上级别的。
  87. # 强烈不建议调高这里的级别为INFO,日志是有命名空间的,单独提高打印啰嗦的日志命名空间的日志级别就可以了,不要全局提高日志级别。
  88. # https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2 文档9.5里面讲了几百次 python logging的命名空间的作用了,有些人到现在还不知道日志的name作用。
  89. # 屏蔽的字符串显示,用 if in {打印信息} 来判断实现的,如果打印的消息中包括 FILTER_WORDS_PRINT 数组中的任何一个字符串,那么消息就不执行打印。
  90. # 这个配置对 print 和 logger的控制台输出都生效。这个可以过滤某些啰嗦的print信息,也可以过滤同级别日志中的某些烦人的日志。可以用来过滤三方包中某些控制台打印。数组不要配置过多,否则有一丝丝影响性能会。
  91. FILTER_WORDS_PRINT = [] # 例如, 你希望消息中包括阿弥陀佛 或者 包括善哉善哉 就不打印,那么可以设置 FILTER_WORDS_PRINT = ['阿弥陀佛','善哉善哉']
  92. RUN_ENV = 'test'
  93. FORMATTER_DICT = {
  94. 1: logging.Formatter(
  95. '日志时间【%(asctime)s】 - 日志名称【%(name)s】 - 文件【%(filename)s】 - 第【%(lineno)d】行 - 日志等级【%(levelname)s】 - 日志信息【%(message)s】',
  96. "%Y-%m-%d %H:%M:%S"),
  97. 2: logging.Formatter(
  98. '%(asctime)s - %(name)s - %(filename)s - %(funcName)s - %(lineno)d - %(levelname)s - %(message)s',
  99. "%Y-%m-%d %H:%M:%S"),
  100. 3: logging.Formatter(
  101. '%(asctime)s - %(name)s - 【 File "%(pathname)s", line %(lineno)d, in %(funcName)s 】 - %(levelname)s - %(message)s',
  102. "%Y-%m-%d %H:%M:%S"), # 一个模仿traceback异常的可跳转到打印日志地方的模板
  103. 4: logging.Formatter(
  104. '%(asctime)s - %(name)s - "%(filename)s" - %(funcName)s - %(lineno)d - %(levelname)s - %(message)s - File "%(pathname)s", line %(lineno)d ',
  105. "%Y-%m-%d %H:%M:%S"), # 这个也支持日志跳转
  106. 5: logging.Formatter(
  107. '%(asctime)s - %(name)s - "%(pathname)s:%(lineno)d" - %(funcName)s - %(levelname)s - %(message)s',
  108. "%Y-%m-%d %H:%M:%S"), # 我认为的最好的模板,推荐
  109. 6: logging.Formatter('%(name)s - %(asctime)-15s - %(filename)s - %(lineno)d - %(levelname)s: %(message)s',
  110. "%Y-%m-%d %H:%M:%S"),
  111. 7: logging.Formatter('%(asctime)s - %(name)s - "%(filename)s:%(lineno)d" - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"), # 一个只显示简短文件名和所处行数的日志模板
  112. 8: JsonFormatterJumpAble('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(filename)s %(lineno)d %(process)d %(thread)d', "%Y-%m-%d %H:%M:%S.%f",
  113. json_ensure_ascii=False), # 这个是json日志,方便elk采集分析.
  114. 9: logging.Formatter(
  115. '[p%(process)d_t%(thread)d] %(asctime)s - %(name)s - "%(pathname)s:%(lineno)d" - %(funcName)s - %(levelname)s - %(message)s',
  116. "%Y-%m-%d %H:%M:%S"), # 对5改进,带进程和线程显示的日志模板。
  117. 10: logging.Formatter(
  118. '[p%(process)d_t%(thread)d] %(asctime)s - %(name)s - "%(filename)s:%(lineno)d" - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"), # 对7改进,带进程和线程显示的日志模板。
  119. 11: logging.Formatter(
  120. f'({computer_ip},{computer_name})-[p%(process)d_t%(thread)d] %(asctime)s - %(name)s - "%(filename)s:%(lineno)d" - %(funcName)s - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"), # 对7改进,带进程和线程显示的日志模板以及ip和主机名。
  121. }
  122. FORMATTER_KIND = 5 # 如果get_logger不指定日志模板,则默认选择第几个模板