beans-logging 7.1.0__py3-none-any.whl → 8.0.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/__init__.py CHANGED
@@ -1,12 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from .__version__ import __version__
4
- from .config import LoggerConfigPM
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",
@@ -1 +1 @@
1
- __version__ = "7.1.0"
1
+ __version__ = "8.0.0"
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 ._constants import LogHandlerTypeEnum, LogLevelEnum
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
- _handler_dict = handler.model_dump(by_alias=True, exclude_none=True)
39
-
40
- if _handler_dict.get("sink") is None:
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 = _handler_dict.get("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
- _handler_dict["sink"] = _sink
57
+ handler.sink = _sink
60
58
 
61
- if _handler_dict.get("level") is None:
62
- if _handler_dict.get("error"):
63
- _handler_dict["level"] = config.default.level.err
59
+ if handler.level is None:
60
+ if handler.error:
61
+ handler.level = config.default.level.err
64
62
  else:
65
- _handler_dict["level"] = config.default.level.base
63
+ handler.level = config.default.level.base
66
64
 
67
- if (_handler_dict.get("custom_serialize") is None) and _handler_dict.get(
68
- "serialize"
69
- ):
70
- _handler_dict["custom_serialize"] = config.default.custom_serialize
71
-
72
- if _handler_dict.get("custom_serialize"):
73
- _handler_dict["serialize"] = False
74
- _handler_dict["format"] = json_formatter
75
-
76
- if (_handler_dict.get("format") is None) and (not _handler_dict.get("serialize")):
77
- _handler_dict["format"] = config.default.format_str
78
-
79
- if _handler_dict.get("filter") is None:
80
- if _handler_dict.get("type") == LogHandlerTypeEnum.STD:
81
- _handler_dict["filter"] = use_std_filter
82
- elif _handler_dict.get("type") == LogHandlerTypeEnum.FILE:
83
- if _handler_dict.get("serialize") or _handler_dict.get("custom_serialize"):
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
- _handler_dict["filter"] = use_file_json_filter
83
+ handler.filter_ = use_file_json_filter
88
84
  else:
89
- if _handler_dict.get("error"):
90
- _handler_dict["filter"] = use_file_err_filter
85
+ if handler.error:
86
+ handler.filter_ = use_file_err_filter
91
87
  else:
92
- _handler_dict["filter"] = use_file_filter
88
+ handler.filter_ = use_file_filter
93
89
  else:
94
- _handler_dict["filter"] = use_all_filter
90
+ handler.filter_ = use_all_filter
95
91
 
96
- if _handler_dict.get("backtrace") is None:
97
- _handler_dict["backtrace"] = True
92
+ if handler.backtrace is None:
93
+ handler.backtrace = True
98
94
 
99
- if (_handler_dict.get("diagnose") is None) and (
100
- (_handler_dict.get("level") == LogLevelEnum.TRACE)
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
- _handler_dict["diagnose"] = True
98
+ handler.diagnose = True
104
99
 
105
- if _handler_dict.get("type") == LogHandlerTypeEnum.FILE:
106
- if _handler_dict.get("enqueue") is None:
107
- _handler_dict["enqueue"] = True
100
+ if handler.h_type == LogHandlerTypeEnum.FILE:
101
+ if handler.enqueue is None:
102
+ handler.enqueue = True
108
103
 
109
- if _handler_dict.get("rotation") is None:
110
- _handler_dict["rotation"] = Rotator(
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 _handler_dict.get("retention") is None:
116
- _handler_dict["retention"] = config.default.file.retention
117
-
118
- if _handler_dict.get("encoding") is None:
119
- _handler_dict["encoding"] = config.default.file.encoding
120
-
121
- _handler_dict.pop("type", None)
122
- _handler_dict.pop("error", None)
123
- _handler_dict.pop("custom_serialize", None)
124
- _handler_dict.pop("enabled", None)
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 ._intercept import init_intercepter
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 = {"default.loguru_handler": 0}
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 = True) -> "Logger":
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 True.
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
- init_intercepter(config=self.config)
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"log_handler.{uuid.uuid4().hex}"
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 ._constants import LogHandlerTypeEnum, LogLevelEnum
9
- from .schemas import ExtraBaseModel, LogHandlerPM, LoguruHandlerPM
10
-
11
-
12
- def _get_handlers() -> dict[str, LogHandlerPM]:
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
- "default.all.std_handler": LogHandlerPM(
21
- type_=LogHandlerTypeEnum.STD,
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
- "default.all.file_handler": LogHandlerPM(
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
- "default.err.file_handler": LogHandlerPM(
34
- type_=LogHandlerTypeEnum.FILE,
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
- "default.all.json_handler": LogHandlerPM(
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
- "default.err.json_handler": LogHandlerPM(
46
- type_=LogHandlerTypeEnum.FILE,
47
- sink="json/{app_name}.json.err.log",
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=_get_handlers)
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) -> Any:
140
- if val:
141
- if not isinstance(val, dict):
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(val).__name__} is invalid, must be a dict of <LogHandlerPM>, "
144
- f"<LoguruHandlerPM> or dict!"
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
- for _i, _handler in val.items():
148
- if not isinstance(_handler, (LogHandlerPM, LoguruHandlerPM, dict)):
149
- raise TypeError(
150
- f"'handlers' attribute index {_i} type {type(_handler).__name__} is invalid, must be "
151
- f"<LogHandlerPM>, <LoguruHandlerPM> or dict!"
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
- if isinstance(_handler, LoguruHandlerPM):
155
- val[_i] = LogHandlerPM(
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 init_intercepter(config: LoggerConfigPM) -> None:
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
- "init_intercepter",
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 ._constants import LogHandlerTypeEnum, LogLevelEnum
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
- type_: LogHandlerTypeEnum = Field(
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: 7.1.0
3
+ Version: 8.0.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
@@ -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<2.0.0,>=1.0.0; extra == "fastapi"
28
+ Requires-Dist: beans-logging-fastapi<3.0.0,>=1.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"
@@ -38,6 +38,7 @@ Requires-Dist: build<2.0.0,>=1.1.1; extra == "build"
38
38
  Requires-Dist: twine<7.0.0,>=6.0.1; extra == "build"
39
39
  Provides-Extra: docs
40
40
  Requires-Dist: pylint<5.0.0,>=3.0.4; extra == "docs"
41
+ Requires-Dist: click<8.2.2,>=8.0.0; extra == "docs"
41
42
  Requires-Dist: mkdocs-material<10.0.0,>=9.5.50; extra == "docs"
42
43
  Requires-Dist: mkdocs-awesome-nav<4.0.0,>=3.0.0; extra == "docs"
43
44
  Requires-Dist: mkdocstrings[python]<2.0.0,>=0.24.3; extra == "docs"
@@ -52,6 +53,7 @@ Requires-Dist: wheel<1.0.0,>=0.43.0; extra == "dev"
52
53
  Requires-Dist: build<2.0.0,>=1.1.1; extra == "dev"
53
54
  Requires-Dist: twine<7.0.0,>=6.0.1; extra == "dev"
54
55
  Requires-Dist: pylint<5.0.0,>=3.0.4; extra == "dev"
56
+ Requires-Dist: click<8.2.2,>=8.0.0; extra == "dev"
55
57
  Requires-Dist: mkdocs-material<10.0.0,>=9.5.50; extra == "dev"
56
58
  Requires-Dist: mkdocs-awesome-nav<4.0.0,>=3.0.0; extra == "dev"
57
59
  Requires-Dist: mkdocstrings[python]<2.0.0,>=0.24.3; extra == "dev"
@@ -102,42 +104,7 @@ It is a `Loguru` based custom logging package for python projects.
102
104
  - Install [**git**](https://git-scm.com/downloads)
103
105
  - Setup an [**SSH key**](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh)
104
106
 
105
- ### 2. 📥 Download or clone the repository
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
107
+ ### 2. 📦 Install the package
141
108
 
142
109
  [NOTE] Choose one of the following methods to install the package **[A ~ F]**:
143
110
 
@@ -156,6 +123,9 @@ pip install git+https://github.com/bybatkhuu/module-python-logging.git
156
123
  **OPTION C.** Install from the downloaded **source code**:
157
124
 
158
125
  ```sh
126
+ git clone https://github.com/bybatkhuu/module-python-logging.git && \
127
+ cd ./module-python-logging
128
+
159
129
  # Install directly from the source code:
160
130
  pip install .
161
131
 
@@ -339,30 +309,30 @@ logger:
339
309
  mute_modules: []
340
310
  handlers:
341
311
  default.all.std_handler:
342
- type: STD
312
+ enabled: true
313
+ h_type: STD
343
314
  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
315
  colorize: true
345
- enabled: true
346
316
  default.all.file_handler:
347
- type: FILE
348
- sink: "{app_name}.all.log"
349
317
  enabled: false
318
+ h_type: FILE
319
+ sink: "{app_name}.all.log"
350
320
  default.err.file_handler:
351
- type: FILE
321
+ enabled: false
322
+ h_type: FILE
352
323
  sink: "{app_name}.err.log"
353
324
  error: true
354
- enabled: false
355
325
  default.all.json_handler:
356
- type: FILE
357
- sink: "json/{app_name}.json.all.log"
358
- serialize: true
359
326
  enabled: false
327
+ h_type: FILE
328
+ sink: "json/{app_name}.all.json.log"
329
+ serialize: true
360
330
  default.err.json_handler:
361
- type: FILE
362
- sink: "json/{app_name}.json.err.log"
331
+ enabled: false
332
+ h_type: FILE
333
+ sink: "json/{app_name}.err.json.log"
363
334
  serialize: true
364
335
  error: true
365
- enabled: false
366
336
  extra:
367
337
  ```
368
338
 
@@ -415,7 +385,7 @@ To build the documentation, run the following command:
415
385
  pip install -r ./requirements/requirements.docs.txt
416
386
 
417
387
  # Serve documentation locally (for development):
418
- mkdocs serve -a 0.0.0.0:8000
388
+ mkdocs serve -a 0.0.0.0:8000 --livereload
419
389
  # Or use the docs script:
420
390
  ./scripts/docs.sh
421
391
 
@@ -0,0 +1,18 @@
1
+ beans_logging/__init__.py,sha256=evD0GgFDj9LjQPuJLP_9uEYBPAlU04-nD5Rq1n76Utg,405
2
+ beans_logging/__version__.py,sha256=SWqJTEDnx2fOon29wQowBCNjEkhyhMbbqVsSu4EpdWI,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.0.dist-info/licenses/LICENSE.txt,sha256=CUTK-r0BWIg1r0bBiemAcMhakgV0N7HuRhw6rQ-A9A4,1074
15
+ beans_logging-8.0.0.dist-info/METADATA,sha256=P06jptdg47p2ea3XmKb-esErDJ17MZY-Xn0oVpNHYmI,12384
16
+ beans_logging-8.0.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
17
+ beans_logging-8.0.0.dist-info/top_level.txt,sha256=lx8JEqYGNha1sYbVrTtMo2Z01A7Shq8hX6bfsuKLTG8,14
18
+ beans_logging-8.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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,,