beans-logging 7.1.0__py3-none-any.whl → 8.0.1__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/__init__.py +5 -1
- beans_logging/__version__.py +1 -1
- beans_logging/_builder.py +58 -57
- beans_logging/_core.py +8 -7
- beans_logging/config.py +65 -39
- beans_logging/constants.py +46 -0
- beans_logging/{_intercept.py → intercepters.py} +2 -2
- beans_logging/schemas.py +2 -6
- {beans_logging-7.1.0.dist-info → beans_logging-8.0.1.dist-info}/METADATA +19 -51
- beans_logging-8.0.1.dist-info/RECORD +18 -0
- {beans_logging-7.1.0.dist-info → beans_logging-8.0.1.dist-info}/WHEEL +1 -1
- beans_logging/_constants.py +0 -30
- beans_logging-7.1.0.dist-info/RECORD +0 -18
- {beans_logging-7.1.0.dist-info → beans_logging-8.0.1.dist-info}/licenses/LICENSE.txt +0 -0
- {beans_logging-7.1.0.dist-info → beans_logging-8.0.1.dist-info}/top_level.txt +0 -0
beans_logging/__init__.py
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from .__version__ import __version__
|
|
4
|
-
from .
|
|
4
|
+
from .schemas import LoguruHandlerPM, LogHandlerPM
|
|
5
|
+
from .config import get_default_handlers, LoggerConfigPM
|
|
5
6
|
from ._core import Logger, logger, LoggerLoader
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
__all__ = [
|
|
9
10
|
"__version__",
|
|
11
|
+
"LoguruHandlerPM",
|
|
12
|
+
"LogHandlerPM",
|
|
13
|
+
"get_default_handlers",
|
|
10
14
|
"LoggerConfigPM",
|
|
11
15
|
"Logger",
|
|
12
16
|
"logger",
|
beans_logging/__version__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "
|
|
1
|
+
__version__ = "8.0.1"
|
beans_logging/_builder.py
CHANGED
|
@@ -4,7 +4,7 @@ from pathlib import Path
|
|
|
4
4
|
|
|
5
5
|
from pydantic import validate_call
|
|
6
6
|
|
|
7
|
-
from .
|
|
7
|
+
from .constants import LogHandlerTypeEnum, LogLevelEnum
|
|
8
8
|
from .schemas import LogHandlerPM
|
|
9
9
|
from .config import LoggerConfigPM
|
|
10
10
|
from .sinks import std_sink
|
|
@@ -35,17 +35,15 @@ def build_handler(handler: LogHandlerPM, config: LoggerConfigPM) -> dict[str, An
|
|
|
35
35
|
dict[str, Any]: Loguru handler config as dictionary.
|
|
36
36
|
"""
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if _handler_dict.get("type") == LogHandlerTypeEnum.STD:
|
|
42
|
-
_handler_dict["sink"] = std_sink
|
|
38
|
+
if handler.sink is None:
|
|
39
|
+
if handler.h_type == LogHandlerTypeEnum.STD:
|
|
40
|
+
handler.sink = std_sink
|
|
43
41
|
else:
|
|
44
42
|
raise ValueError(
|
|
45
43
|
"'sink' attribute is empty, required for any log handler except std handler!"
|
|
46
44
|
)
|
|
47
45
|
|
|
48
|
-
_sink =
|
|
46
|
+
_sink = handler.sink
|
|
49
47
|
if isinstance(_sink, (str, Path)):
|
|
50
48
|
if not os.path.isabs(_sink):
|
|
51
49
|
_sink = os.path.join(config.default.file.logs_dir, _sink)
|
|
@@ -56,72 +54,75 @@ def build_handler(handler: LogHandlerPM, config: LoggerConfigPM) -> dict[str, An
|
|
|
56
54
|
if "{app_name}" in _sink:
|
|
57
55
|
_sink = _sink.format(app_name=config.app_name)
|
|
58
56
|
|
|
59
|
-
|
|
57
|
+
handler.sink = _sink
|
|
60
58
|
|
|
61
|
-
if
|
|
62
|
-
if
|
|
63
|
-
|
|
59
|
+
if handler.level is None:
|
|
60
|
+
if handler.error:
|
|
61
|
+
handler.level = config.default.level.err
|
|
64
62
|
else:
|
|
65
|
-
|
|
63
|
+
handler.level = config.default.level.base
|
|
66
64
|
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if _handler_dict.get("error"):
|
|
85
|
-
_handler_dict["filter"] = use_file_json_err_filter
|
|
65
|
+
if (handler.custom_serialize is None) and handler.serialize:
|
|
66
|
+
handler.custom_serialize = config.default.custom_serialize
|
|
67
|
+
|
|
68
|
+
if handler.custom_serialize:
|
|
69
|
+
handler.serialize = False
|
|
70
|
+
handler.format_ = json_formatter
|
|
71
|
+
|
|
72
|
+
if (handler.format_ is None) and (not handler.serialize):
|
|
73
|
+
handler.format_ = config.default.format_str
|
|
74
|
+
|
|
75
|
+
if handler.filter_ is None:
|
|
76
|
+
if handler.h_type == LogHandlerTypeEnum.STD:
|
|
77
|
+
handler.filter_ = use_std_filter
|
|
78
|
+
elif handler.h_type == LogHandlerTypeEnum.FILE:
|
|
79
|
+
if handler.serialize or handler.custom_serialize:
|
|
80
|
+
if handler.error:
|
|
81
|
+
handler.filter_ = use_file_json_err_filter
|
|
86
82
|
else:
|
|
87
|
-
|
|
83
|
+
handler.filter_ = use_file_json_filter
|
|
88
84
|
else:
|
|
89
|
-
if
|
|
90
|
-
|
|
85
|
+
if handler.error:
|
|
86
|
+
handler.filter_ = use_file_err_filter
|
|
91
87
|
else:
|
|
92
|
-
|
|
88
|
+
handler.filter_ = use_file_filter
|
|
93
89
|
else:
|
|
94
|
-
|
|
90
|
+
handler.filter_ = use_all_filter
|
|
95
91
|
|
|
96
|
-
if
|
|
97
|
-
|
|
92
|
+
if handler.backtrace is None:
|
|
93
|
+
handler.backtrace = True
|
|
98
94
|
|
|
99
|
-
if (
|
|
100
|
-
(
|
|
101
|
-
or (_handler_dict.get("level") == 5)
|
|
95
|
+
if (handler.diagnose is None) and (
|
|
96
|
+
(handler.level == LogLevelEnum.TRACE) or (handler.level == 5)
|
|
102
97
|
):
|
|
103
|
-
|
|
98
|
+
handler.diagnose = True
|
|
104
99
|
|
|
105
|
-
if
|
|
106
|
-
if
|
|
107
|
-
|
|
100
|
+
if handler.h_type == LogHandlerTypeEnum.FILE:
|
|
101
|
+
if handler.enqueue is None:
|
|
102
|
+
handler.enqueue = True
|
|
108
103
|
|
|
109
|
-
if
|
|
110
|
-
|
|
104
|
+
if handler.rotation is None:
|
|
105
|
+
handler.rotation = Rotator(
|
|
111
106
|
rotate_size=config.default.file.rotate_size,
|
|
112
107
|
rotate_time=config.default.file.rotate_time,
|
|
113
108
|
).should_rotate
|
|
114
109
|
|
|
115
|
-
if
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
if
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
_handler_dict.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
110
|
+
if handler.retention is None:
|
|
111
|
+
handler.retention = config.default.file.retention
|
|
112
|
+
|
|
113
|
+
if handler.encoding is None:
|
|
114
|
+
handler.encoding = config.default.file.encoding
|
|
115
|
+
|
|
116
|
+
_handler_dict = handler.model_dump(
|
|
117
|
+
by_alias=True,
|
|
118
|
+
exclude_none=True,
|
|
119
|
+
exclude={
|
|
120
|
+
"enabled",
|
|
121
|
+
"h_type",
|
|
122
|
+
"error",
|
|
123
|
+
"custom_serialize",
|
|
124
|
+
},
|
|
125
|
+
)
|
|
125
126
|
|
|
126
127
|
return _handler_dict
|
|
127
128
|
|
beans_logging/_core.py
CHANGED
|
@@ -17,10 +17,11 @@ from pydantic import validate_call
|
|
|
17
17
|
from potato_util import io as io_utils
|
|
18
18
|
|
|
19
19
|
# Internal modules
|
|
20
|
+
from .constants import DEFAULT_LOGURU_HANDLER_NAME, DEFAULT_NO_HANDLER_NAME_PREFIX
|
|
20
21
|
from .schemas import LogHandlerPM, LoguruHandlerPM
|
|
21
22
|
from .config import LoggerConfigPM
|
|
22
23
|
from ._builder import build_handler
|
|
23
|
-
from .
|
|
24
|
+
from .intercepters import add_intercepter
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
class LoggerLoader:
|
|
@@ -52,7 +53,7 @@ class LoggerLoader:
|
|
|
52
53
|
**kwargs,
|
|
53
54
|
) -> None:
|
|
54
55
|
|
|
55
|
-
self.handlers_map = {
|
|
56
|
+
self.handlers_map = {DEFAULT_LOGURU_HANDLER_NAME: 0}
|
|
56
57
|
if not config:
|
|
57
58
|
config = LoggerConfigPM()
|
|
58
59
|
|
|
@@ -63,15 +64,15 @@ class LoggerLoader:
|
|
|
63
64
|
self.config_path = config_path
|
|
64
65
|
|
|
65
66
|
if auto_load:
|
|
66
|
-
self.load()
|
|
67
|
+
self.load(load_config_file=True)
|
|
67
68
|
|
|
68
69
|
@validate_call
|
|
69
|
-
def load(self, load_config_file: bool =
|
|
70
|
+
def load(self, load_config_file: bool = False) -> "Logger":
|
|
70
71
|
"""Load logger handlers based on logger config.
|
|
71
72
|
|
|
72
73
|
Args:
|
|
73
74
|
load_config_file (bool, optional): Whether to load config from file before loading handlers.
|
|
74
|
-
Default is
|
|
75
|
+
Default is False.
|
|
75
76
|
|
|
76
77
|
Returns:
|
|
77
78
|
Logger: Main loguru logger instance.
|
|
@@ -84,7 +85,7 @@ class LoggerLoader:
|
|
|
84
85
|
for _key, _handler in self.config.handlers.items():
|
|
85
86
|
self.add_handler(name=_key, handler=_handler)
|
|
86
87
|
|
|
87
|
-
|
|
88
|
+
add_intercepter(config=self.config)
|
|
88
89
|
return logger
|
|
89
90
|
|
|
90
91
|
def _load_config_file(self) -> None:
|
|
@@ -195,7 +196,7 @@ class LoggerLoader:
|
|
|
195
196
|
|
|
196
197
|
_handler_id = logger.add(**_handler_dict)
|
|
197
198
|
if not name:
|
|
198
|
-
name = f"
|
|
199
|
+
name = f"{DEFAULT_NO_HANDLER_NAME_PREFIX}{uuid.uuid4().hex}"
|
|
199
200
|
|
|
200
201
|
self.handlers_map[name] = _handler_id
|
|
201
202
|
|
beans_logging/config.py
CHANGED
|
@@ -5,11 +5,19 @@ from typing import Any
|
|
|
5
5
|
import potato_util as utils
|
|
6
6
|
from pydantic import Field, field_validator
|
|
7
7
|
|
|
8
|
-
from .
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
from .constants import (
|
|
9
|
+
LogLevelEnum,
|
|
10
|
+
LogHandlerTypeEnum,
|
|
11
|
+
DEFAULT_ALL_STD_HANDLER_NAME,
|
|
12
|
+
DEFAULT_ALL_FILE_HANDLER_NAME,
|
|
13
|
+
DEFAULT_ERR_FILE_HANDLER_NAME,
|
|
14
|
+
DEFAULT_ALL_JSON_HANDLER_NAME,
|
|
15
|
+
DEFAULT_ERR_JSON_HANDLER_NAME,
|
|
16
|
+
)
|
|
17
|
+
from .schemas import ExtraBaseModel, LogHandlerPM
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def get_default_handlers() -> dict[str, LogHandlerPM]:
|
|
13
21
|
"""Get default log handlers.
|
|
14
22
|
|
|
15
23
|
Returns:
|
|
@@ -17,37 +25,37 @@ def _get_handlers() -> dict[str, LogHandlerPM]:
|
|
|
17
25
|
"""
|
|
18
26
|
|
|
19
27
|
_log_handlers: dict[str, LogHandlerPM] = {
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
DEFAULT_ALL_STD_HANDLER_NAME: LogHandlerPM(
|
|
29
|
+
h_type=LogHandlerTypeEnum.STD,
|
|
22
30
|
format_=(
|
|
23
31
|
"[<c>{time:YYYY-MM-DD HH:mm:ss.SSS Z}</c> | <level>{extra[level_short]:<5}</level> | "
|
|
24
32
|
"<w>{name}:{line}</w>]: <level>{message}</level>"
|
|
25
33
|
),
|
|
26
34
|
colorize=True,
|
|
27
35
|
),
|
|
28
|
-
|
|
29
|
-
type_=LogHandlerTypeEnum.FILE,
|
|
30
|
-
sink="{app_name}.all.log",
|
|
36
|
+
DEFAULT_ALL_FILE_HANDLER_NAME: LogHandlerPM(
|
|
31
37
|
enabled=False,
|
|
38
|
+
h_type=LogHandlerTypeEnum.FILE,
|
|
39
|
+
sink="{app_name}.all.log",
|
|
32
40
|
),
|
|
33
|
-
|
|
34
|
-
|
|
41
|
+
DEFAULT_ERR_FILE_HANDLER_NAME: LogHandlerPM(
|
|
42
|
+
enabled=False,
|
|
43
|
+
h_type=LogHandlerTypeEnum.FILE,
|
|
35
44
|
sink="{app_name}.err.log",
|
|
36
45
|
error=True,
|
|
37
|
-
enabled=False,
|
|
38
46
|
),
|
|
39
|
-
|
|
40
|
-
type_=LogHandlerTypeEnum.FILE,
|
|
41
|
-
sink="json/{app_name}.json.all.log",
|
|
42
|
-
serialize=True,
|
|
47
|
+
DEFAULT_ALL_JSON_HANDLER_NAME: LogHandlerPM(
|
|
43
48
|
enabled=False,
|
|
49
|
+
h_type=LogHandlerTypeEnum.FILE,
|
|
50
|
+
sink="json/{app_name}.all.json.log",
|
|
51
|
+
serialize=True,
|
|
44
52
|
),
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
53
|
+
DEFAULT_ERR_JSON_HANDLER_NAME: LogHandlerPM(
|
|
54
|
+
enabled=False,
|
|
55
|
+
h_type=LogHandlerTypeEnum.FILE,
|
|
56
|
+
sink="json/{app_name}.err.json.log",
|
|
48
57
|
serialize=True,
|
|
49
58
|
error=True,
|
|
50
|
-
enabled=False,
|
|
51
59
|
),
|
|
52
60
|
}
|
|
53
61
|
|
|
@@ -131,36 +139,54 @@ class LoggerConfigPM(ExtraBaseModel):
|
|
|
131
139
|
)
|
|
132
140
|
default: DefaultConfigPM = Field(default_factory=DefaultConfigPM)
|
|
133
141
|
intercept: InterceptConfigPM = Field(default_factory=InterceptConfigPM)
|
|
134
|
-
handlers: dict[str, LogHandlerPM] = Field(default_factory=
|
|
142
|
+
handlers: dict[str, LogHandlerPM] = Field(default_factory=get_default_handlers)
|
|
135
143
|
extra: ExtraConfigPM | None = Field(default_factory=ExtraConfigPM)
|
|
136
144
|
|
|
137
145
|
@field_validator("handlers", mode="before")
|
|
138
146
|
@classmethod
|
|
139
|
-
def _check_handlers(cls, val: Any) ->
|
|
140
|
-
|
|
141
|
-
|
|
147
|
+
def _check_handlers(cls, val: Any) -> dict[str, LogHandlerPM]:
|
|
148
|
+
|
|
149
|
+
_default_handlers = get_default_handlers()
|
|
150
|
+
|
|
151
|
+
if not val:
|
|
152
|
+
val = _default_handlers
|
|
153
|
+
return val
|
|
154
|
+
|
|
155
|
+
if not isinstance(val, dict):
|
|
156
|
+
raise TypeError(
|
|
157
|
+
f"'handlers' attribute type {type(val).__name__} is invalid, must be a dict of <LogHandlerPM> or dict!"
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
for _key, _handler in val.items():
|
|
161
|
+
if not isinstance(_handler, (LogHandlerPM, dict)):
|
|
142
162
|
raise TypeError(
|
|
143
|
-
f"'handlers' attribute type {type(
|
|
144
|
-
f"<
|
|
163
|
+
f"'handlers' attribute's '{_key}' key -> value type {type(_handler).__name__} is invalid, must be "
|
|
164
|
+
f"<LogHandlerPM> or dict!"
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
if isinstance(_handler, LogHandlerPM):
|
|
168
|
+
val[_key] = _handler.model_dump(
|
|
169
|
+
by_alias=True, exclude_unset=True, exclude_none=True
|
|
145
170
|
)
|
|
146
171
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
172
|
+
_default_dict = {
|
|
173
|
+
_key: _handler.model_dump(
|
|
174
|
+
by_alias=True, exclude_unset=True, exclude_none=True
|
|
175
|
+
)
|
|
176
|
+
for _key, _handler in _default_handlers.items()
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if _default_dict != val:
|
|
180
|
+
val = utils.deep_merge(_default_dict, val)
|
|
153
181
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
**_handler.model_dump(exclude_none=True, exclude_unset=True)
|
|
157
|
-
)
|
|
158
|
-
elif isinstance(_handler, dict):
|
|
159
|
-
val[_i] = LogHandlerPM(**_handler)
|
|
182
|
+
for _key, _handler in val.items():
|
|
183
|
+
val[_key] = LogHandlerPM(**_handler)
|
|
160
184
|
|
|
161
185
|
return val
|
|
162
186
|
|
|
163
187
|
|
|
164
188
|
__all__ = [
|
|
165
189
|
"LoggerConfigPM",
|
|
190
|
+
"InterceptConfigPM",
|
|
191
|
+
"get_default_handlers",
|
|
166
192
|
]
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class LogHandlerTypeEnum(str, Enum):
|
|
5
|
+
STD = "STD"
|
|
6
|
+
FILE = "FILE"
|
|
7
|
+
SOCKET = "SOCKET"
|
|
8
|
+
HTTP = "HTTP"
|
|
9
|
+
SYSLOG = "SYSLOG"
|
|
10
|
+
QUEUE = "QUEUE"
|
|
11
|
+
MEMORY = "MEMORY"
|
|
12
|
+
NULL = "NULL"
|
|
13
|
+
CUSTOM = "CUSTOM"
|
|
14
|
+
UNKNOWN = "UNKNOWN"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class LogLevelEnum(str, Enum):
|
|
18
|
+
TRACE = "TRACE"
|
|
19
|
+
DEBUG = "DEBUG"
|
|
20
|
+
INFO = "INFO"
|
|
21
|
+
SUCCESS = "SUCCESS"
|
|
22
|
+
WARNING = "WARNING"
|
|
23
|
+
ERROR = "ERROR"
|
|
24
|
+
CRITICAL = "CRITICAL"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
DEFAULT_LOGURU_HANDLER_NAME = "default.loguru.std_handler"
|
|
28
|
+
DEFAULT_ALL_STD_HANDLER_NAME = "default.all.std_handler"
|
|
29
|
+
DEFAULT_ALL_FILE_HANDLER_NAME = "default.all.file_handler"
|
|
30
|
+
DEFAULT_ERR_FILE_HANDLER_NAME = "default.err.file_handler"
|
|
31
|
+
DEFAULT_ALL_JSON_HANDLER_NAME = "default.all.json_handler"
|
|
32
|
+
DEFAULT_ERR_JSON_HANDLER_NAME = "default.err.json_handler"
|
|
33
|
+
DEFAULT_NO_HANDLER_NAME_PREFIX = "log_handler."
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
"LogHandlerTypeEnum",
|
|
38
|
+
"LogLevelEnum",
|
|
39
|
+
"DEFAULT_LOGURU_HANDLER_NAME",
|
|
40
|
+
"DEFAULT_ALL_STD_HANDLER_NAME",
|
|
41
|
+
"DEFAULT_ALL_FILE_HANDLER_NAME",
|
|
42
|
+
"DEFAULT_ERR_FILE_HANDLER_NAME",
|
|
43
|
+
"DEFAULT_ALL_JSON_HANDLER_NAME",
|
|
44
|
+
"DEFAULT_ERR_JSON_HANDLER_NAME",
|
|
45
|
+
"DEFAULT_NO_HANDLER_NAME_PREFIX",
|
|
46
|
+
]
|
|
@@ -45,7 +45,7 @@ class InterceptHandler(Handler):
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
@validate_call
|
|
48
|
-
def
|
|
48
|
+
def add_intercepter(config: LoggerConfigPM) -> None:
|
|
49
49
|
"""Initialize log interceptor based on provided config.
|
|
50
50
|
|
|
51
51
|
Args:
|
|
@@ -102,5 +102,5 @@ def init_intercepter(config: LoggerConfigPM) -> None:
|
|
|
102
102
|
|
|
103
103
|
__all__ = [
|
|
104
104
|
"InterceptHandler",
|
|
105
|
-
"
|
|
105
|
+
"add_intercepter",
|
|
106
106
|
]
|
beans_logging/schemas.py
CHANGED
|
@@ -19,7 +19,7 @@ if TYPE_CHECKING:
|
|
|
19
19
|
from loguru import Record, Message
|
|
20
20
|
from pydantic import BaseModel, Field, ConfigDict, model_validator
|
|
21
21
|
|
|
22
|
-
from .
|
|
22
|
+
from .constants import LogHandlerTypeEnum, LogLevelEnum
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class ExtraBaseModel(BaseModel):
|
|
@@ -94,11 +94,7 @@ class LoguruHandlerPM(ExtraBaseModel):
|
|
|
94
94
|
|
|
95
95
|
|
|
96
96
|
class LogHandlerPM(LoguruHandlerPM):
|
|
97
|
-
|
|
98
|
-
default=LogHandlerTypeEnum.UNKNOWN,
|
|
99
|
-
validation_alias="type",
|
|
100
|
-
serialization_alias="type",
|
|
101
|
-
)
|
|
97
|
+
h_type: LogHandlerTypeEnum = Field(default=LogHandlerTypeEnum.UNKNOWN)
|
|
102
98
|
sink: _SinkType | None = Field(default=None)
|
|
103
99
|
level: str | int | LogLevelEnum | None = Field(default=None)
|
|
104
100
|
custom_serialize: bool | None = Field(default=None)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: beans_logging
|
|
3
|
-
Version:
|
|
3
|
+
Version: 8.0.1
|
|
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
|
|
@@ -25,7 +25,7 @@ Requires-Dist: pydantic[timezone]<3.0.0,>=2.5.3
|
|
|
25
25
|
Requires-Dist: loguru<1.0.0,>=0.7.3
|
|
26
26
|
Requires-Dist: potato_util<1.0.0,>=0.2.0
|
|
27
27
|
Provides-Extra: fastapi
|
|
28
|
-
Requires-Dist: beans-logging-fastapi<
|
|
28
|
+
Requires-Dist: beans-logging-fastapi<4.0.0,>=3.0.0; extra == "fastapi"
|
|
29
29
|
Provides-Extra: test
|
|
30
30
|
Requires-Dist: pytest<10.0.0,>=8.0.2; extra == "test"
|
|
31
31
|
Requires-Dist: pytest-cov<8.0.0,>=5.0.0; extra == "test"
|
|
@@ -102,42 +102,7 @@ It is a `Loguru` based custom logging package for python projects.
|
|
|
102
102
|
- Install [**git**](https://git-scm.com/downloads)
|
|
103
103
|
- Setup an [**SSH key**](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh)
|
|
104
104
|
|
|
105
|
-
### 2.
|
|
106
|
-
|
|
107
|
-
[TIP] Skip this step, if you're going to install the package directly from **PyPi** or **GitHub** repository.
|
|
108
|
-
|
|
109
|
-
**2.1.** Prepare projects directory (if not exists):
|
|
110
|
-
|
|
111
|
-
```sh
|
|
112
|
-
# Create projects directory:
|
|
113
|
-
mkdir -pv ~/workspaces/projects
|
|
114
|
-
|
|
115
|
-
# Enter into projects directory:
|
|
116
|
-
cd ~/workspaces/projects
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
**2.2.** Follow one of the below options **[A]**, **[B]** or **[C]**:
|
|
120
|
-
|
|
121
|
-
**OPTION A.** Clone the repository:
|
|
122
|
-
|
|
123
|
-
```sh
|
|
124
|
-
git clone https://github.com/bybatkhuu/module-python-logging.git && \
|
|
125
|
-
cd module-python-logging
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**OPTION B.** Clone the repository (for **DEVELOPMENT**: git + ssh key):
|
|
129
|
-
|
|
130
|
-
```sh
|
|
131
|
-
git clone git@github.com:bybatkhuu/module-python-logging.git && \
|
|
132
|
-
cd module-python-logging
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
**OPTION C.** Download source code:
|
|
136
|
-
|
|
137
|
-
1. Download archived **zip** file from [**releases**](https://github.com/bybatkhuu/module-python-logging/releases).
|
|
138
|
-
2. Extract it into the projects directory.
|
|
139
|
-
|
|
140
|
-
### 3. 📦 Install the package
|
|
105
|
+
### 2. 📦 Install the package
|
|
141
106
|
|
|
142
107
|
[NOTE] Choose one of the following methods to install the package **[A ~ F]**:
|
|
143
108
|
|
|
@@ -156,6 +121,9 @@ pip install git+https://github.com/bybatkhuu/module-python-logging.git
|
|
|
156
121
|
**OPTION C.** Install from the downloaded **source code**:
|
|
157
122
|
|
|
158
123
|
```sh
|
|
124
|
+
git clone https://github.com/bybatkhuu/module-python-logging.git && \
|
|
125
|
+
cd ./module-python-logging
|
|
126
|
+
|
|
159
127
|
# Install directly from the source code:
|
|
160
128
|
pip install .
|
|
161
129
|
|
|
@@ -339,30 +307,30 @@ logger:
|
|
|
339
307
|
mute_modules: []
|
|
340
308
|
handlers:
|
|
341
309
|
default.all.std_handler:
|
|
342
|
-
|
|
310
|
+
enabled: true
|
|
311
|
+
h_type: STD
|
|
343
312
|
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
313
|
colorize: true
|
|
345
|
-
enabled: true
|
|
346
314
|
default.all.file_handler:
|
|
347
|
-
type: FILE
|
|
348
|
-
sink: "{app_name}.all.log"
|
|
349
315
|
enabled: false
|
|
316
|
+
h_type: FILE
|
|
317
|
+
sink: "{app_name}.all.log"
|
|
350
318
|
default.err.file_handler:
|
|
351
|
-
|
|
319
|
+
enabled: false
|
|
320
|
+
h_type: FILE
|
|
352
321
|
sink: "{app_name}.err.log"
|
|
353
322
|
error: true
|
|
354
|
-
enabled: false
|
|
355
323
|
default.all.json_handler:
|
|
356
|
-
type: FILE
|
|
357
|
-
sink: "json/{app_name}.json.all.log"
|
|
358
|
-
serialize: true
|
|
359
324
|
enabled: false
|
|
325
|
+
h_type: FILE
|
|
326
|
+
sink: "json/{app_name}.all.json.log"
|
|
327
|
+
serialize: true
|
|
360
328
|
default.err.json_handler:
|
|
361
|
-
|
|
362
|
-
|
|
329
|
+
enabled: false
|
|
330
|
+
h_type: FILE
|
|
331
|
+
sink: "json/{app_name}.err.json.log"
|
|
363
332
|
serialize: true
|
|
364
333
|
error: true
|
|
365
|
-
enabled: false
|
|
366
334
|
extra:
|
|
367
335
|
```
|
|
368
336
|
|
|
@@ -415,7 +383,7 @@ To build the documentation, run the following command:
|
|
|
415
383
|
pip install -r ./requirements/requirements.docs.txt
|
|
416
384
|
|
|
417
385
|
# Serve documentation locally (for development):
|
|
418
|
-
mkdocs serve -a 0.0.0.0:8000
|
|
386
|
+
mkdocs serve -a 0.0.0.0:8000 --livereload
|
|
419
387
|
# Or use the docs script:
|
|
420
388
|
./scripts/docs.sh
|
|
421
389
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
beans_logging/__init__.py,sha256=evD0GgFDj9LjQPuJLP_9uEYBPAlU04-nD5Rq1n76Utg,405
|
|
2
|
+
beans_logging/__version__.py,sha256=qR-61NMOca8p2Rty8s6xwXQSXLDufw2os6i4zdyqfak,22
|
|
3
|
+
beans_logging/_builder.py,sha256=Pg9fXFPMCe4o-hl1xJPajSTmdglJ0Emofxdzuod_9xM,3935
|
|
4
|
+
beans_logging/_core.py,sha256=lG-wRvQ6vz4rS2Je74MAg80xmdHx2Iue9LHOh2S7zYc,9746
|
|
5
|
+
beans_logging/auto.py,sha256=MoNuQomiIFWQVpNTkOmFFVMo00HBlErfHC728GFOyqc,218
|
|
6
|
+
beans_logging/config.py,sha256=NpZo0wiwsYe25OyPMoHRtkbVG6UxuEHEfO3w7O1kbWM,6102
|
|
7
|
+
beans_logging/constants.py,sha256=Ztt08flQ-378TMYiasAI5pUvLxKJ3p0WEb0w71wXKsE,1169
|
|
8
|
+
beans_logging/filters.py,sha256=-Rys2rwuT7EUvuEA19jnhW6enIEkDuPzeGbAAz6RJSc,3720
|
|
9
|
+
beans_logging/formats.py,sha256=Vrr4RkCfiJl-oi6BLVxeR-k0WhTR0oBI4mpsWgBJBNE,1624
|
|
10
|
+
beans_logging/intercepters.py,sha256=9tgyNXE7d_OlHUl9IJ2yEeDmUWZBYGYCWXMT3r58_RM,3247
|
|
11
|
+
beans_logging/rotators.py,sha256=lzR31sdEPTZVDkyhC81FL4OnezIVKlElGJDRA2Svn2I,2121
|
|
12
|
+
beans_logging/schemas.py,sha256=7C8PKwWVnayX4NmPA-mKajB4Lrksgr0QUJGjbEU5mro,4360
|
|
13
|
+
beans_logging/sinks.py,sha256=7Guusg3N1S-28hLnRzuunP8lXnhexzny3aj-AR0HhuQ,482
|
|
14
|
+
beans_logging-8.0.1.dist-info/licenses/LICENSE.txt,sha256=CUTK-r0BWIg1r0bBiemAcMhakgV0N7HuRhw6rQ-A9A4,1074
|
|
15
|
+
beans_logging-8.0.1.dist-info/METADATA,sha256=qkjMNb1ooiX6LR1ceDU1IlMWFXyemZcZDTTHrgxhEnA,12281
|
|
16
|
+
beans_logging-8.0.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
17
|
+
beans_logging-8.0.1.dist-info/top_level.txt,sha256=lx8JEqYGNha1sYbVrTtMo2Z01A7Shq8hX6bfsuKLTG8,14
|
|
18
|
+
beans_logging-8.0.1.dist-info/RECORD,,
|
beans_logging/_constants.py
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class LogHandlerTypeEnum(str, Enum):
|
|
5
|
-
STD = "STD"
|
|
6
|
-
FILE = "FILE"
|
|
7
|
-
SOCKET = "SOCKET"
|
|
8
|
-
HTTP = "HTTP"
|
|
9
|
-
SYSLOG = "SYSLOG"
|
|
10
|
-
QUEUE = "QUEUE"
|
|
11
|
-
MEMORY = "MEMORY"
|
|
12
|
-
NULL = "NULL"
|
|
13
|
-
CUSTOM = "CUSTOM"
|
|
14
|
-
UNKNOWN = "UNKNOWN"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class LogLevelEnum(str, Enum):
|
|
18
|
-
TRACE = "TRACE"
|
|
19
|
-
DEBUG = "DEBUG"
|
|
20
|
-
INFO = "INFO"
|
|
21
|
-
SUCCESS = "SUCCESS"
|
|
22
|
-
WARNING = "WARNING"
|
|
23
|
-
ERROR = "ERROR"
|
|
24
|
-
CRITICAL = "CRITICAL"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
__all__ = [
|
|
28
|
-
"LogHandlerTypeEnum",
|
|
29
|
-
"LogLevelEnum",
|
|
30
|
-
]
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
beans_logging/__init__.py,sha256=KOXpuCNTMsdlY9MF6ONwRjM5O1_JCkIzt_qetb2BFTw,261
|
|
2
|
-
beans_logging/__version__.py,sha256=vrQk6cOG_uk0gOqN4qh7NRCxezXfvhv9tT7bwYHyTck,22
|
|
3
|
-
beans_logging/_builder.py,sha256=6v9i6zJIVQPOElZ4x3cI-UULx0ae59qWe0E5G5Vy37M,4469
|
|
4
|
-
beans_logging/_constants.py,sha256=rH9ZN-b7GXNXjbpOZUJfsft54Eiy8jnXm82jsFcMo3k,510
|
|
5
|
-
beans_logging/_core.py,sha256=qkGl5NRKY7lKuVatwFmddwxeYS5viU5DDnfKucWK3Mo,9617
|
|
6
|
-
beans_logging/_intercept.py,sha256=TeYze0eXRMVkOoC9Bl2qmaC7fSwExfQAmmGHz5KiuCU,3249
|
|
7
|
-
beans_logging/auto.py,sha256=MoNuQomiIFWQVpNTkOmFFVMo00HBlErfHC728GFOyqc,218
|
|
8
|
-
beans_logging/config.py,sha256=E_bQy-sJxTIjhpOXOTm-gg5zOcOplcBnCprdl7xDvaY,5534
|
|
9
|
-
beans_logging/filters.py,sha256=-Rys2rwuT7EUvuEA19jnhW6enIEkDuPzeGbAAz6RJSc,3720
|
|
10
|
-
beans_logging/formats.py,sha256=Vrr4RkCfiJl-oi6BLVxeR-k0WhTR0oBI4mpsWgBJBNE,1624
|
|
11
|
-
beans_logging/rotators.py,sha256=lzR31sdEPTZVDkyhC81FL4OnezIVKlElGJDRA2Svn2I,2121
|
|
12
|
-
beans_logging/schemas.py,sha256=b4igq8CkAzn7CGOBDc09hW0YTvWyuWRe97fpv_OaNdk,4444
|
|
13
|
-
beans_logging/sinks.py,sha256=7Guusg3N1S-28hLnRzuunP8lXnhexzny3aj-AR0HhuQ,482
|
|
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
|