ydf0509 / nb_log

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

以后有可能支持时间切割吗 #14

Closed abcdehc closed 3 years ago

abcdehc commented 3 years ago

碰到的实际需求是每日切割。如果是担心过大,有没有可能优先大小切割,然后时间切割

ydf0509 commented 3 years ago

上上周就加了,一共支持4种filehandler,可以在get_logger入参时候写,也可以在你的项目根目录下的配置文件nb_log_config.py配置。

image

如果你之前已经用过nb_log,你需要做的是把nb_log升级到最新版本,把原来配置文件添加项,或者把配置文件删除,最新版的nb_log支持用户自己选择4种filehandler了。

abcdehc commented 3 years ago

上上周就加了,一共支持4种filehandler,可以在get_logger入参时候写,也可以在你的项目根目录下的配置文件nb_log_config.py配置。

image

如果你之前已经用过nb_log,你需要做的是把nb_log升级到最新版本,把原来配置文件添加项,或者把配置文件删除,最新版的nb_log支持用户自己选择4种filehandler了。

感谢答疑~我是今天通过pip安装的,在自动生成的nb_log_config.py文件内没有看到这个选项,另外在github这里的项目介绍内也没有看到对应说明。库很赞,不过我想可以的话最好有一个更清晰简略的使用说明

ydf0509 commented 3 years ago

image 写得很清楚,都是中文的入参。

abcdehc commented 3 years ago

这个截图出自哪个文件?

以下是我这里自动生成的nb_log_config.py文件的所有内容 `# coding=utf8 """ 此文件nb_log_config.py是自动生成到python项目的根目录的。 在这里面写的变量会覆盖此文件nb_log_config_default中的值。对nb_log包进行默认的配置。 但最终配置方式是由get_logger_and_add_handlers方法的各种传参决定,如果方法相应的传参为None则使用这里面的配置。 """

""" 如果反对日志有各种彩色,可以设置 DEFAULUT_USE_COLOR_HANDLER = False 如果反对日志有块状背景彩色,可以设置 DISPLAY_BACKGROUD_COLOR_IN_CONSOLE = False 如果想屏蔽nb_log包对怎么设置pycahrm的颜色的提示,可以设置 WARNING_PYCHARM_COLOR_SETINGS = False 如果想改变日志模板,可以设置 FORMATTER_KIND 参数,只带了7种模板,可以自定义添加喜欢的模板 LOG_PATH 配置文件日志的保存路径的文件夹。 """

noinspection PyUnresolvedReferences

import logging import os

noinspection PyUnresolvedReferences

from pathlib import Path # noqa import socket from pythonjsonlogger.jsonlogger import JsonFormatter

def get_host_ip(): ip = '' host_name = ''

noinspection PyBroadException

try:
    sc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sc.connect(('8.8.8.8', 80))
    ip = sc.getsockname()[0]
    host_name = socket.gethostname()
    sc.close()
except Exception:
    pass
return ip, host_name

computer_ip, computer_name = get_host_ip()

class JsonFormatterJumpAble(JsonFormatter): def add_fields(self, log_record, record, message_dict):

log_record['jump_click'] = f"""File '{record.dict.get('pathname')}', line {record.dict.get('lineno')}"""

    log_record[f"{record.__dict__.get('pathname')}:{record.__dict__.get('lineno')}"] = ''  # 加个能点击跳转的字段。
    log_record['ip'] = computer_ip
    log_record['host_name'] = computer_name
    super().add_fields(log_record, record, message_dict)
    if 'for_segmentation_color' in log_record:
        del log_record['for_segmentation_color']

DING_TALK_TOKEN = '3dd0eexxxxxadab014bd604XXXXXXXXXXXX' # 钉钉报警机器人

EMAIL_HOST = ('smtp.sohu.com', 465) EMAIL_FROMADDR = 'aaa0509@sohu.com' # 'matafyhotel-techl@matafy.com', EMAIL_TOADDRS = ('cccc.cheng@silknets.com', 'yan@dingtalk.com',) EMAIL_CREDENTIALS = ('aaa0509@sohu.com', 'abcdefg')

ELASTIC_HOST = '127.0.0.1' ELASTIC_PORT = 9200

KAFKA_BOOTSTRAP_SERVERS = ['192.168.199.202:9092'] ALWAYS_ADD_KAFKA_HANDLER_IN_TEST_ENVIRONENT = False

MONGO_URL = 'mongodb://myUserAdmin:mimamiama@127.0.0.1:27016/admin'

DEFAULUT_USE_COLOR_HANDLER = True # 是否默认使用有彩的日志。 DISPLAY_BACKGROUD_COLOR_IN_CONSOLE = True # 在控制台是否显示彩色块状的日志。为False则不使用大块的背景颜色。 AUTO_PATCH_PRINT = True # 是否自动打print的猴子补丁,如果打了猴子补丁,print自动变色和可点击跳转。 WARNING_PYCHARM_COLOR_SETINGS = True # 有的人很反感启动代码时候提示教你怎么优化pycahrm控制台颜色,可以把这里设置为False

DEFAULT_ADD_MULTIPROCESSING_SAFE_ROATING_FILE_HANDLER = False # 是否默认同时将日志记录到记log文件记事本中。 LOG_FILE_SIZE = 100 # 单位是M,每个文件的切片大小,超过多少后就自动切割 LOG_FILE_BACKUP_COUNT = 3 # 对同一个日志文件,默认最多备份几个文件,超过就删除了。

LOG_PATH = '/pythonlogs' # 默认的日志文件夹,如果不写明磁盘名,则是项目代码所在磁盘的根目录下的/pythonlogs

LOG_PATH = Path(file).absolute().parent / Path("pythonlogs") #这么配置就会自动在你项目的根目录下创建pythonlogs文件夹了并写入。

if os.name == 'posix': # linux非root用户和mac用户无法操作 /pythonlogs 文件夹,没有权限,默认修改为 home/[username] 下面了。例如你的linux用户名是 xiaomin,那么默认会创建并在 /home/xiaomin/pythonlogs文件夹下写入日志文件。 home_path = os.environ.get("HOME", '/') # 这个是获取linux系统的当前用户的主目录,不需要亲自设置 LOG_PATH = Path(home_path) / Path('pythonlogs') # linux mac 权限很严格,非root权限不能在/pythonlogs写入,修改一下默认值。

IS_USE_WATCHED_FILE_HANDLER_INSTEAD_OF_CUSTOM_CONCURRENT_ROTATING_FILE_HANDLER = False # 需要依靠外力lograte来切割日志,watchedfilehandler性能比此包自定义的日志切割handler写入文件速度慢很多。

LOG_LEVEL_FILTER = logging.DEBUG # 默认日志级别,低于此级别的日志不记录了。例如设置为INFO,那么logger.debug的不会记录,只会记录logger.info以上级别的。

RUN_ENV = 'test'

FORMATTER_DICT = { 1: logging.Formatter( '日志时间【%(asctime)s】 - 日志名称【%(name)s】 - 文件【%(filename)s】 - 第【%(lineno)d】行 - 日志等级【%(levelname)s】 - 日志信息【%(message)s】', "%Y-%m-%d %H:%M:%S"), 2: logging.Formatter( '%(asctime)s - %(name)s - %(filename)s - %(funcName)s - %(lineno)d - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"), 3: logging.Formatter( '%(asctime)s - %(name)s - 【 File "%(pathname)s", line %(lineno)d, in %(funcName)s 】 - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"), # 一个模仿traceback异常的可跳转到打印日志地方的模板 4: logging.Formatter( '%(asctime)s - %(name)s - "%(filename)s" - %(funcName)s - %(lineno)d - %(levelname)s - %(message)s - File "%(pathname)s", line %(lineno)d ', "%Y-%m-%d %H:%M:%S"), # 这个也支持日志跳转 5: logging.Formatter( '%(asctime)s - %(name)s - "%(pathname)s:%(lineno)d" - %(funcName)s - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"), # 我认为的最好的模板,推荐 6: logging.Formatter('%(name)s - %(asctime)-15s - %(filename)s - %(lineno)d - %(levelname)s: %(message)s', "%Y-%m-%d %H:%M:%S"), 7: logging.Formatter('%(asctime)s - %(name)s - "%(filename)s:%(lineno)d" - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"), # 一个只显示简短文件名和所处行数的日志模板

8: JsonFormatterJumpAble('%(asctime)s - %(name)s - %(levelname)s - %(message)s - "%(filename)s %(lineno)d -" ', "%Y-%m-%d %H:%M:%S", json_ensure_ascii=False),  # 这个是json日志,方便分析.

9: logging.Formatter(
    '[p%(process)d_t%(thread)d] %(asctime)s - %(name)s - "%(pathname)s:%(lineno)d" - %(funcName)s - %(levelname)s - %(message)s',
    "%Y-%m-%d %H:%M:%S"),  # 对5改进,带进程和线程显示的日志模板。
10: logging.Formatter(
    '[p%(process)d_t%(thread)d] %(asctime)s - %(name)s - "%(filename)s:%(lineno)d" - %(levelname)s - %(message)s', "%Y-%m-%d %H:%M:%S"),  # 对7改进,带进程和线程显示的日志模板。

}

FORMATTER_KIND = 5 # 如果get_logger_and_add_handlers不指定日志模板,则默认选择第几个模板`

ydf0509 commented 3 years ago

刚刚打包了一下,升级到nb_log==5.4版本,可以选择日志文件按照什么方式来切割了。 pip install nb_log --upgrade -i https://pypi.org/simple

升级后,把项目已有的nb_log_config.py删除掉,否则识别到已近有这个文件了不会重新生成。

在代码里面get_logger() ,在pycahrm下,使用ctrl +b,点击跳转到函数就可以看到函数注释了 在get_logger函数上面敲击ctrl + i 不跳转也可以看到注释。

abcdehc commented 3 years ago

好的,非常感谢~

ydf0509 commented 3 years ago

优先是get_logger函数里面的入参传参生效,如果拿些参数没传就会按照配置文件里面的来生效。 所以是很灵活的,函数入参就是每个logger生成的传参可以不一样。

abcdehc commented 3 years ago

明白了~另外Project description是不是可以改一下,不然没实际使用可能就不知道有按时间分割的功能

ydf0509 commented 3 years ago

现在readme加了,4种文件切割的说明了。

miaopass-future commented 1 month ago

支持根据指定时间切割日志文件么

ydf0509 commented 1 month ago

支持根据指定时间切割日志文件么

早就支持了啊,默认不就已经支持了按时间切割吗?

ydf0509 commented 1 month ago

自己看下handler_type的介绍,支持按时间切割,按大小切割, 和同时按时间个大小双支持切割

miaopass-future commented 1 month ago

自己看下handler_type的介绍,支持按时间切割,按大小切割, 和同时按时间个大小双支持切割

没有找到能配置指定时间的地方,比如按小时,按天、星期之类归档方式

ydf0509 commented 1 month ago

nblog_config.py不就有吗。建议先运行起来,理论和实际结合,不要只看理论

miaopass-future commented 1 month ago

有看的,在里面只找到了关于按天切分的

LOG_FILE_HANDLER_TYPE 这个值可以设置为 1 2 3 4 5 四种值, 1为使用多进程安全按日志文件大小切割的文件日志,这是本人实现的批量写入日志,减少操作文件锁次数,测试10进程快速写入文件,win上性能比第5种提高了100倍,linux提升5倍 2为多进程安全按天自动切割的文件日志,同一个文件,每天生成一个新的日志文件。日志文件名字后缀自动加上日期。 3为不自动切割的单个文件的日志(不切割文件就不会出现所谓进程安不安全的问题) 4为 WatchedFileHandler,这个是需要在linux下才能使用,需要借助lograte外力进行日志文件的切割,多进程安全。 5 为第三方的concurrent_log_handler.ConcurrentRotatingFileHandler按日志文件大小切割的文件日志, 这个是采用了文件锁,多进程安全切割,文件锁在linux上使用fcntl性能还行,win上使用win32con性能非常惨。按大小切割建议不要选第5个个filehandler而是选择第1个。 6 BothDayAndSizeRotatingFileHandler 使用本人完全彻底开发的,同时按照时间和大小切割,无论是文件的大小、还是时间达到了需要切割的条件就切割。 7 LoguruFileHandler ,使用知名的 loguru 包的文件日志记录器来写文件。 是需要使用ConcurrentRotatingFileHandler实现么

ydf0509 commented 1 month ago

我没懂你意思,你说只看到按天切割的?你意思是你需要按小时和按分钟切割的意思吗?

miaopass-future commented 1 month ago

我没懂你意思,你说只看到按天切割的?你意思是你需要按小时和按分钟切割的意思吗?

是的

ydf0509 commented 1 month ago

为什么你需求这么奇葩,要按小时切割? 一般都是按天切割就满足了。自己看按天的handler写个扩展handler吧,

miaopass-future commented 1 month ago

为什么你需求这么奇葩,要按小时切割? 一般都是按天切割就满足了。自己看按天的handler写个扩展handler吧,

这个倒不是需求如此,因为从loguru转过来,这个是支持配置那些东西得。测试按时间切割配置分钟秒啥的也搞测。实际场景按天来肯定够用了。所以只是想问下有没有配置的地方,具体有没有实现不影响正式使用场景。