HiveNetCore.logging_hivenet module¶
简单日志模块
参见
https//docs.python.org/zh-cn/3/howto/logging-cookbook.html
- class HiveNetCore.logging_hivenet.EnumLoggerConfigType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[源代码]¶
基类:
Enum日志配置方式
- INI_FILE = 'INI_FILE'¶
- JSON_FILE = 'JSON_FILE'¶
- JSON_STR = 'JSON_STR'¶
- XML_FILE = 'XML_FILE'¶
- class HiveNetCore.logging_hivenet.EnumLoggerName(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[源代码]¶
基类:
Enum输出日志类型,用于编码时快捷获取输出日志类型字符内容
- Console = 'Console'¶
- ConsoleAndFile = 'ConsoleAndFile'¶
- File = 'File'¶
- class HiveNetCore.logging_hivenet.Logger(conf_file_name=None, logger_name=EnumLoggerName.Console, logfile_path='', config_type=EnumLoggerConfigType.JSON_STR, json_str=None, auto_create_conf=True, is_create_logfile_by_day=True, call_fun_level=0)[源代码]¶
基类:
object日志输出类, 封装Python自带logging库的日志类, 简化日志类的配置和输出
示例
1、装载要使用的对象
import HiveNetCore.logging_hivenet as simple_log
2、程序本地创建“logger.conf”文件, 修改配置文件为自己希望的内容
注意: conf文件中请不要含中文内容, 原因是目前的程序对中文处理存在转码问题(问题待解决)
主要修改的参数如下:
(1)[handler_FileHandler]下的args参数:
第1个参数是日志文件名(可以带路径), 日志程序会自动在扩展名前补充日期;
第2个参数固定为追加模式;
第3个参数为自动转存的文件大小, 单位为byte;
第4个参数为自动转存时, 超过多少个文件后以覆盖方式记录(不会再新增)
(2)[formatters]下的format参数, 该参数定义了日志的格式
3、各个标签下的level级别, 修改为: DEBUG、INFO、WARNING、ERROR、CRITICAL中的一个
4、使用方式
# 实例化对象, 根据需要传入不同参数
_logger = simple_log.Logger(…)
# 写日志
_logger.log(simple_log.INFO, ‘要写入的日志’)
# 其他写入方式
_logger.info(‘要写入的INFO日志’)
_logger.debug(‘要写入的Debug日志’)
- __init__(conf_file_name=None, logger_name=EnumLoggerName.Console, logfile_path='', config_type=EnumLoggerConfigType.JSON_STR, json_str=None, auto_create_conf=True, is_create_logfile_by_day=True, call_fun_level=0)[源代码]¶
初始化日志类, 生成日志对象实例
- 参数
conf_file_name (string) –
default=None, 日志配置文件路径和文件名:
默认为’logger.conf’, 如果找不到配置文件本函数会自动创带默认设置的配置文件
logger_name (EnumLoggerName|string) –
default=EnumLoggerName.Console, 输出日志类型,
默认的3个类型如下: Console-输出到屏幕,File-输出到文件,ConsoleAndFile-同时输出到屏幕和文件;
如果自己自定义了日志模块名, 可以直接使用字符串方式传值使用(例如’myLoggerName’)
logfile_path (string) –
default=’’, 日志输出文件的路径(含文件名), 如果已有配置文件的情况下该
参数无效, 不传值时代表使用’log/程序名.log’来定义输出文件的路径
config_type (EnumLoggerConfigType) – default=EnumLoggerConfigType.JSON_STR, 日志配置方式
json_str (string) –
default=None, 当日志配置方式为JSON_STR时使用, 配置的字符串,
如果不串则默认使用_LOGGER_DEFAULT_JSON_CONSOLE_STR的值
auto_create_conf (bool) – default=True, 是否自动创建配置文件(找不到指定的配置文件时), 默认为True
is_create_logfile_by_day (bool) – default=True, 指定是否按天生成新的日志文件, 默认为True
call_fun_level (int) –
default=0, 指定log函数输出文件名和函数名的层级, 当自己对日志函数再封装
了几层的情况下, 无法打印到实际所需要登记的函数时, 可以指定从向上几级来获取真实调用函数;
0代表获取直接调用函数; 1代表获取直接调用函数的上一级
示例
log = Logger(conf_file_name=’/root/logger.conf’, logger_name=’ConsoleAndFile’,
logfile_path=”appname.log’, auto_create_conf=True)
log.log(simple_log.INFO, ‘输出日志内容’):
- property base_logger¶
获取底层的logger对象, (logging.getLogger()对象)
@property {logger}
- change_logger_name(logger_name)[源代码]¶
修改输出日志类型配置
- 参数
logger_name (EnumLoggerName|string) –
输出日志类型, 默认为’Console’:
Console-输出到屏幕,File-输出到文件,ConsoleAndFile-同时输出到屏幕和文件
如果没有自定义日志类型, 可以使用EnumLoggerName枚举值,用法为: EnumLoggerName.Console
- static create_logger_by_dict(config_dict)[源代码]¶
根据参数字典生成日志对象
- 参数
config_dict (dict) –
参数字典
注: 通过 StringTool.xml_to_dict 函数解析xml配置产生的字典, 取logger节点内部的内容
<logger>
<conf_file_name></conf_file_name>
<logger_name>Console</logger_name>
<logfile_path></logfile_path>
<config_type>JSON_STR</config_type>
<json_str></json_str>
<auto_create_conf>true</auto_create_conf>
<is_create_logfile_by_day>true</is_create_logfile_by_day>
<call_fun_level>0</call_fun_level>
</logger>
- critical(msg, *args, **kwargs)[源代码]¶
记录CRITICAL级别的日志
用于兼容logging的写日志模式提供的方法
- 参数
msg (string) – 要输出的日志内容
args (**kwargs) – 通用日志类的args参数
args –
通用日子类的kwargs参数, 以下为特殊参数的说明
extra {dict} - 用于传递日志上下文的字典, 可用于额外添加一些上下文内容
例如可传入{‘ip’: ‘113.208.78.29’, ‘username’: ‘Petter’}, 这样当Formatter为
’%(asctime)s - %(name)s - %(ip)s - %(username)s - %(message)s’时可以正常输出日志值
以下是simple_log定义的一些特殊上下文:
callFunLevel {int} - 日志中输出的函数名(文件名)所属层级:
0 - 输出调用本函数的函数名(文件名)
1 - 输出调用本函数的函数的上1级函数的函数名(文件名)
n - 输出调用本函数的函数的上n级函数的函数名(文件名)
dealMsgFun {function} - 自定义日志内容修改函数, 可以在输出日志前动态修改日志内容(msg)
函数格式为funs(topic_name, record){return msg_string}, 返回生成后的日志msg内容
topicName {string} - 日志主题, 与dealMsgFun配套使用
- debug(msg, *args, **kwargs)[源代码]¶
记录DEBUG级别的日志
用于兼容logging的写日志模式提供的方法
- 参数
msg (string) – 要输出的日志内容
args (**kwargs) – 通用日志类的args参数
args –
通用日子类的kwargs参数, 以下为特殊参数的说明
extra {dict} - 用于传递日志上下文的字典, 可用于额外添加一些上下文内容
例如可传入{‘ip’: ‘113.208.78.29’, ‘username’: ‘Petter’}, 这样当Formatter为
’%(asctime)s - %(name)s - %(ip)s - %(username)s - %(message)s’时可以正常输出日志值
以下是simple_log定义的一些特殊上下文:
callFunLevel {int} - 日志中输出的函数名(文件名)所属层级:
0 - 输出调用本函数的函数名(文件名)
1 - 输出调用本函数的函数的上1级函数的函数名(文件名)
n - 输出调用本函数的函数的上n级函数的函数名(文件名)
dealMsgFun {function} - 自定义日志内容修改函数, 可以在输出日志前动态修改日志内容(msg)
函数格式为funs(topic_name, record){return msg_string}, 返回生成后的日志msg内容
topicName {string} - 日志主题, 与dealMsgFun配套使用
- error(msg, *args, **kwargs)[源代码]¶
记录ERROR级别的日志
用于兼容logging的写日志模式提供的方法
- 参数
msg (string) – 要输出的日志内容
args (**kwargs) – 通用日志类的args参数
args –
通用日子类的kwargs参数, 以下为特殊参数的说明
extra {dict} - 用于传递日志上下文的字典, 可用于额外添加一些上下文内容
例如可传入{‘ip’: ‘113.208.78.29’, ‘username’: ‘Petter’}, 这样当Formatter为
’%(asctime)s - %(name)s - %(ip)s - %(username)s - %(message)s’时可以正常输出日志值
以下是simple_log定义的一些特殊上下文:
callFunLevel {int} - 日志中输出的函数名(文件名)所属层级:
0 - 输出调用本函数的函数名(文件名)
1 - 输出调用本函数的函数的上1级函数的函数名(文件名)
n - 输出调用本函数的函数的上n级函数的函数名(文件名)
dealMsgFun {function} - 自定义日志内容修改函数, 可以在输出日志前动态修改日志内容(msg)
函数格式为funs(topic_name, record){return msg_string}, 返回生成后的日志msg内容
topicName {string} - 日志主题, 与dealMsgFun配套使用
- info(msg, *args, **kwargs)[源代码]¶
记录INFO级别的日志
用于兼容logging的写日志模式提供的方法
- 参数
msg (string) – 要输出的日志内容
args (**kwargs) – 通用日志类的args参数
args –
通用日子类的kwargs参数, 以下为特殊参数的说明
extra {dict} - 用于传递日志上下文的字典, 可用于额外添加一些上下文内容
例如可传入{‘ip’: ‘113.208.78.29’, ‘username’: ‘Petter’}, 这样当Formatter为
’%(asctime)s - %(name)s - %(ip)s - %(username)s - %(message)s’时可以正常输出日志值
以下是simple_log定义的一些特殊上下文:
callFunLevel {int} - 日志中输出的函数名(文件名)所属层级:
0 - 输出调用本函数的函数名(文件名)
1 - 输出调用本函数的函数的上1级函数的函数名(文件名)
n - 输出调用本函数的函数的上n级函数的函数名(文件名)
dealMsgFun {function} - 自定义日志内容修改函数, 可以在输出日志前动态修改日志内容(msg)
函数格式为funs(topic_name, record){return msg_string}, 返回生成后的日志msg内容
topicName {string} - 日志主题, 与dealMsgFun配套使用
- log(level, msg, *args, **kwargs)[源代码]¶
通过日志实例输出日志内容(兼容默认logging类的用法)
- 参数
日志级别(simple_log.DEBUG/INFO/WARNING/ERROR/CRITICAL) (-) –
msg (string) – 要输出的日志内容
args (**kwargs) – 通用日志类的args参数
args –
通用日子类的kwargs参数, 以下为特殊参数的说明
extra {dict} - 用于传递日志上下文的字典, 可用于额外添加一些上下文内容
例如可传入{‘ip’: ‘113.208.78.29’, ‘username’: ‘Petter’}, 这样当Formatter为
’%(asctime)s - %(name)s - %(ip)s - %(username)s - %(message)s’时可以正常输出日志值
以下是simple_log定义的一些特殊上下文:
callFunLevel {int} - 日志中输出的函数名(文件名)所属层级:
0 - 输出调用本函数的函数名(文件名)
1 - 输出调用本函数的函数的上1级函数的函数名(文件名)
n - 输出调用本函数的函数的上n级函数的函数名(文件名)
dealMsgFun {function} - 自定义日志内容修改函数, 可以在输出日志前动态修改日志内容(msg)
函数格式为funs(topic_name, record){return msg_string}, 返回生成后的日志msg内容
topicName {string} - 日志主题, 与dealMsgFun配套使用
示例
log = Logger(conf_file_name=’/root/logger.conf’,logger_name=’ConsoleAndFile’,
logfile_path=’appname.log’,auto_create_conf=True)
log.log(simple_log.ERROR, ‘输出日志内容’)
- setLevel(level)[源代码]¶
动态设置日志logger的输出级别(只影响loggername的级别, 不影响handler的级别)
- 参数
level (int) – 日志级别(simple_log.DEBUG/INFO/WARNING/ERROR/CRITICAL)
- setLevelWithHandler(level)[源代码]¶
设置日志对象的日志级别(同时修改loggername及handler的级别)
- 参数
level (int) – 日志级别(simple_log.DEBUG/INFO/WARNING/ERROR/CRITICAL)
- static set_handler_log_level(handler, log_level)[源代码]¶
设置指定handler的日志输出级别
- 参数
handler (object) – 要设置的handler对象, 可通过_logger.base_logger.handlers[i]获取
log_level (int) – 日志级别(simple_log.DEBUG/INFO/WARNING/ERROR/CRITICAL)
- set_logger_formater(format_str)[源代码]¶
动态设置输出日志格式
- 参数
format_str (string) – 输出格式字符串, 参考conf文件中的format格式
- warning(msg, *args, **kwargs)[源代码]¶
记录WARNING级别的日志
用于兼容logging的写日志模式提供的方法
- 参数
msg (string) – 要输出的日志内容
args (**kwargs) – 通用日志类的args参数
args –
通用日子类的kwargs参数, 以下为特殊参数的说明
extra {dict} - 用于传递日志上下文的字典, 可用于额外添加一些上下文内容
例如可传入{‘ip’: ‘113.208.78.29’, ‘username’: ‘Petter’}, 这样当Formatter为
’%(asctime)s - %(name)s - %(ip)s - %(username)s - %(message)s’时可以正常输出日志值
以下是simple_log定义的一些特殊上下文:
callFunLevel {int} - 日志中输出的函数名(文件名)所属层级:
0 - 输出调用本函数的函数名(文件名)
1 - 输出调用本函数的函数的上1级函数的函数名(文件名)
n - 输出调用本函数的函数的上n级函数的函数名(文件名)
dealMsgFun {function} - 自定义日志内容修改函数, 可以在输出日志前动态修改日志内容(msg)
函数格式为funs(topic_name, record){return msg_string}, 返回生成后的日志msg内容
topicName {string} - 日志主题, 与dealMsgFun配套使用
- class HiveNetCore.logging_hivenet.QueueHandler(queue='', topic_name='', is_deal_msg=True, error_queue_size=20)[源代码]¶
基类:
Handler内存队列日志处理Handler类
- 将日志信息写入指定队列对象(通过handler.queue访问), 队列对象必须支持put(object)的方法, 每个传入的日志的对象信息如下:
queue_obj.levelno {int} : 日志级别, 值说明参考logging.INFO这些值 queue_obj.topic_name {string} : 日志主题标识(用于使用方区分日志来源),注意’default’为保留的标识名 queue_obj.msg {string} : 已格式化后的日志内容, is_deal_msg为True时有效 queue_obj.record {object} : 未格式化的日志相关信息, 其中record.msg为要写入的日志’%(message)s’, is_deal_msg为False时有效
如果使用自带的start_logging方法进行队列的处理, 当写日志出现异常时, 会将异常信息登记到handler.error_queue, 注意该队列可以设置长度(避免内存占用过大), 当超过一定长度时会将前面的数据删除
error_obj.topic_name - 日志主题标识 error_obj.trace_str - 异常堆栈信息字符
- __init__(queue='', topic_name='', is_deal_msg=True, error_queue_size=20)[源代码]¶
初始化队列日志Handler对象
- 参数
queue (string) –
default=’’, 要写入的队列对象, 可以传多种类型:
’’ or None - 代表由类自行生成FIFO队列, 可以通过handler.queue访问对象
’queue_var_name’ {string} - 传入外部生成的队列变量访问名称字符串
queue_obj {object} - 直接传入队列对象
topic_name (string) – default=’’, 默认的日志主题, 当写日志的时候没有传topicName的扩展信息时使用
is_deal_msg (bool) –
default=True, 是否处理日志格式:
True - 直接生成完整的日志, 将日志字符串写入队列
False - 不直接生成完整的日志消息, 而是将record对象放入队列(待后面的程序自动处理)
error_queue_size (int) –
default=20, 通过start_logging方法写日志时, 遇到异常时记录错误信息的队列大小,
如果错误信息数量超过大小, 会自动删除前面的数据, 0代表不限制大小
- default_topic_name = ''¶
- error_queue = None¶
- queue = None¶
- start_logging(loggers_or_funs, thread_num=1, deal_msg_funs={}, formatters=None)[源代码]¶
启动线程处理日志队列的对象
- 参数
loggers_or_funs (dict) –
要写入的日志logger对象列表(或处理函数列表), key为topic_name, value为对应的
处理日志类(HiveNetCore.logging_hivenet.Logger)或处理函数, 其中’default’为默认日志处理类或处理函数,
如果不传入则代表匹配不到的topic_name不进行处理, 规则如下: 遇到日志项的topic_name在列表中不存在, 先找’default’的日志对象进行处理,
如果传入的日志对象清单中没有’default’, 则不进行该日志项的处理
如果传入的是处理函数, 格式为funs(levelno, topic_name, msg){…}
注意: 如果为logger, 则所传入的日志对象的formatter将统一修改为’%(message)s’, 因此该日志对象注意不要与其他日志处理共用
字典里可以支持logger和fun并存, 只是如果存在fun的情况, 应注意formatters的取值
thread_num (int) – default=1, 处理队列对象的线程数
deal_msg_funs (dict) –
default={}, 处理record的函数(形成msg部分内容), 当is_deal_msg为False时有效,
key为topic_name, value为对应的日志内容生成函数,
搜索函数的规则与loggers一样, 处理函数的定义应如下: func(topic_name, record) {return msg}
formatters (dict) –
default=None, is_deal_msg为False时, 用于格式化record的Formatter,
key为topic_name, value为该topic_name的Formatter, 搜索格式对象的规则与loggers一样,
如果formatters=None, 代表自动获取loggers的Formatter形成该字典
- 返回
启动结果, result.code: ‘00000’-成功, ‘21401’-服务不属于停止状态, 不能启动, 其他-异常
- 返回类型