zoukankan      html  css  js  c++  java
  • (4)logging(日志模块)

    日志分成几个常用的级别

    debug 10

    代表程序调试过程中的信息

    info 20

    代表普通日志信息,用户的访问等等

    warning 30

    警告日志,有可能出错,但是目前还没出错的

    error 40

    程序明确的错误

    critical 50

    软件崩溃等严重的问题产生的日志

    日志特点:向上传递

    比如日志级别设置成30,那么30以下的则不会输出

    日志实例

    比如我需要产生相关级别的日志

    logging.debug('debug...')

    logging.info('info...')

    logging.warning('warning...')

    logging.error('error...')

    logging.critical('critical...')

    PS:默认日志级别是30

    日志基本使用

    logging.basicConfig(
        format='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s',  #设置日志的格式
        datefmt='%Y-%m-%d %H:%M:%S',  #设置时间显示格式(如果用默认则不需要设置,这里不用写)
        level=10,  #设置日志的等级
    )

    acstime 代表日志的时间   #不设置有默认的格式,也可以在日志的开头设置

    name 代表日志名   #日志名是由第一步logging的时候设定的参数

    levelname 代表日志级别   #是由第六步设置的时候创建的

    mouule 代表那个模块产生的日志  #这个是自动的

    message 代表具体日志信息  #这里是由最后调用的时候传入的

    logging模块的使用方式

    第一步

    logger  #产生不同级别日志

    logger1 = logger.gerlogger('这里传入日志名') #根据需求传入日志名

    PS:logger是和handler关联的,并不是和formatter关联

    第二步 

    handler  #控制日志输出的位置 (终端或者文件)

    sh=logging.StreamHandler()  #往终端输出的

    fh1 = logging.FileHandler(‘a1.log’,ending='utf-8)  #往文件输出的,括号内可以指定文件的路径,文件的模式,字符编码

    fh2 = logging.FileHandler('a2'.log,ending='utf-8)

    第三步

    formatter #控制logger对象的日志格式

    formatter1=logging.Formatter() #生成日志格式,括号内可以指定日志格式fmt、单独修改时间的格式datefmt

      fmt='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s',
      datefmt='%Y-%m-%d %H:%M:%S %p',

    formatter2=logging.Formatter() #生成日志格式,括号内可以指定日志格式fmt、单独修改时间的格式datefmt

      fmt='%(asctime)s -  %(message)s',
      datefmt='%Y-%m-%d %H:%M:%S %p',

     PS:这里生成的格式数量不限

    第四步

    建立logger对象与handler对象的关联关系

    logger1.addHandler('sh')  #这里用addHandler方法将第二步的日志输出位置传入括号内

    logger1.addHandler('fh1')

    logger1.addHandler('fh2')

    第五步

    建立handler对象与formatter对象的关联关系

    sh.serFormatter(formatter1) #这里用setFormatter方法将第三步定义的格式捆绑给第二步

    f1.serFormatter(formatter2)

    f2.serFormatter(formatter2)

    第六步

    设置日志级别

    logger1.setLevel(10)  #这里定义logger1的日志通过级别

    sh.serLevel(10)  #这里定义handler的日志通过级别

    fh1.serLevel(10)

    fh2.serLevel(10)

    PS:由于sh、fh1、fh2都是捆绑在logger1层的下面,所以logger1的日志级别必须和下面捆绑层的级别一样才能放行

    第七部

    产生日志(logger1.xxx  这里xxx可以自己定义需要调用的日志种类)

    logger1.debug(‘这里就是传入message需要的信息,可以自己写’) #这一步是调用日志

    关系示意图

    PS:logger生成日志给handler,然后handler在输出的时候已经提前绑定了一个标准化的格式,所以一个fomatter可以给多handler用

    PS:logger可以设置日志级别,但是logger设置了级别后handler一定要设置一样的级别,不然会出现logger如果级别过高,hanlder设置低级别日志,那么logger不放行,则handler无法生成需要的日志,反过来handler也同理

    logging模块最终的用法(这个是写在setting文件下的)

    import logging


    """
    logging配置
    """
    logfile_path='bbb.log' #这里写到项目就要做一个绝对路径,就是用os模块下的sys获取一个绝对路径

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

    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'

    # log配置字典
    LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
    'standard': { #standard(标准格式)就是相当于自定义一的日志格式名称,完全可以自定义
    'format': standard_format #这个format不能变是固定格式,能变的也就是后面的value这个变量
    },
    'simple': { #simple(简单格式)就是相当于自定义一的日志格式名称,完全可以自定义
    'format': simple_format #这个format不能变是固定格式,能变的也就是后面的value这个变量
    },
    },
    'filters': {},
    'handlers': { #这里的下面可以设置多个级别的日志
    #console打印到终端的日志
    'console': { #这里的console是可以变的,就是我们自定义的输出位置,就相当于第二步的sh、fh1这样的变量名
    'level': 'DEBUG', #这里设置一个日志的级别
    'class': 'logging.StreamHandler', # 打印到屏幕
    'formatter': 'simple' #这里和日志的格式做一个关联,不能乱写,就是formatters下面定义的日志格式
    }
    #default打印到文件的日志,收集info及以上的日志
    'default': {
    'level': 'DEBUG',
    'class': 'logging.FileHandler', # 保存到文件
    'formatter': 'standard',#这里和日志的格式做一个关联,不能乱写,就是formatters下面定义的日志格式
    'filename': logfile_path, # 日志文件的变量
    'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
    },
    },
    'loggers': { #这里也不限数量,下面的日志名可以自己定义多个种类,比如值打印到终端或者两者都打印
    #logging.getLogger(__name__)拿到的logger配置
    '': { #这里日志名为空,当用户调用的时候就可以用这个默认的配置去写入,这样就把日志名写活了,不用去写重复代码
    'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
    'level': 'DEBUG',
    },
    },
    }

    最后要写一个common调用日志变量的模块

    import logging.config
    import settings

    def get_logger(name):
    logging.config.dictConfig(settings.LOGGING_DIC) #dictConfig从字典中加载配置(setting模块下的'字典名称')
    logger1=logging.getLogger('这里的变量就是你要指定的日志名') #这里就是调用模块中的字典下的一个key(loggers)
    #下的一个key(你所写的日志名),并且将返回值放到变量
    return logger1


    在业务逻辑中调用

    import common (这个模块下的函数功能)

    #业务逻辑里面进行调用
    logger1=get_logger('用户交易') #这里调用字典下loggers下面的功能,就是日志名
    logger1.debug('调试信息') #这里就是你要写入日志信息的内容

    logger2=get_logger('用户权限')
    logger2.debug('权限相关问题.....')

    日志中标准化格式%详解

    可在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-08 16:49:45,896”。逗号后面的是毫秒
    
    %(thread)d:线程ID。可能没有
    
    %(threadName)s:线程名。可能没有
    
    %(process)d:进程ID。可能没有
    
    %(message)s:用户输出的消息
  • 相关阅读:
    Using X++ code direct execute to sql statement
    SysMultiTableLookup class
    Using X++ Modify Table and class name From AOT Project
    identify multiple selected records
    简单实用SQL脚本(转)
    FTK应用程序编程接口(API)手册1
    《那些年啊,那些事——一个程序员的奋斗史》——28
    ftk的python binding
    《那些年啊,那些事——一个程序员的奋斗史》——27
    好久没来,CSDN都改版了
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10054114.html
Copyright © 2011-2022 走看看