python 日志模块日志等级的设置 输出格式 及日志等级设置失效的问题

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)spathname的文件名部分,包含文件后缀
module%(module)sfilename的名称部分,不包含后缀
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

参考:https://www.cnblogs.com/yyds/p/6901864.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值