版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Python logging模块(一)
logging模块是Python内置的标准模块,主要用于输出运行日志,可以通过设置不同的日志等级,实现日志文件保存,输出路径以及输出形式
日志级别
- 默认等级日志级别为WARNING,低于该等级的均不会被打印
级别 | 数值 |
---|---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |
1、简单使用
import logging
logging.debug("debug---message")
logging.info("info---message")
logging.warning("warning---message")
logging.error("error---message")
logging.critical("critical---message")
运行结果:
WARNING:root:warning---message
ERROR:root:error---message
CRITICAL:root:critical---message
2、日志等级-日志格式-输出文件
- 设置等级-设置为DEBUG模式
logging.basicConfig(level=logging.DEBUG)
- 日志格式
默认格式为(日志级别:Logger名称:日志内容)
属性 | 格式 | 英文描述 | 中文翻译 |
---|---|---|---|
name | %(name)s | Name of the logger used to log the call. | 用于记录调用的日志程序的名称,logger的名称,默认为root。 |
filename | %(filename)s | Filename portion of pathname. | 调用日志输出函数的文件名。 |
funcName | %(funcName)s | Name of function containing the logging call. | 包含日志记录调用的函数的名称。 |
levelname | %(levelname)s | Text logging level for the message (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’). | 消息的文本日志级别(‘DEBUG’、‘INFO’、‘WARNING’、‘ERROR’、‘CRITICAL’)。 |
pathname | %(pathname)s | Full pathname of the source file where the logging call was issued (if available). | 发出日志调用的源文件的完整路径名(如果可用)。 |
levelno | %(levelno)s | Numeric logging level for the message (DEBUG, INFO, WARNING, ERROR, CRITICAL). | 消息的数字日志级别(DEBUG、INFO、WARNING、ERROR、CRITICAL)。 |
module | %(module)s | Filename portion of pathname. | 调用日志的模块名(文件名的名称部分)。 |
lineno | %(lineno)d | Source line number where the logging call was issued (if available). | 发出日志调用的源行号(如果可用)。 |
created | %(created)f | Time when the LogRecord was created (as returned by time.time()). | 创建日志记录的时间(由Time . Time()返回)。 |
relativeCreated | %(relativeCreated)d | Time in milliseconds when the LogRecord was created, relative to the time the logging module was loaded. | 创建日志记录的时间(以毫秒为单位)相对于加载日志模块的时间。 |
asctime | %(asctime)s | Human-readable time when the LogRecord was created. By default this is of the form ‘2003-07-08 16:49:45,896’ (the numbers after the comma are millisecond portion of the time). | 创建日志记录时的人类可读时间。默认情况下,它的形式是“2003-07-08 16:49:45 896”(逗号后面的数字是时间的毫秒部分)。 |
process | %(process)d | Process ID (if available). | 进程ID(如果可用)。 |
processName | %(processName)s | Process name (if available). | 进程名(如果可用)。 |
thread | %(thread)d | Thread ID (if available). | 线程ID(如果可用)。 |
threadName | %(threadName)s | Thread name (if available). | 线程名字(如果可用)。 |
message | %(message)s | The logged message, computed as msg % args. This is set when Formatter.format() is invoked. | 已记录的消息,计算为msg % args。这是在调用format .format()时设置的。 |
- 示例1(name、filename、funcName、levelname、levelno)
import logging
fmt = 'name(调用日志程序的名称:默认root):%(name)s\t filename(调用日志输出函数的文件名):%(filename)s\t funcName(调用日志输出函数的函数名):%(funcName)s \t levelname(日志等级-文字):%(levelname)s\t levelno(日志等级-数字):%(levelno)s\t pathname(日志调用的源文件的完整路径名):%(pathname)s '
logging.basicConfig(level=logging.DEBUG, format=fmt)
logging.debug("这是一条调试信息")
logging.info("这是一条普通信息")
logging.warning("这是一条警告信息")
# 指定logger使用的名字,不使用默认的root
logger = logging.getLogger("新的logger名字")
logger.error("这是一条错误信息")
def my_critical():
logging.critical("这是一条严重错误信息")
my_critical()
结果:
结果:
name(调用日志程序的名称:默认root):root filename(调用日志输出函数的文件名):main.py funcName(调用日志输出函数的函数名):<module> levelname(日志等级-文字):DEBUG levelno(日志等级-数字):10 pathname(日志调用的源文件的完整路径名):C:/Users/LGY/PycharmProjects/web/main.py
name(调用日志程序的名称:默认root):root filename(调用日志输出函数的文件名):main.py funcName(调用日志输出函数的函数名):<module> levelname(日志等级-文字):INFO levelno(日志等级-数字):20 pathname(日志调用的源文件的完整路径名):C:/Users/LGY/PycharmProjects/web/main.py
name(调用日志程序的名称:默认root):root filename(调用日志输出函数的文件名):main.py funcName(调用日志输出函数的函数名):<module> levelname(日志等级-文字):WARNING levelno(日志等级-数字):30 pathname(日志调用的源文件的完整路径名):C:/Users/LGY/PycharmProjects/web/main.py
name(调用日志程序的名称:默认root):新的logger名字 filename(调用日志输出函数的文件名):main.py funcName(调用日志输出函数的函数名):<module> levelname(日志等级-文字):ERROR levelno(日志等级-数字):40 pathname(日志调用的源文件的完整路径名):C:/Users/LGY/PycharmProjects/web/main.py
name(调用日志程序的名称:默认root):root filename(调用日志输出函数的文件名):main.py funcName(调用日志输出函数的函数名):my_critical levelname(日志等级-文字):CRITICAL levelno(日志等级-数字):50 pathname(日志调用的源文件的完整路径名):C:/Users/LGY/PycharmProjects/web/main.py
- 示例2(module、lineno、created、asctime、message)
import logging
import time
fmt = 'module(调用日志所在的模块名):%(module)s \t lineno(日志调用的行号):%(lineno)d \t created(日志记录的时间):%(created)f \t relativeCreated(创建日志记录的时间(以毫秒为单位)相对于加载日志模块的时间):%(relativeCreated)d \t asctime(可视化时间):%(asctime)s\t message:(打印的信息):%(message)s '
logging.basicConfig(level=logging.DEBUG, format=fmt)
logging.debug("这是一条调试信息")
logging.info("这是一条普通信息")
time.sleep(1)
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
logging.critical("这是一条严重错误信息")
结果:
module(调用日志所在的模块名):main lineno(日志调用的行号):8 created(日志记录的时间):1559121316.796984 relativeCreated(创建日志记录的时间(以毫秒为单位)相对于加载日志模块的时间):0 asctime(可视化时间):2019-05-29 17:15:16,796 message:(打印的信息):这是一条调试信息
module(调用日志所在的模块名):main lineno(日志调用的行号):9 created(日志记录的时间):1559121316.796984 relativeCreated(创建日志记录的时间(以毫秒为单位)相对于加载日志模块的时间):0 asctime(可视化时间):2019-05-29 17:15:16,796 message:(打印的信息):这是一条普通信息
module(调用日志所在的模块名):main lineno(日志调用的行号):11 created(日志记录的时间):1559121317.797309 relativeCreated(创建日志记录的时间(以毫秒为单位)相对于加载日志模块的时间):1000 asctime(可视化时间):2019-05-29 17:15:17,797 message:(打印的信息):这是一条警告信息
module(调用日志所在的模块名):main lineno(日志调用的行号):12 created(日志记录的时间):1559121317.797309 relativeCreated(创建日志记录的时间(以毫秒为单位)相对于加载日志模块的时间):1000 asctime(可视化时间):2019-05-29 17:15:17,797 message:(打印的信息):这是一条错误信息
module(调用日志所在的模块名):main lineno(日志调用的行号):13 created(日志记录的时间):1559121317.797309 relativeCreated(创建日志记录的时间(以毫秒为单位)相对于加载日志模块的时间):1000 asctime(可视化时间):2019-05-29 17:15:17,797 message:(打印的信息):这是一条严重错误信息
- 示例3(thread、threadName)
import logging
import threading
import time
fmt = ' message:(打印的信息):%(message)s \t thread(线程ID):%(thread)d \t threadName(线程名字):%(threadName)s'
logging.basicConfig(level=logging.DEBUG, format=fmt)
def my_debug(num, name=None):
print(num)
print(name)
logging.debug("这是一条调试信息")
def my_info():
logging.info("这是一条普通信息")
def my_log():
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
logging.critical("这是一条严重错误信息")
# 创建线程1
t1 = threading.Thread(target=my_debug, args=(100,), kwargs={"name": "debug"},name="线程1")
# 创建线程2
t2 = threading.Thread(target=my_info,name="线程2")
# 创建线程3
t3 = threading.Thread(target=my_log,name="线程3")
t1.start()
t2.start()
t3.start()
结果:
message:(打印的信息):这是一条调试信息 thread(线程ID):17428 threadName(线程名字):线程1
message:(打印的信息):这是一条普通信息 thread(线程ID):10596 threadName(线程名字):线程2
100
debug
message:(打印的信息):这是一条警告信息 thread(线程ID):7120 threadName(线程名字):线程3
message:(打印的信息):这是一条错误信息 thread(线程ID):7120 threadName(线程名字):线程3
message:(打印的信息):这是一条严重错误信息 thread(线程ID):7120 threadName(线程名字):线程3
- 示例4(process、processName)
import logging
import multiprocessing
import time
fmt = ' message:(打印的信息):%(message)s \t process(进程ID):%(process)d \t processName(进程名字):%(processName)s'
logging.basicConfig(level=logging.DEBUG, format=fmt)
def my_debug(num, name=None):
print(num)
print(name)
logging.debug("这是一条调试信息")
def my_info():
logging.info("这是一条普通信息")
def my_log():
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
logging.critical("这是一条严重错误信息")
if __name__ == '__main__':
# 创建进程1
p1 = multiprocessing.Process(target=my_debug, args=(100,), kwargs={"name": "小花"}, name="进程1")
p1.start()
p2 = multiprocessing.Process(target=my_info,name="进程2")
p2.start()
p3 = multiprocessing.Process(target=my_log,name="进程2")
p3.start()
结果:
100
message:(打印的信息):这是一条调试信息 process(进程ID):9920 processName(进程名字):进程1
小花
message:(打印的信息):这是一条普通信息 process(进程ID):8016 processName(进程名字):进程2
message:(打印的信息):这是一条警告信息 process(进程ID):12240 processName(进程名字):进程2
message:(打印的信息):这是一条错误信息 process(进程ID):12240 processName(进程名字):进程2
message:(打印的信息):这是一条严重错误信息 process(进程ID):12240 processName(进程名字):进程2
3、basicConfig参数详解-输出文件
常用参数介绍
- filename : 指定log文件生成的位置
- filemode: 如果指定文件名,默认以“a”(追加)模式打开
- format: 为处理程序使用指定的格式字符串
- datefmt: 使用time.strftime()所接受的指定日期/时间格式。
- level: 将根记录器级别设置为指定的级别。
默认Python的logging模块是将日志打印等到标准输出中-控制台中
import logging
format = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
logging.basicConfig(filename="my.log", filemode="a", format=format, datefmt="%Y-%m-%d %H:%M:%S", level=logging.DEBUG, )
logging.debug("这是一条调试信息")
logging.info("这是一条普通信息")
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
logging.critical("这是一条严重错误信息")
my.log(以utf-8模式打开显示乱码,可以利用pycharm转为GB2313即可正常显示中文)
2019-05-31 10:12:29 DEBUG [root] [main.py(<module>:5)] - 这是一条调试信息
2019-05-31 10:12:29 INFO [root] [main.py(<module>:6)] - 这是一条普通信息
2019-05-31 10:12:29 WARNING [root] [main.py(<module>:7)] - 这是一条警告信息
2019-05-31 10:12:29 ERROR [root] [main.py(<module>:8)] - 这是一条错误信息
2019-05-31 10:12:29 CRITICAL [root] [main.py(<module>:9)] - 这是一条严重错误信息