• Python之log的处理方式


    配置文件:

     1 #! /usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 """
     4 logging配置
     5 """
     6 
     7 import os
     8 import logging.config
     9 
    10 # 定义三种日志输出格式 开始
    11 
    12 standard_format = '[%(asctime) -s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
    13                   '[%(levelname)s][%(message)s]'
    14 
    15 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    16 
    17 id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    18 
    19 # 定义日志输出格式 结束
    20 
    21 logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录
    22 
    23 logfile_name = 'all2.log'  # log文件名
    24 
    25 # 如果不存在定义的日志目录就创建一个
    26 if not os.path.isdir(logfile_dir):
    27     os.mkdir(logfile_dir)
    28 
    29 # log文件的全路径
    30 logfile_path = os.path.join(logfile_dir, logfile_name)
    31 
    32 # log配置字典
    33 LOGGING_DIC = {
    34     'version': 1,
    35     'disable_existing_loggers': False,
    36     'formatters': {
    37         'standard': {
    38             'format': standard_format,
    39             'datefmt': '%Y-%m-%d %H:%M:%S',
    40         },
    41         'simple': {
    42             'format': simple_format
    43         },
    44     },
    45     'filters': {},
    46     'handlers': {
    47         'console': {
    48             'level': 'DEBUG',
    49             'class': 'logging.StreamHandler',  # 打印到屏幕
    50             'formatter': 'simple'
    51         },
    52         'default': {
    53             'level': 'DEBUG',
    54             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
    55             'filename': logfile_path,  # 日志文件
    56             'maxBytes': 1024*1024*5,  # 日志大小 5M
    57             'backupCount': 5,
    58             'formatter': 'standard',
    59             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
    60         },
    61     },
    62     'loggers': {
    63         '': {
    64             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
    65             'level': 'DEBUG',
    66             'propagate': True,  # 向上(更高level的logger)传递
    67         },
    68     },
    69 }
    70 logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的配置
    71 logger = logging.getLogger(__name__)  # 生成一个log实例
    72 logger.info('It works!')  # 记录该文件的运行状态

    调用测试文件:

     1 #! /usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 """
     4 MyLogging Test
     5 """
     6 
     7 import time
     8 import logging
     9 from log_demo import my_logging  # 导入自定义的logging配置
    10 
    11 logger = logging.getLogger(__file__)  # 生成logger实例
    12 
    13 
    14 def demo():
    15     logger.debug("start range... time:{}".format(time.time()))
    16     logger.info("中文测试开始。。。")
    17     for i in range(10):
    18         logger.debug("i:{}".format(i))
    19         time.sleep(2)
    20     else:
    21         logger.debug("over range... time:{}".format(time.time()))
    22     logger.info("中文测试结束。。。")
    23 
    24 if __name__ == "__main__":
    25     demo()

    Django配置:

     1 #! /usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # __author__ = "Q1mi"
     4 # Date: 2017/7/28
     5 
     6 
     7 
     8 LOGGING = {
     9     'version': 1,
    10     'disable_existing_loggers': False,
    11     'formatters': {
    12         'standard': {
    13             'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
    14                       '[%(levelname)s][%(message)s]'
    15         },
    16         'simple': {
    17             'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    18         },
    19         'collect': {
    20             'format': '%(message)s'
    21         }
    22     },
    23     'filters': {
    24         'require_debug_true': {
    25             '()': 'django.utils.log.RequireDebugTrue',
    26         },
    27     },
    28     'handlers': {
    29         #打印到终端的日志
    30         'console': {
    31             'level': 'DEBUG',
    32             'filters': ['require_debug_true'],
    33             'class': 'logging.StreamHandler',
    34             'formatter': 'simple'
    35         },
    36         #打印到文件的日志,收集info及以上的日志
    37         'default': {
    38             'level': 'INFO',
    39             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
    40             'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"),  # 日志文件
    41             'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
    42             'backupCount': 3,
    43             'formatter': 'standard',
    44             'encoding': 'utf-8',
    45         },
    46         #打印到文件的日志:收集错误及以上的日志
    47         'error': {
    48             'level': 'ERROR',
    49             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
    50             'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"),  # 日志文件
    51             'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
    52             'backupCount': 5,
    53             'formatter': 'standard',
    54             'encoding': 'utf-8',
    55         },
    56         #打印到文件的日志
    57         'collect': {
    58             'level': 'INFO',
    59             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
    60             'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
    61             'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
    62             'backupCount': 5,
    63             'formatter': 'collect',
    64             'encoding': "utf-8"
    65         }
    66     },
    67     'loggers': {
    68         #logging.getLogger(__name__)拿到的logger配置
    69         '': {
    70             'handlers': ['default', 'console', 'error'],
    71             'level': 'DEBUG',
    72             'propagate': True,
    73         },
    74         #logging.getLogger('collect')拿到的logger配置
    75         'collect': {
    76             'handlers': ['console', 'collect'],
    77             'level': 'INFO',
    78         }
    79     },
    80 }
    81 
    82 
    83 # -----------
    84 # 用法:拿到俩个logger
    85 
    86 logger = logging.getLogger(__name__) #线上正常的日志
    87 collect_logger = logging.getLogger("collect") #领导说,需要为领导们单独定制领导们看的日志
  • 相关阅读:
    企业库连接形式简单例子记录 EnterpriseLibrary.Data
    .net 抽象类(abstract)和接口(interface)区别
    windows service 开发、安装及调试
    asp.net(mvc) 框架
    获取IP地址
    select2 模糊查询远程数据
    设计模式篇——初探命令模式
    初探MVC路由
    初探表达式目录树
    C#实现插入排序法
  • 原文地址:https://www.cnblogs.com/Crazy-lyl/p/7041768.html
Copyright © 2020-2023  润新知