python的logging日志模块和loguru

python的logging日志模块和loguru

业务场景:你总不能一直使用print打印日志吧

logging

logging

日志级别 level
"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""

import logging
"""
CRITICAL > ERROR > WARNING > INFO > DEBUG > NOSET
"""
# 设置日志级别,低于设置的debug的日志是不会打印出来的
logging.basicConfig(level=logging.INFO)

logging.warning(u"warning高于info,可以打印")
logging.info(u"info=info,可以打印")
logging.debug(u"debug低于info,不会打印")

结果

WARNING:root:warning高于info,可以打印
INFO:root:info=info,可以打印
设置日志打印格式
"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""

import logging
"""
CRITICAL > ERROR > WARNING > INFO > DEBUG > NOSET
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
"""
# 设置日志级别,低于设置的debug的日志是不会打印出来的
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')

logging.warning(u"warning高于info,可以打印")
logging.info(u"info=info,可以打印")
logging.debug(u"debug低于info,不会打印")

结果

2022-01-17 12:05:59,517 - MyLoggenFour.py[line:27] - WARNING: warning高于info,可以打印
2022-01-17 12:05:59,517 - MyLoggenFour.py[line:28] - INFO: info=info,可以打印
设置文件打印
"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""

import logging
"""
CRITICAL > ERROR > WARNING > INFO > DEBUG > NOSET
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
"""
# 设置日志级别,低于设置的debug的日志是不会打印出来的
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
                    filename="log.txt",
                    filemode='w')
logging.warning(u"warning高于info,可以打印")
logging.info(u"info=info,可以打印")
logging.debug(u"debug低于info,不会打印")

结果

控制台不打印信息了,而是同级目录下生成了一个log.txt,里面的内容为
2022-01-17 13:34:16,572 - MyLoggenFour.py[line:28] - WARNING: warning高于info,可以打印
2022-01-17 13:34:16,572 - MyLoggenFour.py[line:29] - INFO: info=info,可以打印
2022-01-17 13:34:16,572 - MyLoggenFour.py[line:30] - DEBUG: debug低于info,不会打印

Logger和Handler

就像上面的那样,难道打印到日志就不能打印到控制台了么,当然不是,而且刚才虽然可以生成日志文件,我们也不建议那么做

打印日志的Handdler
"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""

import logging
import os.path
import time

"""

"""
# 创建一个logger
logger = logging.getLogger()
# 设置日志级别,低于设置的debug的日志是不会打印出来的,这个开关是总开关,如果在handdler上也设置了日志等级,则会在该handdler上覆盖这个等级
# 但是我也不知道为什么,我自己搞出来的总是这里的开关管用,在handdler上的不管用,有没有大神告诉我该怎么办
logger.setLevel(logging.INFO)
# 获取时间
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
# 设置日志文件的地址
logfile = os.path.join(os.path.dirname(__name__), rq+"debug.log")
# 生成FileHandler,将文件和写入模式作为参数穿进去
file_handdler = logging.FileHandler(logfile, mode='w')
# 设置输出到文件的内容的格式
formatter_me = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# 将定义好的内容格式交给file_handdler
file_handdler.setFormatter(formatter_me)
# 设置FileHandler自己的日志级别
# file_handdler.setLevel(logging.NOTSET)
# 将FileHandler添加到logger里
logger.addHandler(file_handdler)
logging.warning(u"warning高于info,可以打印")
logging.info(u"info=info,可以打印")
logging.debug(u"debug低于info,不会打印")

结果

控制台不打印信息了,而是同级目录下生成了一个202201171403debug.log,里面的内容为

2022-01-17 14:03:33,570 - MyLoggenFour.py[line:34] - WARNING: warning高于info,可以打印
2022-01-17 14:03:33,570 - MyLoggenFour.py[line:35] - INFO: info=info,可以打印
打印日志还想输出到控制台
"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""

import logging
import os.path
import time

"""

"""
# 创建一个logger
logger = logging.getLogger()
# 设置日志级别,低于设置的debug的日志是不会打印出来的,这个开关是总开关,如果在handdler上也设置了日志等级,则会在该handdler上覆盖这个等级
# 但是我也不知道为什么,我自己搞出来的总是这里的开关管用,在handdler上的不管用,有没有大神告诉我该怎么办
logger.setLevel(logging.INFO)
# 获取时间
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
# 设置日志文件的地址
logfile = os.path.join(os.path.dirname(__name__), rq+"debug.log")
# 生成FileHandler,将文件和写入模式作为参数穿进去
file_handdler = logging.FileHandler(logfile, mode='w')
# 生成控制台打印的日志的StreamHandler
log_handder = logging.StreamHandler()
# 设置输出到文件的内容的格式
formatter_me = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# 将定义好的内容格式交给StreamHandler
log_handder.setFormatter(formatter_me)
# 将定义好的内容格式交给file_handdler
file_handdler.setFormatter(formatter_me)
# 设置FileHandler自己的日志级别
# file_handdler.setLevel(logging.NOTSET)
# 将FileHandler添加到logger里
logger.addHandler(file_handdler)
# 将StreamHandler添加到logger里
logger.addHandler(log_handder)
logging.warning(u"warning高于info,可以打印")
logging.info(u"info=info,可以打印")
logging.debug(u"debug低于info,不会打印")

结果

除了日志之外,在控制台打印了如下日志,也就是说这个handdler,其实就是对控制台和日志文件的分而治之,当然,你也可以设置多个FileHandler,这样你就可以根据不同的日志级别输出到不同的日志文件

/Users/zc/PycharmProjects/fastapitest/venv/bin/python /Users/zc/PycharmProjects/fastapitest/Two/MyLoggenFour.py
2022-01-17 14:06:08,835 - MyLoggenFour.py[line:40] - WARNING: warning高于info,可以打印
2022-01-17 14:06:08,835 - MyLoggenFour.py[line:41] - INFO: info=info,可以打印

Process finished with exit code 0
一个日志太大了怎么办
"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""

import logging
import os.path
import time

"""

"""
# 创建一个logger
logger = logging.getLogger()
# 设置日志级别,低于设置的debug的日志是不会打印出来的,这个开关是总开关,如果在handdler上也设置了日志等级,则会在该handdler上覆盖这个等级
# 但是我也不知道为什么,我自己搞出来的总是这里的开关管用,在handdler上的不管用,有没有大神告诉我该怎么办
logger.setLevel(logging.INFO)
# 获取时间
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
# 设置日志文件的地址
logfile_2 = os.path.join(os.path.dirname(__name__), rq+"debug2.log")
logfile_3 = os.path.join(os.path.dirname(__name__), rq+"debug3.log")
# 每隔500字节保存成一个日志文件,备份文件为3个
file_handdler2 = logging.handlers.RotatingFileHandler(logfile_2, mode="w", maxBytes=500, backupCount=3)
# 每隔1个小时,保存一个日志文件,备份文件为3个
file_handdler3 = logging.handlers.TimedRotatingFileHandler(logfile_3, when="H", interval=1, backupCount=3)
# 生成控制台打印的日志的StreamHandler
log_handder = logging.StreamHandler()
# 设置输出到文件的内容的格式
formatter_me = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# 将定义好的内容格式交给StreamHandler
log_handder.setFormatter(formatter_me)
# 将定义好的内容格式交给file_handdler
file_handdler2.setFormatter(formatter_me)
file_handdler3.setFormatter(formatter_me)
# 设置FileHandler自己的日志级别
# file_handdler.setLevel(logging.NOTSET)
# 将FileHandler添加到logger里
logger.addHandler(file_handdler2)
logger.addHandler(file_handdler3)
# 将StreamHandler添加到logger里
logger.addHandler(log_handder)
logging.warning(u"warning高于info,可以打印")
logging.info(u"info=info,可以打印")
logging.debug(u"debug低于info,不会打印")
捕获异常
"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""

import logging
import os.path
import time

"""

"""
# 创建一个logger
logger = logging.getLogger()
# 设置日志级别,低于设置的debug的日志是不会打印出来的,这个开关是总开关,如果在handdler上也设置了日志等级,则会在该handdler上覆盖这个等级
# 但是我也不知道为什么,我自己搞出来的总是这里的开关管用,在handdler上的不管用,有没有大神告诉我该怎么办
logger.setLevel(logging.INFO)
# 获取时间
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
# 设置日志文件的地址
logfile = os.path.join(os.path.dirname(__name__), rq + "debug.log")
# 生成FileHandler,将文件和写入模式作为参数穿进去
file_handdler = logging.FileHandler(logfile, mode='w')
# 生成控制台打印的日志的StreamHandler
log_handder = logging.StreamHandler()
# 设置输出到文件的内容的格式
formatter_me = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# 将定义好的内容格式交给StreamHandler
log_handder.setFormatter(formatter_me)
# 将定义好的内容格式交给file_handdler
file_handdler.setFormatter(formatter_me)
# 设置FileHandler自己的日志级别
# file_handdler.setLevel(logging.NOTSET)
# 将FileHandler添加到logger里
logger.addHandler(file_handdler)
# 将StreamHandler添加到logger里
logger.addHandler(log_handder)
logging.warning(u"warning高于info,可以打印")
logging.info(u"info=info,可以打印")
logging.debug(u"debug低于info,不会打印")
# 捕获异常
try:
    open('/not_exist')
except Exception as e:
    # 一定要加上exc_info=False,否则是不会打印出异常信息的
    logger.error('failed open file', exc_info=False)

结果

/Users/zc/PycharmProjects/fastapitest/venv/bin/python /Users/zc/PycharmProjects/fastapitest/Two/MyLoggenFour.py
2022-01-17 15:20:20,276 - MyLoggenFour.py[line:40] - WARNING: warning高于info,可以打印
2022-01-17 15:20:20,276 - MyLoggenFour.py[line:41] - INFO: info=info,可以打印
2022-01-17 15:20:20,276 - MyLoggenFour.py[line:48] - ERROR: failed open file
Traceback (most recent call last):
  File "/Users/zc/PycharmProjects/fastapitest/Two/MyLoggenFour.py", line 45, in 
    open('/not_exist')
FileNotFoundError: [Errno 2] No such file or directory: '/not_exist'

Process finished with exit code 0

图解

为了方便记忆,做成了图片

需要的自取

链接: https://pan.baidu.com/s/1CnXAwOcz0YHXOOOvR33e7Q 提取码: esn1

python的logging日志模块和loguru_第1张图片

loguru

直接打印日志

"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""
import loguru

loguru.logger.error("hello")

结果

2022-01-17 15:55:39.820 | ERROR    | __main__::9 - hello

loguru直接打印异常

"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""

import loguru

try:
    open('/1/not/exist')
except Exception as EX:
    loguru.logger.error(EX)

结果,很明显,东西太少了

2022-01-17 15:50:26.033 | ERROR    | __main__::13 - [Errno 2] No such file or directory: '/1/not/exist'

loguru+traceback

"""
@File    :   MyLoggenFour.py    
@Modify Time      @Author    @Version
------------      -------    --------    
@Desciption:
"""
import traceback
import loguru

try:
    open('/1/not/exist')
except Exception as EX:
    ex = traceback.format_exc()
    loguru.logger.error('Exception:{}'.format(ex))

结果,更清晰

2022-01-17 15:54:10.326 | ERROR    | __main__::14 - Exception:Traceback (most recent call last):
  File "/Users/zc/PycharmProjects/fastapitest/Two/MyLoggenFour.py", line 11, in 
    open('/1/not/exist')
FileNotFoundError: [Errno 2] No such file or directory: '/1/not/exist'

你可能感兴趣的:(Python,python,开发语言,后端)