Python Logging

# log.py
import logging

logging.basicConfig(
    filename="log.log",
    format="%(asctime)s - %(filename)s - [line:%(lineno)d] - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
    level=logging.DEBUG,
)

logging.debug("debug message")
logging.info("info message")
logging.warning("warn message")
logging.error("error message")
logging.critical("critical message")

# log.py
import logging.handlers

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

info_handler = logging.handlers.RotatingFileHandler(
    filename="log/info.log",
    maxBytes=10485760,  # 10MB = 1024 * 1024 * 10
    backupCount=10,
)
error_handler = logging.handlers.RotatingFileHandler(
    filename="log/error.log",
    maxBytes=10485760,  # 10MB = 1024 * 1024 * 10
    backupCount=10,
)

info_handler.setLevel(logging.INFO)
error_handler.setLevel(logging.ERROR)

info_handler.addFilter(lambda record: record.levelno == logging.INFO)
error_handler.addFilter(lambda record: record.levelno == logging.ERROR)

formatter = logging.Formatter("%(asctime)s - %(filename)s - [line:%(lineno)d] - %(levelname)s - %(message)s", "%Y-%m-%d %H:%M:%S")
info_handler.setFormatter(formatter)
error_handler.setFormatter(formatter)

logger.addHandler(info_handler)
logger.addHandler(error_handler)

logger.debug("debug message")
logger.info("info message")
logger.warning("warn message")
logger.error("error message")
logger.critical("critical message")

# log.py
import logging.config

logging.config.fileConfig("logging.conf")
logger = logging.getLogger("logger")

logger.debug("debug message")
logger.info("info message")
logger.warning("warn message")
logger.error("error message")
logger.critical("critical message")
# logging.conf
[loggers]
keys=root,logger

[handlers]
keys=consoleHandler,infoHandler,errorHandler

[formatters]
keys=standardFormatter

[logger_root]
level=NOTSET
handlers=consoleHandler

[logger_logger]
level=DEBUG
handlers=infoHandler,errorHandler
propagate=0
qualname=logger

[handler_consoleHandler]
class=StreamHandler
level=NOTSET
formatter=standardFormatter
args=(sys.stdout,)

[handler_infoHandler]
class=handlers.RotatingFileHandler
level=INFO
formatter=standardFormatter
args=("log/info.log", "a", 10485760, 10)

[handler_errorHandler]
class=handlers.RotatingFileHandler
level=ERROR
formatter=standardFormatter
args=("log/error.log", "a", 10485760, 10)

[formatter_standardFormatter]
format=%(asctime)s - %(filename)s - [line:%(lineno)d] - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

# log.py
import logging.config

import yaml

with open("logging.yaml") as f:
    config = yaml.load(f, Loader=yaml.FullLoader)

logging.config.dictConfig(config)
logger = logging.getLogger("logger")

logger.debug("debug message")
logger.info("info message")
logger.warning("warn message")
logger.error("error message")
logger.critical("critical message")
# filters.py
import logging


class DebugFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.DEBUG


class InfoFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.INFO


class WarningFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.WARNING


class ErrorFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.ERROR


class CriticalFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.CRITICAL
# logging.yaml
version: 1
disable_existing_loggers: True

formatters:
  simple:
    format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
  standard:
    format: "%(asctime)s - %(filename)s - [line:%(lineno)d] - %(levelname)s - %(message)s"
    datefmt: "%Y-%m-%d %H:%M:%S"

filters:
  debug_filter:
    (): filters.DebugFilter
  info_filter:
    (): filters.InfoFilter
  warning_filter:
    (): filters.WarningFilter
  error_filter:
    (): filters.ErrorFilter
  critical_filter:
    (): filters.CriticalFilter

handlers:
  console:
    class: logging.StreamHandler
    level: NOTSET  # 0
    formatter: standard
    stream: ext://sys.stdout
  debug_handler:
    class: logging.handlers.RotatingFileHandler
    level: DEBUG  # 10
    filters: [ debug_filter ]
    formatter: standard
    filename: log/debug.log
    maxBytes: 10485760  # 10MB = 1024 * 1024 * 10
    backupCount: 10
    encoding: utf-8
  info_handler:
    class: logging.handlers.RotatingFileHandler
    level: INFO  # 20
    filters: [ info_filter ]
    formatter: standard
    filename: log/info.log
    maxBytes: 10485760  # 10MB = 1024 * 1024 * 10
    backupCount: 10
    encoding: utf-8
  warning_handler:
    class: logging.handlers.RotatingFileHandler
    level: WARNING  # 30
    filters: [ warning_filter ]
    formatter: standard
    filename: log/warning.log
    maxBytes: 10485760  # 10MB = 1024 * 1024 * 10
    backupCount: 10
    encoding: utf-8
  error_handler:
    class: logging.handlers.RotatingFileHandler
    level: ERROR  # 40
    filters: [ error_filter ]
    formatter: standard
    filename: log/error.log
    maxBytes: 10485760  # 10MB = 1024 * 1024 * 10
    backupCount: 10
    encoding: utf-8
  critical_handler:
    class: logging.handlers.RotatingFileHandler
    level: CRITICAL  # 50
    filters: [ critical_filter ]
    formatter: standard
    filename: log/critical.log
    maxBytes: 10485760  # 10MB = 1024 * 1024 * 10
    backupCount: 10
    encoding: utf-8

root:
  level: NOTSET
  handlers: [ console ]

loggers:
  logger:
    level: DEBUG
    handlers: [ debug_handler, info_handler, warning_handler, error_handler, critical_handler ]
    propagate: no

参考链接
https://docs.python.org/3/library/logging.html
https://gist.github.com/kingspp/9451566a5555fb022215ca2b7b802f19

Python logging模块是Python标准库中的一个模块,用于记录程序运行时的日志信息。它提供了一种简单的方法来记录代码的执行情况,以及任何可能会发生的错误或异常。Python logging模块可以将日志消息输出到控制台、文件、邮件等,同时还可以对日志进行级别、格式等的配置。 下面是一个简单的Python logging示例: ```python import logging # 配置日志级别和格式 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') # 输出不同级别的日志 logging.debug('This is a debug message') logging.info('This is an info message') logging.warning('This is a warning message') logging.error('This is an error message') logging.critical('This is a critical message') ``` 在这个示例中,我们首先配置了日志级别和格式,然后输出了不同级别的日志信息。日志级别从低到高依次为:DEBUG、INFO、WARNING、ERROR、CRITICAL。在这个示例中,我们将日志级别设置为DEBUG,因此所有级别的日志信息都会被输出。 输出结果如下: ``` 2021-10-28 10:10:10,123 - DEBUG - This is a debug message 2021-10-28 10:10:10,123 - INFO - This is an info message 2021-10-28 10:10:10,123 - WARNING - This is a warning message 2021-10-28 10:10:10,123 - ERROR - This is an error message 2021-10-28 10:10:10,123 - CRITICAL - This is a critical message ``` 从输出结果中,我们可以看到每条日志信息都包含了时间戳、日志级别和消息内容。这些信息可以帮助我们快速定位代码中的问题,以便进行调试和修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值