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配套使用

exception(msg, *args, exc_info=True, **kwargs)[源代码]

记录ERROR级别的日志(处理异常信息)

用于兼容logging的写日志模式提供的方法

get_logger_formater()[源代码]

获取输出日志格式对象

注意: 如果有多个handler则返回第一个handler的日志格式对象

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代表不限制大小

close()[源代码]

Tidy up any resources used by the handler.

default_topic_name = ''
emit(record)[源代码]

Do whatever it takes to actually log the specified logging record.

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’-服务不属于停止状态, 不能启动, 其他-异常

返回类型

CResult

stop_logging()[源代码]

停止处理日志队列的线程

返回

停止结果, result.code: ‘00000’-成功, ‘21402’-服务停止失败-服务已关闭,

’29999’-其他系统失败

返回类型

CResult

class HiveNetCore.logging_hivenet.SimpleLogFilter(name='')[源代码]

基类:Filter

增加Filter用于处理自定义的日志参数

filter(record)[源代码]

重载过滤器, 进行函数名和文件名的替换, 以及固定输入时间的替换