Skip to content

Commit 941c671

Browse files
authored
Merge pull request #36 from bybatkhuu/dev
Streamline log path handling and simplify logger configuration
2 parents 3965f6b + 6d4474b commit 941c671

File tree

4 files changed

+63
-112
lines changed

4 files changed

+63
-112
lines changed

README.md

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -261,22 +261,13 @@ logger:
261261
level:
262262
base: INFO
263263
err: WARNING
264-
std:
265-
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>"
266-
colorize: true
267264
format_str: "[{time:YYYY-MM-DD HH:mm:ss.SSS Z} | {extra[level_short]:<5} | {name}:{line}]: {message}"
268265
file:
269266
logs_dir: "./logs"
270267
rotate_size: 10000000
271268
rotate_time: "00:00:00"
272269
retention: 90
273270
encoding: utf8
274-
plain:
275-
log_path: "{app_name}.all.log"
276-
err_path: "{app_name}.err.log"
277-
json:
278-
log_path: "json/{app_name}.json.all.log"
279-
err_path: "json/{app_name}.json.err.log"
280271
custom_serialize: false
281272
intercept:
282273
enabled: true
@@ -287,20 +278,26 @@ logger:
287278
handlers:
288279
default.all.std_handler:
289280
type: STD
281+
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>"
282+
colorize: true
290283
enabled: true
291284
default.all.file_handler:
292285
type: FILE
286+
sink: "{app_name}.all.log"
293287
enabled: false
294288
default.err.file_handler:
295289
type: FILE
290+
sink: "{app_name}.err.log"
296291
error: true
297292
enabled: false
298293
default.all.json_handler:
299294
type: FILE
295+
sink: "json/{app_name}.json.all.log"
300296
serialize: true
301297
enabled: false
302298
default.err.json_handler:
303299
type: FILE
300+
sink: "json/{app_name}.json.err.log"
304301
serialize: true
305302
error: true
306303
enabled: false

src/beans_logging/_builder.py

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22
from typing import Any
3+
from pathlib import Path
34

45
from pydantic import validate_call
56

@@ -39,40 +40,24 @@ def build_handler(handler: LogHandlerPM, config: LoggerConfigPM) -> dict[str, An
3940
if _handler_dict.get("sink") is None:
4041
if _handler_dict.get("type") == LogHandlerTypeEnum.STD:
4142
_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
7143
else:
7244
raise ValueError(
73-
"'sink' attribute is empty, required for any log handler except std and file handlers!"
45+
"'sink' attribute is empty, required for any log handler except std handler!"
7446
)
7547

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+
7661
if _handler_dict.get("level") is None:
7762
if _handler_dict.get("error"):
7863
_handler_dict["level"] = config.default.level.err
@@ -89,10 +74,7 @@ def build_handler(handler: LogHandlerPM, config: LoggerConfigPM) -> dict[str, An
8974
_handler_dict["format"] = json_formatter
9075

9176
if (_handler_dict.get("format") is None) and (not _handler_dict.get("serialize")):
92-
if _handler_dict.get("type") == LogHandlerTypeEnum.STD:
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
9678

9779
if _handler_dict.get("filter") is None:
9880
if _handler_dict.get("type") == LogHandlerTypeEnum.STD:
@@ -120,11 +102,6 @@ def build_handler(handler: LogHandlerPM, config: LoggerConfigPM) -> dict[str, An
120102
):
121103
_handler_dict["diagnose"] = True
122104

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-
128105
if _handler_dict.get("type") == LogHandlerTypeEnum.FILE:
129106
if _handler_dict.get("enqueue") is None:
130107
_handler_dict["enqueue"] = True

src/beans_logging/config.py

Lines changed: 35 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
import sys
1+
import os
22
import datetime
33
from typing import Any
44

5-
if sys.version_info >= (3, 11):
6-
from typing import Self
7-
else:
8-
from typing_extensions import Self
9-
105
import potato_util as utils
11-
from pydantic import Field, model_validator, field_validator
6+
from pydantic import Field, field_validator
127

138
from ._constants import LogHandlerTypeEnum, LogLevelEnum
149
from .schemas import ExtraBaseModel, LogHandlerPM, LoguruHandlerPM
@@ -22,53 +17,46 @@ def _get_handlers() -> dict[str, LogHandlerPM]:
2217
"""
2318

2419
_log_handlers: dict[str, LogHandlerPM] = {
25-
"default.all.std_handler": LogHandlerPM(type_=LogHandlerTypeEnum.STD),
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+
),
2628
"default.all.file_handler": LogHandlerPM(
27-
type_=LogHandlerTypeEnum.FILE, enabled=False
29+
type_=LogHandlerTypeEnum.FILE,
30+
sink="{app_name}.all.log",
31+
enabled=False,
2832
),
2933
"default.err.file_handler": LogHandlerPM(
30-
type_=LogHandlerTypeEnum.FILE, error=True, enabled=False
34+
type_=LogHandlerTypeEnum.FILE,
35+
sink="{app_name}.err.log",
36+
error=True,
37+
enabled=False,
3138
),
3239
"default.all.json_handler": LogHandlerPM(
33-
type_=LogHandlerTypeEnum.FILE, serialize=True, enabled=False
40+
type_=LogHandlerTypeEnum.FILE,
41+
sink="json/{app_name}.json.all.log",
42+
serialize=True,
43+
enabled=False,
3444
),
3545
"default.err.json_handler": LogHandlerPM(
36-
type_=LogHandlerTypeEnum.FILE, serialize=True, error=True, enabled=False
46+
type_=LogHandlerTypeEnum.FILE,
47+
sink="json/{app_name}.json.err.log",
48+
serialize=True,
49+
error=True,
50+
enabled=False,
3751
),
3852
}
3953

4054
return _log_handlers
4155

4256

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-
6957
class FileConfigPM(ExtraBaseModel):
7058
logs_dir: str = Field(
71-
default="./logs",
59+
default_factory=lambda: os.path.join(os.getcwd(), "logs"),
7260
min_length=2,
7361
max_length=1024,
7462
)
@@ -79,21 +67,6 @@ class FileConfigPM(ExtraBaseModel):
7967
retention: int = Field(default=90, ge=1)
8068
encoding: str = Field(default="utf8", min_length=2, max_length=31)
8169

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-
9770
@field_validator("rotate_time", mode="before")
9871
@classmethod
9972
def _check_rotate_time(cls, val: Any) -> Any:
@@ -102,6 +75,14 @@ def _check_rotate_time(cls, val: Any) -> Any:
10275

10376
return val
10477

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+
10586

10687
class LevelConfigPM(ExtraBaseModel):
10788
base: str | int | LogLevelEnum = Field(default=LogLevelEnum.INFO)
@@ -123,7 +104,6 @@ def _check_level(cls, val: Any) -> Any:
123104

124105
class DefaultConfigPM(ExtraBaseModel):
125106
level: LevelConfigPM = Field(default_factory=LevelConfigPM)
126-
std: StdConfigPM = Field(default_factory=StdConfigPM)
127107
format_str: str = Field(
128108
default="[{time:YYYY-MM-DD HH:mm:ss.SSS Z} | {extra[level_short]:<5} | {name}:{line}]: {message}",
129109
min_length=8,

templates/configs/logger.yml

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,13 @@ logger:
44
level:
55
base: INFO
66
err: WARNING
7-
std:
8-
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>"
9-
colorize: true
107
format_str: "[{time:YYYY-MM-DD HH:mm:ss.SSS Z} | {extra[level_short]:<5} | {name}:{line}]: {message}"
118
file:
129
logs_dir: "./logs"
1310
rotate_size: 10000000
1411
rotate_time: "00:00:00"
1512
retention: 90
1613
encoding: utf8
17-
plain:
18-
log_path: "{app_name}.all.log"
19-
err_path: "{app_name}.err.log"
20-
json:
21-
log_path: "json/{app_name}.json.all.log"
22-
err_path: "json/{app_name}.json.err.log"
2314
custom_serialize: false
2415
intercept:
2516
enabled: true
@@ -30,20 +21,26 @@ logger:
3021
handlers:
3122
default.all.std_handler:
3223
type: STD
24+
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>"
25+
colorize: true
3326
enabled: true
3427
default.all.file_handler:
3528
type: FILE
29+
sink: "{app_name}.all.log"
3630
enabled: false
3731
default.err.file_handler:
3832
type: FILE
33+
sink: "{app_name}.err.log"
3934
error: true
4035
enabled: false
4136
default.all.json_handler:
4237
type: FILE
38+
sink: "json/{app_name}.json.all.log"
4339
serialize: true
4440
enabled: false
4541
default.err.json_handler:
4642
type: FILE
43+
sink: "json/{app_name}.json.err.log"
4744
serialize: true
4845
error: true
4946
enabled: false

0 commit comments

Comments
 (0)