diff --git a/src/__init__.py b/src/__init__.py index 158d0f7..c0077af 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -5,6 +5,7 @@ pliblog - 简易,现代化具有色彩的日志记录器 / Easy, Modern and colo # python 3.13.5 from .utils import get_config, set_config, reset_config, get_asctime, get_date, get_time, get_weekday, fmt_console, fmt_placeholder, fmt_message, fmt_level_name +from .levels import Logger __all__ = [ "get_config", @@ -18,4 +19,5 @@ __all__ = [ "fmt_placeholder", "fmt_message", "fmt_level_name", + "Logger" ] \ No newline at end of file diff --git a/src/levels/__init__.py b/src/levels/__init__.py new file mode 100644 index 0000000..2831c48 --- /dev/null +++ b/src/levels/__init__.py @@ -0,0 +1,13 @@ +""" +日志级别模块 +Log level module + +""" +# encoding: utf-8 +# python 3.13.5 + +from .levels import Logger + +__all__ = [ + "Logger" +] \ No newline at end of file diff --git a/src/levels/levels.py b/src/levels/levels.py new file mode 100644 index 0000000..a658f17 --- /dev/null +++ b/src/levels/levels.py @@ -0,0 +1,128 @@ +""" +日志级别模块 +Log level module + +""" +# encoding: utf-8 +# python 3.13.5 + +from typing import Optional, Any +from ..utils.fmt import fmt_file, fmt_message, fmt_console +from ..utils.configs import get_config, set_config +from ..utils.time import get_asctime +import pathlib + +def _get_full_path(file_path, file_name): + file_path.mkdir(parents=True, exist_ok=True) + return file_path / file_name + +file_path = pathlib.Path(get_config("file_path")) +file_name = get_config("file_name") +file_format = get_config("file_format") +file_encoding = get_config("file_encoding") +is_enable_console = get_config("enable_console") +is_enable_file = get_config("enable_file") + +class Logger: + def __init__(self): + if pathlib.Path(file_path).exists(): + if not pathlib.Path(file_path).is_dir(): + self.warn("日志文件路径不是目录,已自动自动使用默认目录") + set_config("file_path", "./logs") + pathlib.Path("./logs").mkdir(parents=True, exist_ok=True) + if _get_full_path(file_path, file_name).exists(): + from os import rename + rename(_get_full_path(file_path, file_name), _get_full_path(file_path, f"{get_asctime().replace(':', '-')}.log")) + self.debug("日志文件已存在,已自动重命名") + + @staticmethod + def info(message: Any, prefix: str | None = None, level: int = 20) -> Optional[str]: + """ + 信息日志 + Info log + :param message: 消息内容 Message content + :param prefix: 前缀 Prefix + :param level: 日志级别 Log level(11~20) + """ + if level < 11 or level > 20: + return None + if is_enable_file: + with open(_get_full_path(file_path, file_name), "a", encoding=file_encoding) as f: + f.write(fmt_file(level, fmt_message(message, no_placeholder=True), prefix)) + if is_enable_console: + print(fmt_console(level, fmt_message(message, no_placeholder=True), prefix)) + return fmt_console(level, fmt_message(message, no_placeholder=True), prefix) + + @staticmethod + def debug(message: Any, prefix: str | None = None, level: int = 10) -> Optional[str]: + """ + 调试日志 + Debug log + :param message: 消息内容 Message content + :param prefix: 前缀 Prefix + :param level: 日志级别 Log level(0~10) + """ + if level < 0 or level > 10: + return None + if is_enable_file: + with open(_get_full_path(file_path, file_name), "a", encoding=file_encoding) as f: + f.write(fmt_file(level, fmt_message(message, no_placeholder=True), prefix)) + if is_enable_console: + print(fmt_console(level, fmt_message(message, no_placeholder=True), prefix)) + return fmt_console(level, fmt_message(message, no_placeholder=True), prefix) + + @staticmethod + def warn(message: Any, prefix: str | None = None, level: int = 30) -> Optional[str]: + """ + 警告日志 + Warn log + :param message: 消息内容 Message content + :param prefix: 前缀 Prefix + :param level: 日志级别 Log level(30~40) + """ + if level < 30 or level > 40: + return None + if is_enable_file: + with open(_get_full_path(file_path, file_name), "a", encoding=file_encoding) as f: + f.write(fmt_file(level, fmt_message(message, no_placeholder=True), prefix)) + if is_enable_console: + print(fmt_console(level, fmt_message(message, no_placeholder=True), prefix)) + return fmt_console(level, fmt_message(message, no_placeholder=True), prefix) + + @staticmethod + def error(message: Any, prefix: str | None = None, level: int = 40) -> Optional[str]: + """ + 错误日志 + Error log + :param message: 消息内容 Message content + :param prefix: 前缀 Prefix + :param level: 日志级别 Log level(40~50) + """ + if level < 40 or level > 50: + return None + if is_enable_file: + with open(_get_full_path(file_path, file_name), "a", encoding=file_encoding) as f: + f.write(fmt_file(level, fmt_message(message, no_placeholder=True), prefix)) + if is_enable_console: + print(fmt_console(level, fmt_message(message, no_placeholder=True), prefix)) + return fmt_console(level, fmt_message(message, no_placeholder=True), prefix) + + @staticmethod + def critical(message: Any, prefix: str | None = None, level: int = 50) -> Optional[str]: + """ + 严重错误日志 + Critical error log + :param message: 消息内容 Message content + :param prefix: 前缀 Prefix + :param level: 日志级别 Log level(50~60) + """ + if level < 50 or level > 60: + return None + if is_enable_file: + with open(_get_full_path(file_path, file_name), "a", encoding=file_encoding) as f: + f.write(fmt_file(level, fmt_message(message, no_placeholder=True), prefix)) + if is_enable_console: + print(fmt_console(level, fmt_message(message, no_placeholder=True), prefix)) + return fmt_console(level, fmt_message(message, no_placeholder=True), prefix) + + diff --git a/src/utils/fmt.py b/src/utils/fmt.py index 404c9f4..5e46a72 100644 --- a/src/utils/fmt.py +++ b/src/utils/fmt.py @@ -79,7 +79,7 @@ def fmt_placeholder(message: Any, use_date_color: bool = True) -> str: )) return message -def fmt_message(message: Any, no_placeholder: bool = False) -> str: +def fmt_message(message: Any, no_placeholder: bool = False, no_color: bool = False) -> str: """ 格式化消息内容 Format message content @@ -128,10 +128,14 @@ def fmt_message(message: Any, no_placeholder: bool = False) -> str: current_content = [] return ''.join(result) - if no_placeholder: - return process_color_tags(str(message)) + if no_color: + processed_message = str(message) else: - return process_color_tags(fmt_placeholder(str(message))) + processed_message = process_color_tags(str(message)) + if no_placeholder: + return processed_message + else: + return process_color_tags(fmt_placeholder(processed_message)) if not no_color else fmt_placeholder(processed_message) def fmt_level_name(level_name: str) -> str: if get_config("console_color") != True: @@ -166,7 +170,7 @@ def fmt_console(level: int, message: Any, prefix: str | None = None) -> Optional fmt = fmt_placeholder(fmt) return fmt.format( levelname = fmt_level_name(fmt_level_number(level)), - prefix = prefix, + prefix = fmt_message(prefix, no_placeholder=True), message = fmt_message(message, no_placeholder=True) ) @@ -184,9 +188,9 @@ def fmt_file(level: int, message: Any, prefix: str | None = None) -> Optional[st return None if prefix is None: prefix = "" - fmt = fmt_placeholder(fmt) - return fmt.format( - levelname = fmt_level_name(fmt_level_number(level)), - prefix = prefix, - message = fmt_message(message, no_placeholder=True) - ) + fmt = fmt_placeholder(fmt, use_date_color=False) + return f"{fmt.format( + levelname = fmt_level_number(level), + prefix = fmt_message(prefix, no_placeholder=True, no_color=True), + message = fmt_message(message, no_placeholder=True, no_color=True) + )}\n" diff --git a/src/utils/styles.py b/src/utils/styles.py index f81da56..82e2f70 100644 --- a/src/utils/styles.py +++ b/src/utils/styles.py @@ -6,7 +6,6 @@ pliblog's style tools, used to format log output # encoding = utf-8 # python 3.13.5 -from .configs import get_config from typing import Union, Optional def _get_hex_to_ansi(hex_color: str) -> Union[Optional[str], None]: