zoukankan      html  css  js  c++  java
  • logging模块

    import logging

    # 打印日志

    # logging.debug('调试信息') #10
    # logging.info('常规信息') #20
    # logging.warning('警告信息') #30
    # logging.error('错误信息') #40
    # logging.critical('严重错误信息') #50

    # 默认级别是wraning

    # WARNING:root:警告信息
    # ERROR:root:错误信息
    # CRITICAL:root:严重错误信息

    # 日志格式:
    # WARNING是日志级别
    # :是分隔符,可以自定义
    # root是日志的名字,可以自定义成有意义的
    # 警告信息是日志的信息


    # 问题:
    # 1.没有指定日志级别
    # 2.没有指定日志格式
    # 3.只能往屏幕打印,没有写入文件

    # 进行基本的日志配置
    # logging.basicConfig(filename='access.log',
    # format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
    # datefmt='%Y-%m-%d %H:%M:%S %p',
    # level=10)
    #
    #
    # logging.debug('调试信息')
    # logging.info('常规信息')
    # logging.warning('警告信息')
    # logging.error('错误信息')
    # logging.critical('严重错误信息')


    # 2018-10-18 15:17:36 PM - root - DEBUG -01logging模块: 调试信息
    # 2018-10-18 15:17:36 PM - root - INFO -01logging模块: 常规信息
    # 2018-10-18 15:17:36 PM - root - WARNING -01logging模块: 警告信息
    # 2018-10-18 15:17:36 PM - root - ERROR -01logging模块: 错误信息
    # 2018-10-18 15:17:36 PM - root - CRITICAL -01logging模块: 严重错误信息

    # 新问题:
    # 1.不能指定字符编码
    # 2.只能往文件打印



    # logging包含四种角色
    # logger()
    # filter()
    # hander
    # formatter


    # 模板

    # 可在logging.basicConfig()
    # 函数中通过具体参数来更改logging模块默认行为,可用参数有
    # filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
    # filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    # format:指定handler使用的日志显示格式。
    # datefmt:指定日期时间格式。
    # level:设置rootlogger(后边会讲解具体概念)的日志级别
    # stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr, sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
    #
    # # 格式
    # % (name)
    # s:Logger的名字,并非用户名,详细查看
    #
    # % (levelno)
    # s:数字形式的日志级别
    #
    # % (levelname)
    # s:文本形式的日志级别
    #
    # % (pathname)
    # s:调用日志输出函数的模块的完整路径名,可能没有
    #
    # % (filename)
    # s:调用日志输出函数的模块的文件名
    #
    # % (module)
    # s:调用日志输出函数的模块名
    #
    # % (funcName)
    # s:调用日志输出函数的函数名
    #
    # % (lineno)
    # d:调用日志输出函数的语句所在的代码行
    #
    # % (created)
    # f:当前时间,用UNIX标准的表示时间的浮
    # 点数表示
    #
    # % (relativeCreated)
    # d:输出日志信息时的,自Logger创建以
    # 来的毫秒数
    #
    # % (asctime)
    # s:字符串形式的当前时间。默认格式是 “2003 - 07 - 0
    # 8
    # 16: 49:45, 896”。逗号后面的是毫秒
    #
    # % (thread)
    # d:线程ID。可能没有
    #
    # % (threadName)
    # s:线程名。可能没有
    #
    # % (process)
    # d:进程ID。可能没有
    #
    # % (message)
    # s:用户输出的消息
    #
    # logging.basicConfig()




    #logger:产生日志的对象

    #Filter:过滤日志的对象

    #Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端

    #Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式

    '''
    critical=50
    error =40
    warning =30
    info = 20
    debug =10
    '''


    import logging

    #1、logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出
    logger=logging.getLogger(__file__)

    #2、Filter对象:不常用,略

    #3、Handler对象:接收logger传来的日志,然后控制输出
    h1=logging.FileHandler('t1.log') #打印到文件
    h2=logging.FileHandler('t2.log') #打印到文件
    h3=logging.StreamHandler() #打印到终端

    #4、Formatter对象:日志格式
    formmater1=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p',)

    formmater2=logging.Formatter('%(asctime)s : %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p',)

    formmater3=logging.Formatter('%(name)s %(message)s',)


    #5、为Handler对象绑定格式
    h1.setFormatter(formmater1)
    h2.setFormatter(formmater2)
    h3.setFormatter(formmater3)

    #6、将Handler添加给logger并设置日志级别
    logger.addHandler(h1)
    logger.addHandler(h2)
    logger.addHandler(h3)
    logger.setLevel(10)

    #7、测试
    logger.debug('debug')
    logger.info('info')
    logger.warning('warning')
    logger.error('error')
    logger.critical('critical')

    """
    logging配置
    """

    import os
    import logging.config

    # 定义三种日志输出格式 开始

    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
    '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字

    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

    # 定义日志输出格式 结束

    logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录

    logfile_name = 'all2.log' # log文件名

    # 如果不存在定义的日志目录就创建一个
    if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)

    # log文件的全路径
    logfile_path = os.path.join(logfile_dir, logfile_name)

    # log配置字典
    LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
    'standard': {
    'format': standard_format
    },
    'simple': {
    'format': simple_format
    },
    },
    'filters': {},
    'handlers': {
    #打印到终端的日志
    'console': {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler', # 打印到屏幕
    'formatter': 'simple'
    },
    #打印到文件的日志,收集info及以上的日志
    'default': {
    'level': 'DEBUG',
    'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
    'formatter': 'standard',
    'filename': logfile_path, # 日志文件
    'maxBytes': 1024*1024*5, # 日志大小 5M
    'backupCount': 5,
    'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
    },
    },
    'loggers': {
    #logging.getLogger(__name__)拿到的logger配置
    '': {
    'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
    'level': 'DEBUG',
    'propagate': True, # 向上(更高level的logger)传递
    },
    },
    }


    def load_my_logging_cfg():
    logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
    logger = logging.getLogger(__name__) # 生成一个log实例
    logger.info('It works!') # 记录该文件的运行状态

    if __name__ == '__main__':
    load_my_logging_cfg()

    logging配置文件



  • 相关阅读:
    为什么构造函数内部不能调用虚函数
    偏差与方差
    rJava配置
    《商道》读书笔记
    在myeclipse中使用Java语言进行spark Standalone模式应用程序开发
    机器学习算法之旅【转】
    最流行的4个机器学习数据集【转】
    机器学习资源大全【转】
    机器学习算法基础概念学习总结【转】
    机器学习问题的十个实例【转】
  • 原文地址:https://www.cnblogs.com/zhangrenguo/p/9813164.html
Copyright © 2011-2022 走看看