Loading

python日志loguru

文档:https://loguru.readthedocs.io/en/stable/overview.html#installation

pip install loguru

使用

基本使用

##终端日志
from loguru import logger
logger.debug("这是一条debug日志")


###输出到文件
from loguru import logger

logger.add("file_{time}.log")

logger.debug("这是一条debug日志")
logger.info("这是一条info日志")

##日志规则
#logger.add("file.log", format="{time} {level} {message}", filter="", level="INFO")

#默认的输出格式是上面的内容,有时间、级别、模块名、行号以及日志信息

logger.add(f"{log_path}/log{t}.log", rotation="500MB", encoding="utf-8", enqueue=True,
               format="{time:YYYY-MM-DD HH:mm:ss} |  {name} | {line} | {message}", retention="10 days")

#这个格式比较好
logger.add("file.log", format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}")
2020-06-24 at 20:49:04 | INFO | hehhehejhjkfffffffffffff--------->>>jhgfdhjkdj----------<>jh
2020-06-24 at 20:49:15 | INFO | jfsdghdjkhf

logger.debug("这是一条debug日志")
logger.info("这是一条info日志")


##add方法
def add(
    self,
    sink,
    *,
    level=_defaults.LOGURU_LEVEL,
    format=_defaults.LOGURU_FORMAT,
    filter=_defaults.LOGURU_FILTER,
    colorize=_defaults.LOGURU_COLORIZE,
    serialize=_defaults.LOGURU_SERIALIZE,
    backtrace=_defaults.LOGURU_BACKTRACE,
    diagnose=_defaults.LOGURU_DIAGNOSE,
    enqueue=_defaults.LOGURU_ENQUEUE,
    catch=_defaults.LOGURU_CATCH,
    **kwargs
):
    r"""Add a handler sending log messages to a sink adequately configured.


sink 可以传入一个 file 对象,例如 sys.stderr 或者 open('file.log', 'w') 都可以。
sink 可以直接传入一个 str 字符串或者 pathlib.Path 对象,其实就是代表文件路径的,如果识别到是这种类型,它会自动创建对应路径的日志文件并将日志输出进去。
sink 可以是一个方法,可以自行定义输出实现。
sink 可以是一个 logging 模块的 Handler,比如 FileHandler、StreamHandler 等等,或者上文中我们提到的 CMRESHandler 照样也是可以的,这样就可以实现自定义 Handler 的配置。
sink 还可以是一个自定义的类,具体的实现规范可以参见官方文档。

删除 sink:

from loguru import logger
 
trace = logger.add('runtime.log')  ##获取返回值
logger.debug('this is a debug message')
logger.remove(trace)  ##删除旧的日志文件
logger.debug('this is another debug message')

日志文件管理方式

logger.add("file_1.log", rotation="500 MB")    # 文件过大就会重新生成一个文件
logger.add("file_2.log", rotation="12:00")     # 每天12点创建新文件
logger.add("file_3.log", rotation="1 week")    # 文件时间过长就会创建新文件

logger.add("file_X.log", retention="10 days")  # 一段时间后会清空

logger.add("file_Y.log", compression="zip")    # 保存zip格式

logger.add('runtime_{time}.log', rotation='1 week')

##输出字符串格式化
logger.info('If you are using Python {}, prefer {feature} of course!', 3.6, feature='f-strings')

n1 = "cool"
n2 = [1, 2, 3]
logger.info(f'If you are using Python {n1}, prefer {n2} of course!')

其他参数

logger.add("somefile.log", enqueue=True)  # 异步写入

logger.add("somefile.log", serialize=True)  # 序列化为json

创建多个文件处理器对象并解决中文乱码问题

# coding=utf-8
import os
import sys
from loguru import logger

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

log_file_path = os.path.join(BASE_DIR, 'Log/my.log')
err_log_file_path = os.path.join(BASE_DIR, 'Log/err.log')

logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")
# logger.add(s)
logger.add(log_file_path, rotation="500 MB", encoding='utf-8')  # Automatically rotate too big file
logger.add(err_log_file_path, rotation="500 MB", encoding='utf-8',
           level='ERROR')  # Automatically rotate too big file
logger.debug("That's it, beautiful and simple logging!")
logger.debug("中文日志可以不")
logger.error("严重错误")

字符串格式化

logger.info('If you are using Python {}, prefer {feature} of course!', 3.6, feature='f-strings')

装饰器

@logger.catch
def my_function(x, y, z):
    # An error? It's caught anyway!
    return 1 / (x + y + z)


单独的日志模块工具

项目路径下的util文件夹之类的,不能直接放项目路径下,不然路径会生成错误

"""
操作日志记录
"""
import time
from loguru import logger
from pathlib import Path
 
project_path = Path.cwd().parent       ##获取当前模块文件所在目录的上一层
log_path = Path(project_path, "log")   ##产生日志目录字符串
t = time.strftime("%Y_%m_%d")          ##2020_06_24
 
class Loggings:
    __instance = None
    logger.add(f"{log_path}/interface_log_{t}.log", rotation="500MB", encoding="utf-8", enqueue=True,
               retention="10 days")
 
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = super(Loggings, cls).__new__(cls, *args, **kwargs)
 
        return cls.__instance
 
    def info(self, msg):
        return logger.info(msg)
 
    def debug(self, msg):
        return logger.debug(msg)
 
    def warning(self, msg):
        return logger.warning(msg)
 
    def error(self, msg):
        return logger.error(msg)
 
loggings = Loggings()
if __name__ == '__main__':
    loggings.info("中文test")
    loggings.debug("中文test")
    loggings.warning("中文test")
    loggings.error("中文test")
 
    logger.info('If you are using Python {}, prefer {feature} of course!', 3.6, feature='f-strings')
    n1 = "cool"
    n2 = [1, 2, 3]
    logger.info(f'If you are using Python {n1}, prefer {n2} of course!')

项目里loguru使用

根据催庆才的项目,还有一种用法
在项目的根目录下创建setting文件并使用

logger.add(env.str('LOG_RUNTIME_FILE', 'runtime.log'), level='DEBUG', rotation='1 week', retention='20 days')
logger.add(env.str('LOG_ERROR_FILE', 'error.log'), level='ERROR', rotation='1 week')

初步实验了一下


import os
import time
from loguru import logger

basedir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# print(f"log basedir{basedir}")  # /xxx/python_code/FastAdmin/backend/app
# 定位到log日志文件
log_path = os.path.join(basedir, 'logs')

if not os.path.exists(log_path):
    os.mkdir(log_path)

log_path_error = os.path.join(log_path, f'{time.strftime("%Y-%m-%d")}_error.log')

# 日志简单配置
# 具体其他配置 可自行参考 https://github.com/Delgan/loguru
logger.add(log_path_error, rotation="12:00", retention="5 days", enqueue=True)
posted @ 2020-03-21 16:24  Lust4Life  阅读(1542)  评论(0编辑  收藏  举报