当前位置:   article > 正文

python代码——日志logging_python 代码加日志

python 代码加日志

日志logging

  • 定义:记录代码执行的过程
  • 什么时候记录:加到代码里面
  • 作用:一旦记录下来,就能够使用日志去排查问题
  • 日志的级别 ->有左到右越来越严重
  • debug(调试)-》info(打印信息,类似print) -》waring(警告信息)-》 error(错误)-》 critical(致命)
  • 日志与print打印有什么不同,为什么不用print?
  • 1.代码量太多了;
  • 2.使用print会占用内存,不使用的时候需要一行一行去注释
  • 3.使用日志的时候,可以自己设置打印什么样级别的日志出来,比较灵活
  • 模块:logging python自带,不需要安装

语法

  • 直接使用 logging.debug(mes)来打印信息,info等的使用方法与debug一致,都只有一个位置参数
  • 使用python默认时,默认会输出warning以上的信息。原因:root logger(如下图,源码中有)是系统自定义的收集日志的收集器,默认收集并输出warnning级别以上的日志信息(包含warnning)
  • 日志输出的渠道默认是控制台(console)
    在这里插入图片描述
  • 代码示例如下:
import logging

logging.debug('这是一个debug的信息')
#打印了一条日志在debug级别
#通通只有一个位置参数
logging.info('这是一个info的信息')
logging.warning('这是一个warning的信息')
logging.error('这是一个error的信息')
logging.critical('这是一个critical的信息')

#备注:执行结果中,冒号之前的信息为级别,冒号之后的为想要输出的错误信息
**************run_result****************
WARNING:root:这是一个warning的信息
ERROR:root:这是一个error的信息
CRITICAL:root:这是一个critical的信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

日志输出的步骤

  • 因此,如果想自定义打印日志(我的日志我做主),需要改动的地方是: 日志级别和日志输出方式,所以要做以下步骤:
  • 第一步:自定义一个日志收集器(getLogger函数),注意,一定要给一个名字,否则默认返回 root logger,代码:my_logger = logging.getLogger('yiyi')
  • 第二步:设置级别(setLevel函数),注意,后面一定要传级别,否则默认返回wainning,代码:my_logger.setLevel('DEBUG')
  • 第三步:指定输出渠道,ch = logging.StreamHandler()
  • 第四步:设置输出级别,my_logger.setLevel('DEBUG')
  • 第五步:对接,添加渠道,my_logger.addHandler(ch)
  • 收集日志的级别与输出日志的级别不一致时,最终输出结果是两个级别的交集
  • 代码示例:
import logging

my_logger = logging.getLogger('yiyi')#创建日志收集器
my_logger.setLevel('DEBUG')#定义收集级别,大小写都可
ch = logging.StreamHandler()#输出到控制台
my_logger.setLevel('DEBUG')#定义输出级别

my_logger.addHandler(ch)#对接,添加渠道

my_logger.debug('这是一个debug的信息')
#打印了一条日志在debug级别
my_logger.info('这是一个info的信息')
my_logger.warning('这是一个warning的信息')
my_logger.error('这是一个error的信息')
my_logger.critical('这是一个critical的信息')

*************run_result***********
这是一个debug的信息
这是一个info的信息
这是一个warning的信息
这是一个error的信息
这是一个critical的信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 【备注】
  • 上面代码的中,getLogger设置的收集器级别,只有日志信息大于这个级别的时候才会进入搜集器
  • Handler设置输出级别,只有搜集器中的日志大于输出级别的时候,才会输出至控制台或者文件
  • 因此,输出信息是两者级别的交集

日志的格式化输出

  • %(name)s logger(日志收集器)的名字
  • %(levelname)s 文本形式的日志级别
  • %(leveIno)s 数字形式的日志级别
  • %(pathname)s 调用日志输出函数的模块的完整路径名
  • %(filename)s 调用日志输出函数的模块的文件名
  • %(module)s 调用日志输出函数的模块名
  • %(funName)s 调用日志输出函数的函数名
  • %(lineno)d 调用日志输出函数的语句所在的代码行
  • %(created)f 当前时间,用UNIX标准的表示时间的浮点数表示
  • %(relativeCreated)d 输出日志信息时,自logger创建依赖的毫秒数
  • %(asctime)s 字符串形式的当前时间,默认格式是“2021-07-31 21:42:00,985”。逗号后面是毫秒
  • %(thread)d 线程ID,可能没有
  • %(threadName)s 线程名,可能没有
  • %(process)d 进程ID,可能么没有
  • %(processName)s 进程名称,可能么没有
  • %(message)s 用户输出的消息
  • 格式化输出设置后,修改后的代码:
import logging

my_logger = logging.getLogger('yiyi')#创建日志收集器
my_logger.setLevel('DEBUG')#定义收集级别,大小写都可
ch = logging.StreamHandler()#输出到控制台
my_logger.setLevel('INFO')#定义输出级别
my_logger.addHandler(ch)#对接,添加渠道

formatter = logging.Formatter(
    '%(asctime)s-%(levelname)s-%(filename)s-'
    '%(name)s-日志信息-%(message)s')#指定输出格式
ch.setFormatter(formatter)#规定日志输出的时候按照formatter格式来打印

my_logger.debug('这是一个debug的信息')
#打印了一条日志在debug级别
#通通只有一个位置参数
my_logger.info('这是一个info的信息')
my_logger.warning('这是一个warning的信息')
my_logger.error('这是一个error的信息')
my_logger.critical('这是一个critical的信息')

*************run——result*************
2023-03-19 16:08:47,156-INFO-study_suanfa.py-yiyi-日志信息-这是一个info的信息
2023-03-19 16:08:47,156-WARNING-study_suanfa.py-yiyi-日志信息-这是一个warning的信息
2023-03-19 16:08:47,156-ERROR-study_suanfa.py-yiyi-日志信息-这是一个error的信息
2023-03-19 16:08:47,156-CRITICAL-study_suanfa.py-yiyi-日志信息-这是一个critical的信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

日志信息输出到文件

  • 日志输出到文本:ch_1 = logging.FileHandler(file_name)#file_name为文件名,可用路径
  • 要修改输出渠道,直接将这行代码替换上面输出方式的代码即可
  • 输出方式即可以传输到file中,也可以传输到控制台,但是要注意,两种输出方式同时存在时,需要赋值给不同的变量,要做两次对接,如以下代码:
    在这里插入图片描述
import logging

my_logger = logging.getLogger('yiyi')#创建日志收集器
my_logger.setLevel('DEBUG')#定义收集级别,大小写都可
ch = logging.StreamHandler()#输出到控制台
ch_1 = logging.FileHandler('python.TXT',encoding='utf-8',mode = 'a+')#file_name为文件名,可用路径
my_logger.setLevel('DEBUG')#定义输出级别
my_logger.addHandler(ch)#对接,添加输出控制台渠道
my_logger.addHandler(ch_1)#对接,添加输出文件渠道

formatter = logging.Formatter('%(asctime)s-%(levelname)s-%(filename)s-'
                              '%(name)s-日志信息-%(message)s')#指定输出格式
ch.setFormatter(formatter)#规定日志输出的时候按照formatter格式来打印

my_logger.debug('这是一个debug的信息')
#打印了一条日志在debug级别
#通通只有一个位置参数
my_logger.info('这是一个info的信息')
my_logger.warning('这是一个warning的信息')
my_logger.error('这是一个error的信息')
my_logger.critical('这是一个critical的信息')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

日志格式化的自定义扩展

  • 日志的格式字符串可以自定义扩展,扩展方式如下:
    • 在自定义格式中,写入要掺入的名称
    • 在输出之前,定义格式对应的信息字典
    • 将字典作为参数,传入info、error等语句中
import logging

my_logger = logging.getLogger('yiyi')#创建日志收集器
my_logger.setLevel('DEBUG')#定义收集级别,大小写都可
ch = logging.StreamHandler()#输出到控制台
my_logger.setLevel('INFO')#定义输出级别
my_logger.addHandler(ch)#对接,添加渠道

formatter = logging.Formatter(
    '%(asctime)s-%(levelname)s-%(filename)s-'
    '%(name)s-日志信息-%(message)s-%(fycname)s')#扩展了字符串格式
ch.setFormatter(formatter)#规定日志输出的时候按照formatter格式来打印

f_d = {"fycname":"fycyy.163.com"} # 设置新增的格式字典
my_logger.error('这是一个debug的信息',extra=f_d) # 将字典作为参数传入打印语句
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

修改日期格式

import logging

my_logger = logging.getLogger('yiyi')#创建日志收集器
my_logger.setLevel('DEBUG')#定义收集级别,大小写都可
ch = logging.StreamHandler()#输出到控制台
my_logger.setLevel('INFO')#定义输出级别
my_logger.addHandler(ch)#对接,添加渠道

formatter = logging.Formatter(
    '%(asctime)s-%(levelname)s-%(filename)s-'
    '%(name)s-日志信息-%(message)s',
    datefmt="%Y-%m-%d %H:%M:%S")#自定义日期格式,传参datefmt
ch.setFormatter(formatter)#规定日志输出的时候按照formatter格式来打印

my_logger.error('这是一个error的信息') # 将字典作为参数传入打印语句
***********run_result***********
2023-03-19 19:06:50-ERROR-study_suanfa.py-yiyi-日志信息-这是一个error的信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

日志:第三方库loguru

  • 使用这个库需要部分导入:from loguru import logger
  • 直接在控制台输出信息
# 直接在控制台输出info、warnning、debug、error等信息
logger.info("info信息")
logger.warning("warning信息")
logger.debug("debug信息")
logger.error("error信息")
logger.critical("critical信息")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 将日志信息输出到文本中,使用logger.add方法,其中的参数有:
  • sink:输出日志的文件的名字,以追加的模式向文件中写入信息
  • encoding:输出信息的模式,一般选择utf-8
  • level:输出日志的级别,常见的有info,error,debug等,级别内容必须大写,设置完之后,级别及其以上的都会写入相应的文件中
  • rotation,进行文件的分割,可以通过文件大小或者时间来控制文件的输出个数
  • retention,存储日志文件的个数,多了就会将旧的文件删除
logger.add(sink="log.txt",encoding="utf-8",
           level="INFO",rotation="1 day",retention=20)
user_name = input("请输入一个数字")
try:
    a = int(user_name)+2
    print(a)
    logger.info("计算成功:success")
except Exception:
    logger.error("计算失败:fail")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/512706
推荐阅读
相关标签
  

闽ICP备14008679号