首页 > 编程知识 正文

show logging命令详解,log4j配置文件详解

时间:2023-05-03 16:10:09 阅读:139716 作者:3423

带记录颜色配置文件

方法:定制Logger类,只能实现自己实例化Logger类的log输出颜色

import os

导入日志

来自日志导入格式器

来自类型导入单元

# logging.StreamHandler将日志消息发送到std.out、std.err或任何file-like对象。

# logging.FileHandler将日志消息发送到磁盘文件。 默认情况下,文件大小会无限增加

# logging.handlers.rotating filehandler将日志消息发送到磁盘文件,并支持按大小剪切日志文件

# logging.handlers.timedrotatingfilehandler将日志消息发送到磁盘文件,并支持日志文件按时间断开连接

# logging.handlers.HTTPHandler将日志消息作为GET或POST发送到HTTP服务器

# logging.handlers.SMTPHandler将日志消息发送到指定的电子邮件地址

# logging.NullHandler,此Handler实例将忽略错误消息。

#通常用于希望使用logging的library开发人员,以避免“nohandlerscouldbefoundforloggerxxx”信息的出现。

LOGGING_CONFIG={

版本: 1、

' disable _ existing _ loggers ' : false,

“incremental”:假,

' formatters': {

“标准”: {

' class': 'logging.Formatter ',

' format ' : ' % [ asctime ] s [ % [ thread name ] s ] [ % [ name ] s ] [ % [ levelname ] s ] % [ filename ] s [ line 3360 ]

' datefmt ' : ' % y-% m-% d % h : % m : % s '

}

(,

' filters': {},

' handlers': {

' console': {

' class ' : ' logging.stream handler ',

' level': 'DEBUG ',

格式:标准,

(,

' root': {

' level': 'DEBUG ',

' class ' : ' logging.handlers.timedrotatingfilehandler ',

格式:标准,

' filename':OS.path.join '、' logs/'、' root.log '、

' interval': 1,

' when': 'D ',

' backupCount': 999,

' encoding': 'utf-8 ',

(,

' oprsapi': {

' level': 'DEBUG ',

' class ' : ' logging.handlers.timedrotatingfilehandler ',

格式:标准,

' filename':OS.path.join '、' logs/'、' oprsapi.log '、

' interval': 1,

' when': 'D ',

' backupCount': 999,

' encoding': 'utf-8 ',

(,

' db': {

' level': 'DEBUG ',

' class ' : ' logging.handlers.timedrotatingfilehandler ',

格式:标准,

' filename ' : OS.path.join (' logs/',' db.log )、

' interval': 1,

' when': 'D ',

' backupCount': 999,

' encoding': 'utf-8 ',

(,

(,

' loggers': {

' ' : {

' handlers': ['console ',' root'],

' level': 'DEBUG ',

属性:真

>

},

'oprsapi': {

'handlers': ['oprsapi'],

'level': 'DEBUG',

'propagate': True

},

'db_client': {

'handlers': ['db'],

'level': 'DEBUG',

'propagate': True

},

'tortoise': {

'handlers': ['db'],

'level': 'DEBUG',

'propagate': True

}

}

}

class ExtLogger:

"""扩展logger类, 添加"""

def __init__(self, full_name):

self.lg = logging.getLogger(full_name)

def debug(self, msg: str, tag: str = ""):

msg = f'[ext_{tag}] {msg}'

self.lg.debug(msg)

def info(self, msg: str, tag: str = ""):

msg = f'[ext_{tag}] {msg}'

self.lg.info(msg)

def warning(self, msg: str, tag: str = ""):

msg = f'[ext_{tag}] {msg}'

self.lg.warning(msg)

def error(self, msg: str, tag: str = ""):

msg = f'[ext_{tag}] {msg}'

self.lg.error(msg)

def critical(self, msg: str, tag: str = ""):

msg = f'[ext_{tag}] {msg}'

self.lg.critical(msg)

def get_extlogger(name, prefix: str = "oprsapi") -> ExtLogger:

logging.config.dictConfig(LOGGING_CONFIG)

full_name = '%s.%s' % (prefix, name)

logger = ExtLogger(full_name)

return logger

方法二: 重写 Formater类, 影响进程下所有logging输出

import os

import logging

from logging import Formatter

# logging.StreamHandler将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。

# logging.FileHandler将日志消息发送到磁盘文件,默认情况下文件大小会无限增长

# logging.handlers.RotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按大小切割

# logging.hanlders.TimedRotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按时间切割

# logging.handlers.HTTPHandler将日志消息以GET或POST的方式发送给一个HTTP服务器

# logging.handlers.SMTPHandler将日志消息发送给一个指定的email地址

# logging.NullHandler该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现。

LOGGING_CONFIG = {

'version': 1,

'disable_existing_loggers': False,

'incremental': False,

'formatters': {

'standard': {

# 'class': 'logging.Formatter',

#改用自己的Formater类

'class': 'utils.extlogging.CustomFormatter',

'format': '%(asctime)s [%(threadName)s] [%(name)s] [%(levelname)s] %(filename)s[line:%(lineno)d] %(message)s',

'datefmt': '%Y-%m-%d %H:%M:%S'

}

},

'filters': {},

'handlers': {

'console': {

'class': 'logging.StreamHandler',

'level': 'DEBUG',

'formatter': 'standard',

},

'root': {

'level': 'DEBUG',

'class': 'logging.handlers.TimedRotatingFileHandler',

'formatter': 'standard',

'filename': os.path.join('logs/', 'root.log'),

'interval': 1,

'when': 'D',

'backupCount': 999,

'encoding': 'utf-8',

},

'oprsapi': {

'level': 'DEBUG',

'class': 'logging.handlers.TimedRotatingFileHandler',

'formatter': 'standard',

'filename': os.path.join('logs/', 'oprsapi.log'),

'interval': 1,

'when': 'D',

'backupCount': 999,

'encoding': 'utf-8',

},

'db': {

'level': 'DEBUG',

'class': 'logging.handlers.TimedRotatingFileHandler',

'formatter': 'standard',

'filename': os.path.join('logs/', 'db.log'),

'interval': 1,

'when': 'D',

'backupCount': 999,

'encoding': 'utf-8',

},

},

'loggers': {

'': {

'handlers': ['console', 'root'],

'level': 'DEBUG',

'propagate': True

},

'oprsapi': {

'handlers': ['oprsapi'],

'level': 'DEBUG',

'propagate': True

},

'db_client': {

'handlers': ['db'],

'level': 'DEBUG',

'propagate': True

},

'tortoise': {

'handlers': ['db'],

'level': 'DEBUG',

'propagate': True

}

}

}

def get_logger(name, prefix: str = 'oprsapi') -> logging.Logger:

logging.config.dictConfig(LOGGING_CONFIG)

full_name = '%s.%s' % (prefix, name)

logger = logging.getLogger(full_name)

return logger

class CustomFormatter(Formatter):

"""

自定义format, 为日志加上颜色输出

"""

def __init__(self, fmt=None, datefmt=None, style='%'):

self.default_color = "{0}"

self.level_color = {

'DEBUG': "33[0;34;40m{0}33[0m",

'INFO': "33[0;32;40m{0}33[0m",

'WARN': "33[0;33;40m{0}33[0m",

'ERROR': "33[0;31;40m{0}33[0m",

'CRITICAL': "33[0;31;43m{0}33[0m"

}

super().__init__(fmt, datefmt, style)

def format(self, record):

"""

自定义format, 为日志加上颜色输出

"""

record.message = record.getMessage()

if self.usesTime():

record.asctime = self.formatTime(record, self.datefmt)

s = self.formatMessage(record)

if record.exc_info:

# Cache the traceback text to avoid converting it multiple times

# (it's constant anyway)

if not record.exc_text:

record.exc_text = self.formatException(record.exc_info)

if record.exc_text:

if s[-1:] != "n":

s = s + "n"

s = s + record.exc_text

if record.stack_info:

if s[-1:] != "n":

s = s + "n"

s = s + self.formatStack(record.stack_info)

# 加颜色

s = self.level_color.get(record.levelname, self.default_color).format(s)

return s

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。