Cixo Develop 2 недель назад
Родитель
Сommit
637371994f
7 измененных файлов с 94 добавлено и 9 удалено
  1. 4 0
      source/__init__.py
  2. 25 0
      source/async_logger.py
  3. 2 0
      source/file_handler.py
  4. 32 0
      source/log_directory.py
  5. 6 3
      source/logger.py
  6. 20 5
      source/sync_logger.py
  7. 5 1
      tests/002-logger.py

+ 4 - 0
source/__init__.py

@@ -2,3 +2,7 @@ from .handler import handler
 from .stdout_handler import stdout_handler
 from .stderr_handler import stderr_handler
 from .file_handler import file_handler
+from .levels import levels
+from .logger import logger
+from .async_logger import async_logger
+from .sync_logger import sync_logger

+ 25 - 0
source/async_logger.py

@@ -0,0 +1,25 @@
+from .levels import levels
+from .handler import handler
+from .logger import logger
+
+class async_logger(logger):
+    async def info(self, *args, **kwargs) -> None:
+        await self.log(levels.info, *args, **kwargs)
+
+    async def warning(self, *args, **kwargs) -> None:
+        await self.log(levels.warning, *args, **kwargs)
+
+    async def error(self, *args, **kwargs) -> None:
+        await self.log(levels.error, *args, **kwargs)
+
+    async def critical(self, *args, **kwargs) -> None:
+        await self.log(levels.critical, *args, **kwargs)
+
+    async def log(self, level: levels, *args, **kwargs) -> None:
+        await self._write_to_all(self._get_message(level, *args, **kwargs))
+    
+    async def _write_to_all(self, content: str) -> None:
+        for handler in self._get_handlers():
+            await handler.adding(content) 
+
+

+ 2 - 0
source/file_handler.py

@@ -5,6 +5,8 @@ from .handler import handler
 
 class file_handler(handler):    
     def __init__(self, target: pathlib.Path) -> None:
+        super().__init__()
+
         self.__target = target
         self.__handler = None
 

+ 32 - 0
source/log_directory.py

@@ -0,0 +1,32 @@
+import pathlib
+import time
+
+class log_directory:
+    def __init__(self, target: pathlib.Path | None = None) -> None:
+        if target is None:
+            target = pathlib.Path("./logs")
+
+        if not target.is_dir():
+            target.mkdir()
+
+        self.__root = target
+
+    @staticmethod
+    def _ends_with(name: str, ending: str) -> bool:
+        return name[-len(ending):] == ending
+
+    @property
+    def root(self) -> pathlib.Path:
+        return self.__root
+
+    @property
+    def logs(self) -> tuple:
+        return tuple(self.iter_logs())
+
+    def iter_logs(self) -> pathlib.Path:
+        for count in self.__root.iterdir():
+            if self._ends_with(count.name, ".log"):
+                yield self.__root / count
+    
+
+

+ 6 - 3
source/logger.py

@@ -7,20 +7,23 @@ class logger:
     def __init__(self) -> None:
         self.__handlers = set()
 
+    def _get_handlers(self) -> tuple:   
+        return tuple(self.__handlers)
+
     def _get_message(self, level: levels, *args, **kwargs) -> str:
         if len(args) < 1:
             raise RuntimeError("Message or message format is not specified.")
 
-        return (
+        return ( \
             self.__level_name(level) + " " + \
             self.time_stamp + " " + \
-            self.__formater(*args, **kwargs
+            self.__formater(*args, **kwargs) \
         )
 
     @property
     def time_stamp(self) -> str:
         now = time.localtime()
-        formated = time.strftime("%Y-%m-$d %H:%M:%S")
+        formated = time.strftime("%Y-%m-%d %H:%M:%S")
         
         return formated
 

+ 20 - 5
source/sync_logger.py

@@ -1,8 +1,23 @@
-import time
-import pathlib
-
 from .levels import levels
 from .handler import handler
+from .logger import logger
+
+class sync_logger(logger):
+    def info(self, *args, **kwargs) -> None:
+        self.log(levels.info, *args, **kwargs)
+
+    def warning(self, *args, **kwargs) -> None:
+        self.log(levels.warning, *args, **kwargs)
+  
+    def error(self, *args, **kwargs) -> None:
+        self.log(levels.error, *args, **kwargs)
+    
+    def critical(self, *args, **kwargs) -> None:
+        self.log(levels.critical, *args, **kwargs)
+
+    def log(self, level: levels, *args, **kwargs) -> None:
+        self._write_to_all(self._get_message(level, *args, **kwargs))
 
-class sync_logger:
-    pass
+    def _write_to_all(self, content: str) -> None:  
+        for handler in self._get_handlers():
+            handler.add(content)

+ 5 - 1
tests/002-logger.py

@@ -10,7 +10,11 @@ sys.path.append(str(project_dir))
 import source
 
 async def main():
-    log = source.logger(tests_dir / pathlib.Path("002.log"))
+    log = source.async_logger()
+    log.use_handler(source.stdout_handler())
+    log.use_handler(source.stderr_handler())
+    log.use_handler(source.file_handler(tests_dir / pathlib.Path("002.log")))
+
     await log.error("sample")
 
 if __name__ == "__main__":