只记录log,不同步打印到控制台
import logging
import os
from datetime import datetime# 获取当前日期
date = datetime.now().strftime('%Y-%m-%d')# 获取当前文件的目录
current_path = os.path.dirname(os.path.abspath(__file__))
log_path = os.path.join(current_path, 'log')# 如果log文件夹不存在,创建它
if not os.path.exists(log_path):os.makedirs(log_path)# 设置日志文件的路径
log_file = os.path.join(log_path, f'console_{date}.log')# 配置日志设置
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',filename=log_file)logger = logging.getLogger(__name__)
logger.info('This is a log info')
在这个例子中,我们首先使用datetime.now().strftime('%Y-%m-%d')
获取了当前日期,并将其格式化为YYYY-MM-DD
的形式。然后我们将这个日期字符串用来命名我们的日志文件。其他部分与前一个示例类似,我们创建了日志文件所在的文件夹,并配置了日志的设置。
如果出现下面错误:
AttributeError: module ‘datetime’ has no attribute ‘now’
原因:这是因为datetime
既是Python标准库中的一个模块,也是该模块中的一个类。你需要先引用模块,然后再引用类。然而你import时用的是import datetime
,不是from datetime import datetim
如果还不行的话,可能是你的Python环境中有一个名为datetime
的其他模块或者变量,这导致了命名冲突。你可以尝试使用import datetime
,然后用datetime.datetime.now()
来获取当前日期。
下面是两种引用方式
from datetime import datetime
date = datetime.now().strftime('%Y-%m-%d')
import datetime
date = datetime.datetime.now().strftime('%Y-%m-%d')
记录log,并同步打印到控制台
import logging
import os
from datetime import datetime# 获取当前日期
date = datetime.now().strftime('%Y-%m-%d')# 获取当前文件的目录
current_path = os.path.dirname(os.path.abspath(__file__))
log_path = os.path.join(current_path, 'log')# 如果log文件夹不存在,创建它
if not os.path.exists(log_path):os.makedirs(log_path)# 设置日志文件的路径
log_file = os.path.join(log_path, f'console_{date}.log')# 创建一个logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)# 创建一个handler,用于写入日志文件
fh = logging.FileHandler(log_file)
fh.setLevel(logging.INFO)# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)# 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)# 记录一条日志
logger.info('This is a log info')
在这个示例中,我们首先创建了一个logger
,然后创建了两个handler
:一个FileHandler
用于写入日志文件,一个StreamHandler
用于输出到控制台。我们为这两个handler
设置了相同的日志级别和格式,然后将它们添加到了logger
。最后,我们使用logger.info()
记录了一条日志,这条日志将同时输出到日志文件和控制台。
同时记录到控制台和日志,对性能影响多大?
在大多数情况下,同时记录日志到控制台和文件对性能的影响是可以接受的。
日志系统的性能开销主要取决于三个因素:
日志级别:日志系统只会记录日志级别大于或等于其当前级别的消息。例如,如果将日志级别设置为INFO,那么DEBUG级别的日志消息将不会被记录。因此,可以通过调整日志级别来控制日志系统的性能开销。
日志量:如果每秒产生大量的日志消息,那么日志系统的性能开销可能会变得很大。在这种情况下,可能需要对日志消息进行采样,或者只记录关键的日志消息。
日志处理器的性能:不同的日志处理器可能会有不同的性能开销。例如,将日志消息写入磁盘通常比写入网络或数据库要快。
总的来说,如果你的应用程序不是在大量生成日志,那么同时记录到控制台和日志文件的性能影响应该是可以忽略不计的。如果你发现日志系统的性能开销过大,那么你应该考虑调整日志级别,减少日志量,或者优化你的日志处理器配置。
log相关类型
Python的logging
模块提供了以下几种日志级别:
DEBUG
: 最详细的日志信息,典型应用场景是问题诊断。
INFO
: 稍微详细一点的信息,确认程序按预期运行。
WARNING
: 表示有些意外,或者不久的将来可能出现的问题(例如:‘磁盘空间不足’)。程序还是会按预期运行。
ERROR
: 更严重的问题,程序没能执行某些功能。
CRITICAL
: 非常严重的问题,程序本身可能无法继续运行。
以上级别从低到高,数字级别依次为10,20,30,40,50,级别越高,越严重。默认的级别是WARNING
,意味着只有事件的级别等于或高于WARNING
才会被追踪,记录。
你可以使用以下的方法来在不同的级别记录消息:
logger.debug(message, *args, **kwargs)
logger.info(message, *args, **kwargs)
logger.warning(message, *args, **kwargs)
logger.error(message, *args, **kwargs)
logger.critical(message, *args, **kwargs)
另外,还有一个方法是logger.exception(message, *args, **kwargs)
,这个方法创建一个类似于logger.error
的日志消息,同时将当前的异常信息添加到日志消息中。这个方法应该只在异常处理程序中调用。