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(调用日志输出函数的函数名): levelname(日志等级-文字):DEBUG levelno(日志等级-数字):10 pathname(日志调用的源文件的完整路径名):C:/Users/LGY/PycharmProjects/web/main.py
name(调用日志程序的名称:默认root):root filename(调用日志输出函数的文件名):main.py funcName(调用日志输出函数的函数名): levelname(日志等级-文字):INFO levelno(日志等级-数字):20 pathname(日志调用的源文件的完整路径名):C:/Users/LGY/PycharmProjects/web/main.py
name(调用日志程序的名称:默认root):root filename(调用日志输出函数的文件名):main.py funcName(调用日志输出函数的函数名): levelname(日志等级-文字):WARNING levelno(日志等级-数字):30 pathname(日志调用的源文件的完整路径名):C:/Users/LGY/PycharmProjects/web/main.py
name(调用日志程序的名称:默认root):新的logger名字 filename(调用日志输出函数的文件名):main.py funcName(调用日志输出函数的函数名): 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()
结果:无锡看妇科的医院 http://www.ytsgfk120.com/
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(:5)] - 这是一条调试信息
2019-05-31 10:12:29 INFO [root] [main.py(:6)] - 这是一条普通信息
2019-05-31 10:12:29 WARNING [root] [main.py(:7)] - 这是一条警告信息
2019-05-31 10:12:29 ERROR [root] [main.py(:8)] - 这是一条错误信息
2019-05-31 10:12:29 CRITICAL [root] [main.py(:9)] - 这是一条严重错误信息