一般在写完代码的时候,除了在控制台打印日志以外,还会想要生成一个log日志文件用于备份,那么直接加上以下这段代码即可,日志文件命名中包含精确的时间信息,因此同一时间段多次运行同一段代码也不会出现日志覆盖的问题。如果没有logs文件夹的话会自动生成,不必考虑任何报错问题。
1、代码实例(直接可用)
import os
import datetime
import logging
def print_and_log(string):
print(string)
logging.info(string)
if __name__ == '__main__':
py_path = os.path.basename(__file__).split('.')[0]
os.makedirs('logs/', exist_ok=True)
log_file = 'logs/' + os.path.basename(os.getcwd()) + '_' + py_path + '_' + str(
datetime.datetime.now()).replace(':', '').replace(' ', '_') + '.txt'
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(filename)s %(levelname)s: %(message)s',
filename=log_file,
filemode='w'
)
print_and_log("测试日志")
运行结果:
生成的日志内容:
2、日志文件名解析
FlaskOA_test_code_2024-07-14_125854.911996.txt
FlaskOA 指的是你当前的项目名(这个其实可有可无,个人使用的时候可以去掉这部分);
test_code 指的是你当前执行的 python 文件名;
2024-07-14 就是执行当前代码时的日期;
125854 指的是执行当前代码时的时分秒;
123456 这部分是执行当前代码时的微秒数(1秒=1百万微秒);
3、代码解析版
import os
import datetime
import logging
# 控制台打印的同时,日志文件也记录下日志内容(此处可根据需求自己设置)
def print_and_log(string):
print(string)
logging.info(string)
if __name__ == '__main__':
'''
__file__:指的是当前正在执行的 python 文件的完整路径;
os.path.basename('path1/path2'):获取一个路径中的最小级别的目录或文件名,即“path2”;
os.path.basename(__file__):获取当前正在执行的 python 文件名;
os.path.basename(__file__).split('.')[0]:由于获取到的文件名后面带有'.py',所以用split函数获取.号前面的文件名内容
'''
py_path = os.path.basename(__file__).split('.')[0]
os.makedirs('logs/', exist_ok=True)
'''
os.getcwd():获取当前的项目路径;
os.path.basename(os.getcwd()):就是指获取当前项目名称;
str(datetime.datetime.now()).replace(':', '').replace(' ', '_'):
由于文件名不可以有分号:,所以将分号去掉了,空格的地方则替换为下划线_
'''
log_file = 'logs/' + os.path.basename(os.getcwd()) + '_' + py_path + '_' + str(
datetime.datetime.now()).replace(':', '').replace(' ', '_') + '.txt'
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(filename)s %(levelname)s: %(message)s',
filename=log_file,
filemode='w'
)
print_and_log("测试日志")