通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python中如何把写日志

python中如何把写日志

在Python中,可以使用logging模块写日志、记录错误信息、调试代码和跟踪程序的执行。其中,logging模块提供了丰富的功能,例如设置日志的等级、格式化日志信息、将日志写入文件等。通过logging模块,可以轻松地管理和记录程序的运行情况,从而提高调试和维护代码的效率。

详细描述:logging模块中最常用的功能之一就是设置日志的等级。日志等级可以帮助我们过滤掉不需要的日志信息,只保留重要的日志。logging模块提供了五个标准的日志等级:DEBUG、INFO、WARNING、ERROR、CRITICAL。我们可以根据需要设置日志的等级,例如只记录WARNING及以上等级的日志。除此之外,还可以自定义日志格式,添加时间戳、日志等级、消息等信息,使日志信息更加清晰易读。

一、引入logging模块

在Python中,logging模块是内置的,因此无需安装任何额外的库。只需在代码中引入logging模块即可。

import logging

二、基本配置

logging模块提供了一个简单的配置函数basicConfig,可以通过它来设置日志的基本配置。例如,我们可以设置日志的等级、日志格式和日志输出位置。

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

在上面的代码中,我们将日志等级设置为DEBUG,这意味着将记录所有等级的日志信息。日志格式中包含时间戳、日志等级和消息内容。

三、日志等级

logging模块提供了五个标准的日志等级,从低到高分别是:DEBUG、INFO、WARNING、ERROR、CRITICAL。我们可以根据需要选择合适的日志等级。

  • DEBUG:详细的信息,多用于调试
  • INFO:确认程序正常运行的信息
  • WARNING:警告信息,表示可能出现问题
  • ERROR:错误信息,表示程序出错
  • CRITICAL:严重错误,表示程序可能无法继续运行

我们可以通过调用相应的函数来记录不同等级的日志信息,例如:

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')

四、将日志写入文件

logging模块允许将日志信息输出到文件中,而不仅仅是输出到控制台。可以通过在basicConfig函数中指定filename参数来设置日志文件的路径。

logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

这样,所有的日志信息将被写入app.log文件中。

五、日志格式

logging模块允许我们自定义日志格式,使日志信息更加清晰易读。可以通过format参数来设置日志格式。常用的格式化字符串包括:

  • %(asctime)s:日志事件发生的时间
  • %(levelname)s:日志等级
  • %(message)s:日志消息
  • %(filename)s:调用日志记录函数的源文件名
  • %(lineno)d:调用日志记录函数的行号

例如,我们可以设置一个包含时间戳、日志等级、源文件名和行号的日志格式:

logging.basicConfig(format='%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

六、日志处理器

logging模块中有多个日志处理器(Handler),用于将日志信息输出到不同的目的地。例如,StreamHandler可以将日志信息输出到控制台,FileHandler可以将日志信息写入文件。我们可以根据需要添加不同的日志处理器。

import logging

创建一个日志器

logger = logging.getLogger('example_logger')

logger.setLevel(logging.DEBUG)

创建一个控制台处理器

console_handler = logging.StreamHandler()

console_handler.setLevel(logging.DEBUG)

创建一个文件处理器

file_handler = logging.FileHandler('example.log')

file_handler.setLevel(logging.DEBUG)

创建一个日志格式

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

设置处理器的日志格式

console_handler.setFormatter(formatter)

file_handler.setFormatter(formatter)

将处理器添加到日志器

logger.addHandler(console_handler)

logger.addHandler(file_handler)

记录日志

logger.debug('This is a debug message')

logger.info('This is an info message')

logger.warning('This is a warning message')

logger.error('This is an error message')

logger.critical('This is a critical message')

在上面的代码中,我们创建了一个日志器(logger),并为其添加了两个处理器(console_handler和file_handler)。控制台处理器将日志信息输出到控制台,文件处理器将日志信息写入example.log文件。我们还为每个处理器设置了相同的日志格式。最后,我们使用logger记录了不同等级的日志信息。

七、日志过滤器

logging模块中提供了日志过滤器(Filter),可以用于根据特定条件过滤日志信息。我们可以自定义一个日志过滤器类,并将其添加到日志器或处理器中。

import logging

class MyFilter(logging.Filter):

def filter(self, record):

return 'special' in record.msg

创建一个日志器

logger = logging.getLogger('example_logger')

logger.setLevel(logging.DEBUG)

创建一个控制台处理器

console_handler = logging.StreamHandler()

console_handler.setLevel(logging.DEBUG)

创建一个日志格式

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

console_handler.setFormatter(formatter)

创建一个日志过滤器

filter = MyFilter()

将过滤器添加到控制台处理器

console_handler.addFilter(filter)

将处理器添加到日志器

logger.addHandler(console_handler)

记录日志

logger.debug('This is a debug message')

logger.info('This is an info message')

logger.warning('This is a special warning message')

logger.error('This is a special error message')

logger.critical('This is a critical message')

在上面的代码中,我们定义了一个日志过滤器类MyFilter,该过滤器只允许包含“special”字符串的日志信息通过。然后,我们将过滤器添加到控制台处理器中。最后,我们使用logger记录了不同等级的日志信息,但只有包含“special”字符串的日志信息被输出。

八、日志轮转

在实际应用中,日志文件可能会变得非常大,影响性能。为了避免这种情况,可以使用日志轮转(Log Rotation)功能,将日志文件分割成多个较小的文件。logging模块提供了两个日志轮转处理器:RotatingFileHandler和TimedRotatingFileHandler。

1、RotatingFileHandler

RotatingFileHandler根据日志文件的大小进行轮转。当日志文件达到指定的大小时,会创建一个新的日志文件。

import logging

from logging.handlers import RotatingFileHandler

创建一个日志器

logger = logging.getLogger('example_logger')

logger.setLevel(logging.DEBUG)

创建一个轮转文件处理器

file_handler = RotatingFileHandler('example.log', maxBytes=1024, backupCount=3)

file_handler.setLevel(logging.DEBUG)

创建一个日志格式

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

file_handler.setFormatter(formatter)

将处理器添加到日志器

logger.addHandler(file_handler)

记录日志

for i in range(100):

logger.debug('This is a debug message %d' % i)

在上面的代码中,我们创建了一个RotatingFileHandler,并指定了日志文件的最大大小为1024字节,备份日志文件的数量为3。当日志文件达到1024字节时,会创建一个新的日志文件,并保留最多3个备份日志文件。

2、TimedRotatingFileHandler

TimedRotatingFileHandler根据时间间隔进行轮转。例如,可以每隔一天创建一个新的日志文件。

import logging

from logging.handlers import TimedRotatingFileHandler

创建一个日志器

logger = logging.getLogger('example_logger')

logger.setLevel(logging.DEBUG)

创建一个定时轮转文件处理器

file_handler = TimedRotatingFileHandler('example.log', when='midnight', interval=1, backupCount=7)

file_handler.setLevel(logging.DEBUG)

创建一个日志格式

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

file_handler.setFormatter(formatter)

将处理器添加到日志器

logger.addHandler(file_handler)

记录日志

for i in range(100):

logger.debug('This is a debug message %d' % i)

在上面的代码中,我们创建了一个TimedRotatingFileHandler,并指定了日志文件的轮转时间间隔为一天(when='midnight', interval=1),备份日志文件的数量为7。这样,每天午夜会创建一个新的日志文件,并保留最多7个备份日志文件。

九、日志记录异常信息

在实际应用中,捕获和记录异常信息对于调试和维护代码至关重要。logging模块提供了记录异常信息的方法。

import logging

创建一个日志器

logger = logging.getLogger('example_logger')

logger.setLevel(logging.DEBUG)

创建一个控制台处理器

console_handler = logging.StreamHandler()

console_handler.setLevel(logging.DEBUG)

创建一个日志格式

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

console_handler.setFormatter(formatter)

将处理器添加到日志器

logger.addHandler(console_handler)

记录异常信息

try:

1 / 0

except ZeroDivisionError:

logger.exception('An exception occurred')

在上面的代码中,我们使用logger.exception方法记录了一个异常信息。当捕获到ZeroDivisionError异常时,日志器会记录异常的详细信息,包括异常类型和堆栈跟踪信息。

十、日志记录到多个文件

有时,我们可能需要将不同等级的日志信息记录到不同的文件中。可以通过为每个日志等级创建单独的文件处理器来实现这一点。

import logging

创建一个日志器

logger = logging.getLogger('example_logger')

logger.setLevel(logging.DEBUG)

创建一个DEBUG级别的文件处理器

debug_handler = logging.FileHandler('debug.log')

debug_handler.setLevel(logging.DEBUG)

debug_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

debug_handler.setFormatter(debug_formatter)

创建一个ERROR级别的文件处理器

error_handler = logging.FileHandler('error.log')

error_handler.setLevel(logging.ERROR)

error_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

error_handler.setFormatter(error_formatter)

将处理器添加到日志器

logger.addHandler(debug_handler)

logger.addHandler(error_handler)

记录日志

logger.debug('This is a debug message')

logger.info('This is an info message')

logger.warning('This is a warning message')

logger.error('This is an error message')

logger.critical('This is a critical message')

在上面的代码中,我们创建了两个文件处理器,一个用于记录DEBUG级别的日志信息,另一个用于记录ERROR级别及以上的日志信息。这样,不同等级的日志信息将被记录到不同的文件中。

十一、日志记录到远程服务器

有时,我们可能需要将日志信息发送到远程服务器进行集中管理。logging模块提供了SocketHandler和HTTPHandler,可以将日志信息发送到远程服务器。

1、SocketHandler

SocketHandler通过TCP/IP协议将日志信息发送到远程服务器。

import logging

import logging.handlers

创建一个日志器

logger = logging.getLogger('example_logger')

logger.setLevel(logging.DEBUG)

创建一个Socket处理器

socket_handler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT)

socket_handler.setLevel(logging.DEBUG)

创建一个日志格式

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

socket_handler.setFormatter(formatter)

将处理器添加到日志器

logger.addHandler(socket_handler)

记录日志

logger.debug('This is a debug message')

logger.info('This is an info message')

logger.warning('This is a warning message')

logger.error('This is an error message')

logger.critical('This is a critical message')

在上面的代码中,我们创建了一个SocketHandler,并指定了远程服务器的地址和端口。然后,我们将处理器添加到日志器中。日志信息将通过TCP/IP协议发送到远程服务器。

2、HTTPHandler

HTTPHandler通过HTTP协议将日志信息发送到远程服务器。

import logging

import logging.handlers

创建一个日志器

logger = logging.getLogger('example_logger')

logger.setLevel(logging.DEBUG)

创建一个HTTP处理器

http_handler = logging.handlers.HTTPHandler('localhost:8000', '/log', method='POST')

http_handler.setLevel(logging.DEBUG)

创建一个日志格式

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

http_handler.setFormatter(formatter)

将处理器添加到日志器

logger.addHandler(http_handler)

记录日志

logger.debug('This is a debug message')

logger.info('This is an info message')

logger.warning('This is a warning message')

logger.error('This is an error message')

logger.critical('This is a critical message')

在上面的代码中,我们创建了一个HTTPHandler,并指定了远程服务器的地址、路径和请求方法。然后,我们将处理器添加到日志器中。日志信息将通过HTTP协议发送到远程服务器。

十二、日志配置文件

logging模块允许通过配置文件来设置日志配置。配置文件可以是INI格式或字典格式。通过配置文件,我们可以更灵活地管理日志配置,而无需修改代码。

1、INI格式配置文件

首先,创建一个INI格式的配置文件logging.ini:

[loggers]

keys=root,example_logger

[handlers]

keys=consoleHandler,fileHandler

[formatters]

keys=exampleFormatter

[logger_root]

level=DEBUG

handlers=consoleHandler

[logger_example_logger]

level=DEBUG

handlers=consoleHandler,fileHandler

qualname=example_logger

propagate=0

[handler_consoleHandler]

class=StreamHandler

level=DEBUG

formatter=exampleFormatter

args=(sys.stdout,)

[handler_fileHandler]

class=FileHandler

level=DEBUG

formatter=exampleFormatter

args=('example.log', 'a')

[formatter_exampleFormatter]

format=%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s

datefmt=

然后,在代码中加载配置文件:

import logging

import logging.config

import sys

加载配置文件

logging.config.fileConfig('logging.ini')

获取日志器

logger = logging.getLogger('example_logger')

记录日志

logger.debug('This is a debug message')

logger.info('This is an info message')

logger.warning('This is a warning message')

logger.error('This is an error message')

logger.critical('This is a critical message')

在上面的代码中,我们使用logging.config.fileConfig函数加载了INI格式的配置文件,并获取了名为example_logger的日志器。然后,我们使用该日志器记录了不同等级的日志信息。

2、字典格式配置文件

首先,创建一个字典格式的配置文件logging_config.py:

LOGGING_CONFIG = {

'version': 1,

'disable_existing_loggers': False,

'formatters': {

'exampleFormatter': {

'format': '%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'

},

},

'handlers': {

'consoleHandler': {

'class': 'logging.StreamHandler',

'level': 'DEBUG',

'formatter': 'exampleFormatter',

'stream': 'ext://sys.stdout',

},

'fileHandler': {

'class': 'logging.FileHandler',

'level': 'DEBUG',

'formatter': 'exampleFormatter',

'filename': 'example.log',

},

},

'loggers': {

'example_logger': {

'level': 'DEBUG',

'handlers': ['consoleHandler', 'fileHandler'],

'propagate': False,

},

},

}

然后,在代码中加载配置文件:

import logging

import logging.config

from logging_config import LOGGING_CONFIG

加载配置文件

logging.config.dictConfig(LOGGING_CONFIG)

获取日志器

logger = logging.getLogger('example_logger')

记录日志

logger.debug('This is a debug message')

logger.info('This is an info message')

logger.warning('This is a warning message')

logger.error('This is an error message')

logger.

相关问答FAQs:

在Python中使用哪个库进行日志记录最为推荐?
Python标准库中的logging模块是进行日志记录的首选。它功能强大,能够满足大多数日志需求,包括记录不同级别的日志(如DEBUG、INFO、WARNING、ERROR和CRITICAL),并且可以将日志输出到不同的地方,如控制台、文件或远程服务器。

如何设置日志级别和格式?
可以通过配置logging.basicConfig()函数来设置日志级别和格式。例如,设置日志格式为“时间 – 日志级别 – 消息”可以这样实现:

import logging

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

这样,所有级别为DEBUG及以上的日志信息都会被记录,并且输出格式会遵循设定的样式。

如何将日志输出到文件而不是控制台?
要将日志信息输出到文件,可以在basicConfig()中指定filename参数。示例如下:

import logging

logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

这段代码会将所有INFO及以上级别的日志记录到名为app.log的文件中,而不再输出到控制台。

相关文章