业务场景:你总不能一直使用print打印日志吧
"""
@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,不会打印
就像上面的那样,难道打印到日志就不能打印到控制台了么,当然不是,而且刚才虽然可以生成日志文件,我们也不建议那么做
"""
@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
"""
@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
"""
@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'
"""
@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'