Python logging模块(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/baidu_39372836/article/details/90669645

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)] - 这是一条严重错误信息

猜你喜欢

转载自blog.csdn.net/baidu_39372836/article/details/90669645
今日推荐