beans-logging 7.0.0__py3-none-any.whl → 7.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- beans_logging/__version__.py +1 -1
- beans_logging/_builder.py +16 -39
- beans_logging/config.py +35 -55
- {beans_logging-7.0.0.dist-info → beans_logging-7.1.0.dist-info}/METADATA +7 -10
- {beans_logging-7.0.0.dist-info → beans_logging-7.1.0.dist-info}/RECORD +8 -8
- {beans_logging-7.0.0.dist-info → beans_logging-7.1.0.dist-info}/WHEEL +0 -0
- {beans_logging-7.0.0.dist-info → beans_logging-7.1.0.dist-info}/licenses/LICENSE.txt +0 -0
- {beans_logging-7.0.0.dist-info → beans_logging-7.1.0.dist-info}/top_level.txt +0 -0
beans_logging/__version__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "7.
|
|
1
|
+
__version__ = "7.1.0"
|
beans_logging/_builder.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from typing import Any
|
|
3
|
+
from pathlib import Path
|
|
3
4
|
|
|
4
5
|
from pydantic import validate_call
|
|
5
6
|
|
|
@@ -39,40 +40,24 @@ def build_handler(handler: LogHandlerPM, config: LoggerConfigPM) -> dict[str, An
|
|
|
39
40
|
if _handler_dict.get("sink") is None:
|
|
40
41
|
if _handler_dict.get("type") == LogHandlerTypeEnum.STD:
|
|
41
42
|
_handler_dict["sink"] = std_sink
|
|
42
|
-
elif _handler_dict.get("type") == LogHandlerTypeEnum.FILE:
|
|
43
|
-
_logs_path: str = ""
|
|
44
|
-
if _handler_dict.get("serialize") or _handler_dict.get("custom_serialize"):
|
|
45
|
-
if _handler_dict.get("error"):
|
|
46
|
-
_logs_path = os.path.join(
|
|
47
|
-
config.default.file.logs_dir,
|
|
48
|
-
config.default.file.json_.err_path,
|
|
49
|
-
)
|
|
50
|
-
else:
|
|
51
|
-
_logs_path = os.path.join(
|
|
52
|
-
config.default.file.logs_dir,
|
|
53
|
-
config.default.file.json_.log_path,
|
|
54
|
-
)
|
|
55
|
-
else:
|
|
56
|
-
if _handler_dict.get("error"):
|
|
57
|
-
_logs_path = os.path.join(
|
|
58
|
-
config.default.file.logs_dir,
|
|
59
|
-
config.default.file.plain.err_path,
|
|
60
|
-
)
|
|
61
|
-
else:
|
|
62
|
-
_logs_path = os.path.join(
|
|
63
|
-
config.default.file.logs_dir,
|
|
64
|
-
config.default.file.plain.log_path,
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
if "{app_name}" in _logs_path:
|
|
68
|
-
_logs_path = _logs_path.format(app_name=config.app_name)
|
|
69
|
-
|
|
70
|
-
_handler_dict["sink"] = _logs_path
|
|
71
43
|
else:
|
|
72
44
|
raise ValueError(
|
|
73
|
-
"'sink' attribute is empty, required for any log handler except std
|
|
45
|
+
"'sink' attribute is empty, required for any log handler except std handler!"
|
|
74
46
|
)
|
|
75
47
|
|
|
48
|
+
_sink = _handler_dict.get("sink")
|
|
49
|
+
if isinstance(_sink, (str, Path)):
|
|
50
|
+
if not os.path.isabs(_sink):
|
|
51
|
+
_sink = os.path.join(config.default.file.logs_dir, _sink)
|
|
52
|
+
|
|
53
|
+
if isinstance(_sink, Path):
|
|
54
|
+
_sink = str(_sink)
|
|
55
|
+
|
|
56
|
+
if "{app_name}" in _sink:
|
|
57
|
+
_sink = _sink.format(app_name=config.app_name)
|
|
58
|
+
|
|
59
|
+
_handler_dict["sink"] = _sink
|
|
60
|
+
|
|
76
61
|
if _handler_dict.get("level") is None:
|
|
77
62
|
if _handler_dict.get("error"):
|
|
78
63
|
_handler_dict["level"] = config.default.level.err
|
|
@@ -89,10 +74,7 @@ def build_handler(handler: LogHandlerPM, config: LoggerConfigPM) -> dict[str, An
|
|
|
89
74
|
_handler_dict["format"] = json_formatter
|
|
90
75
|
|
|
91
76
|
if (_handler_dict.get("format") is None) and (not _handler_dict.get("serialize")):
|
|
92
|
-
|
|
93
|
-
_handler_dict["format"] = config.default.std.format_str
|
|
94
|
-
else:
|
|
95
|
-
_handler_dict["format"] = config.default.format_str
|
|
77
|
+
_handler_dict["format"] = config.default.format_str
|
|
96
78
|
|
|
97
79
|
if _handler_dict.get("filter") is None:
|
|
98
80
|
if _handler_dict.get("type") == LogHandlerTypeEnum.STD:
|
|
@@ -120,11 +102,6 @@ def build_handler(handler: LogHandlerPM, config: LoggerConfigPM) -> dict[str, An
|
|
|
120
102
|
):
|
|
121
103
|
_handler_dict["diagnose"] = True
|
|
122
104
|
|
|
123
|
-
if (_handler_dict.get("colorize") is None) and (
|
|
124
|
-
_handler_dict.get("type") == LogHandlerTypeEnum.STD
|
|
125
|
-
):
|
|
126
|
-
_handler_dict["colorize"] = config.default.std.colorize
|
|
127
|
-
|
|
128
105
|
if _handler_dict.get("type") == LogHandlerTypeEnum.FILE:
|
|
129
106
|
if _handler_dict.get("enqueue") is None:
|
|
130
107
|
_handler_dict["enqueue"] = True
|
beans_logging/config.py
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import os
|
|
2
2
|
import datetime
|
|
3
3
|
from typing import Any
|
|
4
4
|
|
|
5
|
-
if sys.version_info >= (3, 11):
|
|
6
|
-
from typing import Self
|
|
7
|
-
else:
|
|
8
|
-
from typing_extensions import Self
|
|
9
|
-
|
|
10
5
|
import potato_util as utils
|
|
11
|
-
from pydantic import Field,
|
|
6
|
+
from pydantic import Field, field_validator
|
|
12
7
|
|
|
13
8
|
from ._constants import LogHandlerTypeEnum, LogLevelEnum
|
|
14
9
|
from .schemas import ExtraBaseModel, LogHandlerPM, LoguruHandlerPM
|
|
@@ -22,53 +17,46 @@ def _get_handlers() -> dict[str, LogHandlerPM]:
|
|
|
22
17
|
"""
|
|
23
18
|
|
|
24
19
|
_log_handlers: dict[str, LogHandlerPM] = {
|
|
25
|
-
"default.all.std_handler": LogHandlerPM(
|
|
20
|
+
"default.all.std_handler": LogHandlerPM(
|
|
21
|
+
type_=LogHandlerTypeEnum.STD,
|
|
22
|
+
format_=(
|
|
23
|
+
"[<c>{time:YYYY-MM-DD HH:mm:ss.SSS Z}</c> | <level>{extra[level_short]:<5}</level> | "
|
|
24
|
+
"<w>{name}:{line}</w>]: <level>{message}</level>"
|
|
25
|
+
),
|
|
26
|
+
colorize=True,
|
|
27
|
+
),
|
|
26
28
|
"default.all.file_handler": LogHandlerPM(
|
|
27
|
-
type_=LogHandlerTypeEnum.FILE,
|
|
29
|
+
type_=LogHandlerTypeEnum.FILE,
|
|
30
|
+
sink="{app_name}.all.log",
|
|
31
|
+
enabled=False,
|
|
28
32
|
),
|
|
29
33
|
"default.err.file_handler": LogHandlerPM(
|
|
30
|
-
type_=LogHandlerTypeEnum.FILE,
|
|
34
|
+
type_=LogHandlerTypeEnum.FILE,
|
|
35
|
+
sink="{app_name}.err.log",
|
|
36
|
+
error=True,
|
|
37
|
+
enabled=False,
|
|
31
38
|
),
|
|
32
39
|
"default.all.json_handler": LogHandlerPM(
|
|
33
|
-
type_=LogHandlerTypeEnum.FILE,
|
|
40
|
+
type_=LogHandlerTypeEnum.FILE,
|
|
41
|
+
sink="json/{app_name}.json.all.log",
|
|
42
|
+
serialize=True,
|
|
43
|
+
enabled=False,
|
|
34
44
|
),
|
|
35
45
|
"default.err.json_handler": LogHandlerPM(
|
|
36
|
-
type_=LogHandlerTypeEnum.FILE,
|
|
46
|
+
type_=LogHandlerTypeEnum.FILE,
|
|
47
|
+
sink="json/{app_name}.json.err.log",
|
|
48
|
+
serialize=True,
|
|
49
|
+
error=True,
|
|
50
|
+
enabled=False,
|
|
37
51
|
),
|
|
38
52
|
}
|
|
39
53
|
|
|
40
54
|
return _log_handlers
|
|
41
55
|
|
|
42
56
|
|
|
43
|
-
class StdConfigPM(ExtraBaseModel):
|
|
44
|
-
format_str: str = Field(
|
|
45
|
-
default=(
|
|
46
|
-
"[<c>{time:YYYY-MM-DD HH:mm:ss.SSS Z}</c> | <level>{extra[level_short]:<5}</level> | <w>{name}:{line}</w>]:"
|
|
47
|
-
" <level>{message}</level>"
|
|
48
|
-
),
|
|
49
|
-
min_length=8,
|
|
50
|
-
max_length=512,
|
|
51
|
-
)
|
|
52
|
-
colorize: bool = Field(default=True)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class PathsConfigPM(ExtraBaseModel):
|
|
56
|
-
log_path: str = Field(..., min_length=4, max_length=1024)
|
|
57
|
-
err_path: str = Field(..., min_length=4, max_length=1024)
|
|
58
|
-
|
|
59
|
-
@model_validator(mode="after")
|
|
60
|
-
def _check_log_path(self) -> Self:
|
|
61
|
-
if self.log_path == self.err_path:
|
|
62
|
-
raise ValueError(
|
|
63
|
-
f"`log_path` and `err_path` attributes have same value: '{self.log_path}', must be different!"
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
return self
|
|
67
|
-
|
|
68
|
-
|
|
69
57
|
class FileConfigPM(ExtraBaseModel):
|
|
70
58
|
logs_dir: str = Field(
|
|
71
|
-
|
|
59
|
+
default_factory=lambda: os.path.join(os.getcwd(), "logs"),
|
|
72
60
|
min_length=2,
|
|
73
61
|
max_length=1024,
|
|
74
62
|
)
|
|
@@ -79,21 +67,6 @@ class FileConfigPM(ExtraBaseModel):
|
|
|
79
67
|
retention: int = Field(default=90, ge=1)
|
|
80
68
|
encoding: str = Field(default="utf8", min_length=2, max_length=31)
|
|
81
69
|
|
|
82
|
-
plain: PathsConfigPM = Field(
|
|
83
|
-
default_factory=lambda: PathsConfigPM(
|
|
84
|
-
log_path="{app_name}.all.log",
|
|
85
|
-
err_path="{app_name}.err.log",
|
|
86
|
-
)
|
|
87
|
-
)
|
|
88
|
-
json_: PathsConfigPM = Field(
|
|
89
|
-
default_factory=lambda: PathsConfigPM(
|
|
90
|
-
log_path="json/{app_name}.json.all.log",
|
|
91
|
-
err_path="json/{app_name}.json.err.log",
|
|
92
|
-
),
|
|
93
|
-
validation_alias="json",
|
|
94
|
-
serialization_alias="json",
|
|
95
|
-
)
|
|
96
|
-
|
|
97
70
|
@field_validator("rotate_time", mode="before")
|
|
98
71
|
@classmethod
|
|
99
72
|
def _check_rotate_time(cls, val: Any) -> Any:
|
|
@@ -102,6 +75,14 @@ class FileConfigPM(ExtraBaseModel):
|
|
|
102
75
|
|
|
103
76
|
return val
|
|
104
77
|
|
|
78
|
+
@field_validator("logs_dir", mode="before")
|
|
79
|
+
@classmethod
|
|
80
|
+
def _check_logs_dir(cls, val: Any) -> Any:
|
|
81
|
+
if isinstance(val, str) and (not os.path.isabs(val)):
|
|
82
|
+
val = os.path.abspath(val)
|
|
83
|
+
|
|
84
|
+
return val
|
|
85
|
+
|
|
105
86
|
|
|
106
87
|
class LevelConfigPM(ExtraBaseModel):
|
|
107
88
|
base: str | int | LogLevelEnum = Field(default=LogLevelEnum.INFO)
|
|
@@ -123,7 +104,6 @@ class LevelConfigPM(ExtraBaseModel):
|
|
|
123
104
|
|
|
124
105
|
class DefaultConfigPM(ExtraBaseModel):
|
|
125
106
|
level: LevelConfigPM = Field(default_factory=LevelConfigPM)
|
|
126
|
-
std: StdConfigPM = Field(default_factory=StdConfigPM)
|
|
127
107
|
format_str: str = Field(
|
|
128
108
|
default="[{time:YYYY-MM-DD HH:mm:ss.SSS Z} | {extra[level_short]:<5} | {name}:{line}]: {message}",
|
|
129
109
|
min_length=8,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: beans_logging
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.1.0
|
|
4
4
|
Summary: 'beans-logging' is a python package for simple logger and easily managing logs.
|
|
5
5
|
Author-email: Batkhuu Byambajav <batkhuu10@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/bybatkhuu/module-python-logging
|
|
@@ -323,9 +323,6 @@ logger:
|
|
|
323
323
|
level:
|
|
324
324
|
base: INFO
|
|
325
325
|
err: WARNING
|
|
326
|
-
std:
|
|
327
|
-
format_str: "[<c>{time:YYYY-MM-DD HH:mm:ss.SSS Z}</c> | <level>{extra[level_short]:<5}</level> | <w>{name}:{line}</w>]: <level>{message}</level>"
|
|
328
|
-
colorize: true
|
|
329
326
|
format_str: "[{time:YYYY-MM-DD HH:mm:ss.SSS Z} | {extra[level_short]:<5} | {name}:{line}]: {message}"
|
|
330
327
|
file:
|
|
331
328
|
logs_dir: "./logs"
|
|
@@ -333,12 +330,6 @@ logger:
|
|
|
333
330
|
rotate_time: "00:00:00"
|
|
334
331
|
retention: 90
|
|
335
332
|
encoding: utf8
|
|
336
|
-
plain:
|
|
337
|
-
log_path: "{app_name}.all.log"
|
|
338
|
-
err_path: "{app_name}.err.log"
|
|
339
|
-
json:
|
|
340
|
-
log_path: "json/{app_name}.json.all.log"
|
|
341
|
-
err_path: "json/{app_name}.json.err.log"
|
|
342
333
|
custom_serialize: false
|
|
343
334
|
intercept:
|
|
344
335
|
enabled: true
|
|
@@ -349,20 +340,26 @@ logger:
|
|
|
349
340
|
handlers:
|
|
350
341
|
default.all.std_handler:
|
|
351
342
|
type: STD
|
|
343
|
+
format: "[<c>{time:YYYY-MM-DD HH:mm:ss.SSS Z}</c> | <level>{extra[level_short]:<5}</level> | <w>{name}:{line}</w>]: <level>{message}</level>"
|
|
344
|
+
colorize: true
|
|
352
345
|
enabled: true
|
|
353
346
|
default.all.file_handler:
|
|
354
347
|
type: FILE
|
|
348
|
+
sink: "{app_name}.all.log"
|
|
355
349
|
enabled: false
|
|
356
350
|
default.err.file_handler:
|
|
357
351
|
type: FILE
|
|
352
|
+
sink: "{app_name}.err.log"
|
|
358
353
|
error: true
|
|
359
354
|
enabled: false
|
|
360
355
|
default.all.json_handler:
|
|
361
356
|
type: FILE
|
|
357
|
+
sink: "json/{app_name}.json.all.log"
|
|
362
358
|
serialize: true
|
|
363
359
|
enabled: false
|
|
364
360
|
default.err.json_handler:
|
|
365
361
|
type: FILE
|
|
362
|
+
sink: "json/{app_name}.json.err.log"
|
|
366
363
|
serialize: true
|
|
367
364
|
error: true
|
|
368
365
|
enabled: false
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
beans_logging/__init__.py,sha256=KOXpuCNTMsdlY9MF6ONwRjM5O1_JCkIzt_qetb2BFTw,261
|
|
2
|
-
beans_logging/__version__.py,sha256=
|
|
3
|
-
beans_logging/_builder.py,sha256=
|
|
2
|
+
beans_logging/__version__.py,sha256=vrQk6cOG_uk0gOqN4qh7NRCxezXfvhv9tT7bwYHyTck,22
|
|
3
|
+
beans_logging/_builder.py,sha256=6v9i6zJIVQPOElZ4x3cI-UULx0ae59qWe0E5G5Vy37M,4469
|
|
4
4
|
beans_logging/_constants.py,sha256=rH9ZN-b7GXNXjbpOZUJfsft54Eiy8jnXm82jsFcMo3k,510
|
|
5
5
|
beans_logging/_core.py,sha256=qkGl5NRKY7lKuVatwFmddwxeYS5viU5DDnfKucWK3Mo,9617
|
|
6
6
|
beans_logging/_intercept.py,sha256=TeYze0eXRMVkOoC9Bl2qmaC7fSwExfQAmmGHz5KiuCU,3249
|
|
7
7
|
beans_logging/auto.py,sha256=MoNuQomiIFWQVpNTkOmFFVMo00HBlErfHC728GFOyqc,218
|
|
8
|
-
beans_logging/config.py,sha256=
|
|
8
|
+
beans_logging/config.py,sha256=E_bQy-sJxTIjhpOXOTm-gg5zOcOplcBnCprdl7xDvaY,5534
|
|
9
9
|
beans_logging/filters.py,sha256=-Rys2rwuT7EUvuEA19jnhW6enIEkDuPzeGbAAz6RJSc,3720
|
|
10
10
|
beans_logging/formats.py,sha256=Vrr4RkCfiJl-oi6BLVxeR-k0WhTR0oBI4mpsWgBJBNE,1624
|
|
11
11
|
beans_logging/rotators.py,sha256=lzR31sdEPTZVDkyhC81FL4OnezIVKlElGJDRA2Svn2I,2121
|
|
12
12
|
beans_logging/schemas.py,sha256=b4igq8CkAzn7CGOBDc09hW0YTvWyuWRe97fpv_OaNdk,4444
|
|
13
13
|
beans_logging/sinks.py,sha256=7Guusg3N1S-28hLnRzuunP8lXnhexzny3aj-AR0HhuQ,482
|
|
14
|
-
beans_logging-7.
|
|
15
|
-
beans_logging-7.
|
|
16
|
-
beans_logging-7.
|
|
17
|
-
beans_logging-7.
|
|
18
|
-
beans_logging-7.
|
|
14
|
+
beans_logging-7.1.0.dist-info/licenses/LICENSE.txt,sha256=CUTK-r0BWIg1r0bBiemAcMhakgV0N7HuRhw6rQ-A9A4,1074
|
|
15
|
+
beans_logging-7.1.0.dist-info/METADATA,sha256=IJ80xo6ZU9nslzIfgXfuwq0ytEiaOLRvn9yZLRFTSjE,13093
|
|
16
|
+
beans_logging-7.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
17
|
+
beans_logging-7.1.0.dist-info/top_level.txt,sha256=lx8JEqYGNha1sYbVrTtMo2Z01A7Shq8hX6bfsuKLTG8,14
|
|
18
|
+
beans_logging-7.1.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|