ydf0509 / nb_log

pip install nb_log 各种日志handler和自动转化项目的任意print的效果。日志自动彩色炫酷,可点击控制台的日志自动精确跳转到pycharm的文件和行号。文件日志多进程切割安全。在10个最重要方面全方位超过loguru
378 stars 72 forks source link

LOG_PATH, 修改优先度问题 #12

Closed CNDrwei closed 2 years ago

CNDrwei commented 2 years ago

image.png

CNDrwei commented 2 years ago

设置log_path 的优先度是什么呢,

ydf0509 commented 2 years ago

代码的get_logger函数的入参优先,函数不设置入参就会按照你的项目的nb_log_config.py的配置。

CNDrwei commented 2 years ago

get_logger函数的入参优先, 那要是用LogManager生成的logger呢, 好像不会优先

ydf0509 commented 2 years ago

这个我测了,是按照函数写得路径优先,不信你直接写死一个文件夹,然后看生成没有就知道

ydf0509 commented 2 years ago
from nb_log import get_logger

logger_a = get_logger('a',log_filename='ax.log',log_path='./log_files')
logger_a.info("嘻嘻a")

你自己测试就知道了,会自动创建文件夹log_files,并且写入ax.log

CNDrwei commented 2 years ago

那就是用get_logger 取代LogManager , LogManager写成绝对路径好像是可以的, 但是用pathlib 弄出来的路径(图里) 就不太行

ydf0509 commented 2 years ago

和LogManager类还是使用get_logger函数,没有关系

from nb_log import get_logger,LogManager

# logger_a = get_logger('a',log_filename='ax.log',log_path='./log_files')
logger_a = LogManager('a').get_logger_and_add_handlers(log_filename='ax2.log',log_path='./log_files')
logger_a.info("嘻嘻a")

使用LogManager类这样也可以自动创建文件夹和文件。

ydf0509 commented 2 years ago

那就是用get_logger 取代LogManager , LogManager写成绝对路径好像是可以的, 但是用pathlib 弄出来的路径(图里) 就不太行

吧那个路径print出来就知道了

CNDrwei commented 2 years ago

from nb_log import get_logger,LogManager

logger_a = get_logger('a',log_filename='ax.log',log_path='./log_files')

logger_a = LogManager('a').get_logger_and_add_handlers(log_filename='ax2.log',log_path='./log_files') logger_a.info("嘻嘻a")

你这个logger import 到其他的py文件 好像不能生成log_files文件夹, 你import 到另外的py文件在__main下面执行, 好像也进不了日志,

CNDrwei commented 2 years ago

但是用nb_log_config 里面的LOG_PATH 就是能import出去, 且日志输出和写文件也是可以的

ydf0509 commented 2 years ago

你说的这个是相对路径和绝对路径问题,./是相对路径,相对路径当然不可靠,我只是演示函数入参能优先生效。 相对路径和绝对路径问题是python经典通用问题,和nb_log没关系。

如果你想以任何项目深层级的py文件作为运行起点,但是生成日志的位置不变,要用绝对路径。 我推荐绝对路径不是直接代码写死路径,而是基于代码的file为基点,生成一个绝对路径。 from pathlib import Path print((Path(file).parent.parent) / Path('pylogs')) 这个值是唯一的,不管是任何层级的导入文件导入这个值,都是不变的。

这个是python通用问题你没掌握或者碰过坑。与nb_log无关。

(Path(file).parent.parent.parent) / Path('pylogs') 是最强硬最稳固的方式,永久不变。

ydf0509 commented 2 years ago

./代表相对路径这个是常识啊,linux win都是 ./代表当前文件夹,当前什么叫当前要好好品味,当前不是基于写了代码的那个脚本为当前,你的python运行起点文件所在的文件夹才是当前。

例如你的项目目录是: proj/run.py proj/a/b/c.py 如果你直接运行c,py文件,c.py的当前文件夹是b文件夹。 如果你运行run.py,c.py get_cwd并不是b文件夹,而是proj文件夹。 你自己先建个项目目录,用不同文件夹层级的py作为运行起点,代码里面print相对路径测试就知道了,这个和nb_log毫无关系。

例如c.py里面写的是基于file的绝对路径,那么就会永久不变,无视什么文件夹层级作为python项目的运行起点。 from pathlib import Path print((Path(file).parent.parent.parent.absolute()) / Path('pylogs'))

你怎么老是喜欢相对路径?

ydf0509 commented 2 years ago

python代码里面相对路径以后就别用了,不管是不是用nb_log,都不要在python里面用相对路径了。

除非你的代码用就是唯一运行起点,例如项目有个run.py,然后别的文件夹的模块从来不会作为代码运行起点直接运行,这种情况下你才能用相对路径。如果你的项目run.py文件夹以外的还有多个py文件,并且可以作为项目的运行起点,那就别用相对路径了,坑人。

相对路径这个相对你要细品,当前不是说基于有get_cwd代码的那个py文件来获取当前,而是基于你敲击命令时候的所在文件夹作为当前文件夹。不同的位置启动python,get_cwd得到的值不是一样的。例如上面这个目录结构,你以为c.py的当前目录永远是b文件夹呢,这是错误的。

ydf0509 commented 2 years ago

file ,github显示不了, 是杠杆file杠杆,不是file,是前后有两个下划线 image

ydf0509 commented 2 years ago

例如django_setting.py 里面获取项目根目录的代码例子。别人也是推荐是 file 为基点获取绝对路径,这样你在任何文件夹层级的模块导入setting模块,这个base_dir的值是永久唯一不变的。可以把任何深层级python的文件作为运行起点,虽然django项目很规范一般只有唯一的启动web入口。

image