1- """
2- Copy this file into your project
3- to manage your logging configuration there.
4- Don't forget to change the name of your app and the names of your loggers here!
5-
6- Use it like this:
7-
8- from logging import getLogger
9- from logging.config import dictConfig as configure_logging
10-
11- from readylog import logging_configuration
12-
13-
14- configure_logging(logging_configuration)
15-
16- logger = getLogger(__name__)
17- """
18-
1+ from collections .abc import Callable
2+ from logging import FileHandler , StreamHandler , _checkLevel , getLevelName
193from pathlib import Path
4+ from sys import modules
205
21- from platformdirs import user_log_dir
226
23- MY_APP_NAME = "MY_APP_NAME" .replace ("-" , "_" )
7+ def create_dict_config (
8+ logfile : Path ,
9+ app_name : str ,
10+ console_log_level : str | int = "WARNING" ,
11+ file_log_level : str | int = "DEBUG" ,
12+ console_handler_factory : Callable = StreamHandler ,
13+ file_handler_factory : Callable = FileHandler ,
14+ ) -> dict [str , str ]:
15+ console_log_level = _checkLevel (console_log_level )
16+ file_log_level = _checkLevel (file_log_level )
17+ min_level = getLevelName (min (console_log_level , file_log_level ))
2418
25- logging_dir = Path (user_log_dir (MY_APP_NAME ))
26- logging_dir .mkdir (parents = True , exist_ok = True )
27- logfile = logging_dir / "debug.log"
28-
29-
30- def create_dict_config (logfile : Path ) -> dict [str , str ]:
3119 custom_file_formatter_conf = {
3220 "format" : "{message:<50s} {levelname:>9s} {asctime}.{msecs:03.0f} {module}({lineno}) {funcName}" ,
3321 "style" : "{" ,
@@ -60,30 +48,30 @@ def create_dict_config(logfile: Path) -> dict[str, str]:
6048 }
6149
6250 custom_console_handler_conf = {
63- "class " : "logging.StreamHandler" ,
64- "level" : "DEBUG" ,
51+ "() " : console_handler_factory ,
52+ "level" : console_log_level ,
6553 "formatter" : "custom_console_formatter" ,
6654 "stream" : "ext://sys.stderr" ,
6755 }
6856
6957 custom_file_handler_conf = {
70- "class " : "logging.FileHandler" ,
71- "level" : "DEBUG" ,
58+ "() " : file_handler_factory ,
59+ "level" : file_log_level ,
7260 "formatter" : "custom_file_formatter" ,
7361 "filename" : logfile ,
7462 "mode" : "w" ,
7563 "encoding" : "utf-8" ,
7664 }
7765
7866 root_console_handler_conf = {
79- "class " : "logging.StreamHandler" ,
67+ "() " : console_handler_factory ,
8068 "level" : "DEBUG" ,
8169 "formatter" : "root_console_formatter" ,
8270 "stream" : "ext://sys.stderr" ,
8371 }
8472
8573 root_file_handler_conf = {
86- "class " : "logging.FileHandler" ,
74+ "() " : file_handler_factory ,
8775 "level" : "DEBUG" ,
8876 "formatter" : "root_file_formatter" ,
8977 "filename" : logfile .with_stem (f"{ logfile .stem } _root" ),
@@ -101,7 +89,7 @@ def create_dict_config(logfile: Path) -> dict[str, str]:
10189 custom_logger_conf = {
10290 "propagate" : False ,
10391 "handlers" : ["custom_file_handler" , "custom_console_handler" ],
104- "level" : "DEBUG" ,
92+ "level" : min_level ,
10593 }
10694
10795 root_logger_conf = {
@@ -110,8 +98,9 @@ def create_dict_config(logfile: Path) -> dict[str, str]:
11098 }
11199
112100 loggers_dict = {
113- MY_APP_NAME : custom_logger_conf ,
101+ app_name : custom_logger_conf ,
114102 "__main__" : custom_logger_conf ,
103+ f"{ modules [__name__ ].__spec__ .parent } .decorators" : custom_logger_conf ,
115104 }
116105
117106 dict_config = {
@@ -125,6 +114,3 @@ def create_dict_config(logfile: Path) -> dict[str, str]:
125114 }
126115
127116 return dict_config
128-
129-
130- logging_configuration = create_dict_config (logfile )
0 commit comments