python 获得一个log模块的句柄代码
import logging
#logger模块的一些属性
#日志的格式
fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(message)s'
formatter = logging.Formatter(fmt)
#实例化日志模块
logger = logging.getLogger('myloger')
#日志等级的设置
logger.setLevel("ERROR")
#日志的两种打印实现形式 实例化 添加输出格式 设置日志的输出等级
#最后添加到实例化的日志模块里面
#1、控制台打印 是一个内存缓存的流
#终端和文件句柄的日志等级设置 是从logging实例化过来的 和logger还没有关系
handler_console = logging.StreamHandler()
handler_console.setFormatter(formatter)
handler_console.setLevel("INFO")
#2、打印的log文件里面 文件流形式
filename = 'xxxxx.log'
handler_file = logging.FileHandler(filename)
handler_file.setFormatter(formatter)
handler_file.setLevel("INFO")
python log日志的模块的 日志等级的设置
首先 日志等级的划分
"DEBUG"<"INFO"<"WARNING"<"ERROR"<"CRITICAL"
实例化日志的等级和目标日志输出的等级 比较
ERROR日志输出的等级>=设置的等级INFO
另一种实例化日志模块的方法
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%a, %d %b %Y %H:%M:%S',filename='myapp.log',filemode='w')
logging.info('---------------')
#写入到日志的里面
代码问题:控制台和日志的文件的等级设置要放在
错误示例:
formatter = logging.Formatter(fmt)
handler_file = logging.FileHandler(filename)
handler_file.setFormatter(formatter)
handler_console = logging.StreamHandler()
handler_console.setFormatter(formatter)
#终端和文件句柄的日志等级设置 是从logging实例化过来的 和logger还没有关系
handler_console.setLevel("INFO")
handler_file.setLevel("INFO")
logger = logging.getLogger('myloger')
实例化放在上面日志文件和控制台句柄日志等级设置的后面
上面的设置是不生效的
#为实例化logger添加文件句柄和客户终端
logger.addHandler(handler_file)
logger.addHandler(handler_console)
>>>>
logger.info('-------------------info')
>>>> 打印是空 默认的日志等级是ERROR
当前日志模块的等级设置 失效
实例化之后才会生效 不然就被logger默认的替代了
解决办法 使用这个级别设置
自定义日志模块的等级
logger = logging.getLogger('myloger')
在日志模块初始化之后设置日志模块的等级
logger.setLevel("DEBUG") #######################################
再在这之后设置 分别控制台输出和文件输出的句柄日志等级
handler_file.setLevel("INFO")
handler_console.setLevel("INFO")
日志的等级打印正常
fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(message)s'
%(name)s Name of the logger (logging channel) 日志通道的名称
%(levelno)s Numeric logging level for the message (DEBUG, INFO,
WARNING, ERROR, CRITICAL)
日志级别的数字表示
%(levelname)s Text logging level for the message ("DEBUG", "INFO",
"WARNING", "ERROR", "CRITICAL")
日志级别
%(pathname)s Full pathname of the source file where the logging
call was issued (if available)
脚本的绝对路径 调用日志记录函数的源码文件的全路径
%(filename)s Filename portion of pathname
pathname的文件名部分,包含文件后缀
%(module)s Module (name portion of filename)
filename的名称部分,不包含后缀
%(lineno)d Source line number where the logging call was issued
(if available)
调用日志记录函数的源代码所在的行号
%(funcName)s Function name 调用日志记录函数的函数名
%(created)f Time when the LogRecord was created (time.time()
return value)
日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值
%(asctime)s Textual time when the LogRecord was created
日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
%(msecs)d Millisecond portion of the creation time
日志事件发生事件的毫秒部分
%(relativeCreated)d Time in milliseconds when the LogRecord was created,
relative to the time the logging module was loaded
(typically at application startup time)
日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的
%(thread)d Thread ID (if available) 线程ID
%(threadName)s Thread name (if available) 线程名称
%(process)d Process ID (if available) 进程ID
%(message)s The result of record.getMessage(), computed just as
the record is emitted
日志记录的文本内容,通过 msg % args计算得到的
字段/属性名称 | 使用格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896 |
created | %(created)f | 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值 |
relativeCreated | %(relativeCreated)d | 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的) |
msecs | %(msecs)d | 日志事件发生事件的毫秒部分 |
levelname | %(levelname)s | 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') |
levelno | %(levelno)s | 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50) |
name | %(name)s | 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger |
message | %(message)s | 日志记录的文本内容,通过 msg % args 计算得到的 |
pathname | %(pathname)s | 调用日志记录函数的源码文件的全路径 |
filename | %(filename)s | pathname的文件名部分,包含文件后缀 |
module | %(module)s | filename的名称部分,不包含后缀 |
lineno | %(lineno)d | 调用日志记录函数的源代码所在的行号 |
funcName | %(funcName)s | 调用日志记录函数的函数名 |
process | %(process)d | 进程ID |
processName | %(processName)s | 进程名称,Python 3.1新增 |
thread | %(thread)d | 线程ID |
threadName | %(thread)s | 线程名称 |
log模块的输出格式
推荐使用.format(message) 不用考虑messge的格式 支持多种类型的数据
data={}
data['trade_amount']= "100"
logger.info('fee ={0}+"trade_amount"'.format(data['trade_amount']))
# Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。相对于老版的%格式方法,它有很多优点。
# 1.在%方法中%s只能替代字符串类型,而在format中不需要理会数据类型;
# 2.单个参数可以多次输出,参数顺序可以不相同;
# 3.填充方式十分灵活,对齐方式十分强大;
# 4.官方推荐用的方式,%方式将会在后面的版本被淘汰。
# 1、按照默认顺序,不指定位置
print("{} {}".format("hello", "world"))
# hello world
# 2、设置指定位置,可以多次使用
print("{0} {1} {0}".format("hello", "or"))
# hello or hello
# 3、使用列表格式化
person = {"name": "opcai", "age": 20}
print("My name is {name} . I am {age} years old .".format(**person))
# My name is opcai . I am 20 years old .
# 4、通过列表格式化
stu = ["opcai", "linux", "MySQL", "Python"]
print("My name is {0[0]} , I love {0[1]} !".format(stu))
# My name is opcai , I love linux !
#数字格式化
# 数字 格式 输出 描述
# 3.1415926 {:.2f} #3.14 保留小数点后两位
# print("{:.2f}".format(3.1415926));
# 3.1415926 {:+.2f} #+3.14 带符号保留小数点后两位
def example(id):
print ('example:{}'.format(id))
example("3")
python3.8 官方文档 https://docs.python.org/3.8/library/logging.html?highlight=logging#module-logging