瀏覽代碼

added logger config in the settings.json; replaced all prints with app.logger.info/.debug

Dimitri Korsch 3 年之前
父節點
當前提交
63bbf031fe

+ 1 - 1
.pylintrc

@@ -440,7 +440,7 @@ contextmanager-decorators=contextlib.contextmanager
 # List of members which are set dynamically and missed by pylint inference
 # List of members which are set dynamically and missed by pylint inference
 # system, and so shouldn't trigger E1101 when accessed. Python regular
 # system, and so shouldn't trigger E1101 when accessed. Python regular
 # expressions are accepted.
 # expressions are accepted.
-generated-members=
+generated-members=app.logger
 
 
 # Tells whether missing members accessed in mixin class should be ignored. A
 # Tells whether missing members accessed in mixin class should be ignored. A
 # mixin class is detected if its name ends with "mixin" (case insensitive).
 # mixin class is detected if its name ends with "mixin" (case insensitive).

+ 2 - 1
labels/flat_moth_label_provider/moth_labels.py

@@ -1,6 +1,7 @@
 import json
 import json
 import typing as T
 import typing as T
 
 
+from pycs import app
 from pycs.interfaces.LabelProvider import LabelProvider
 from pycs.interfaces.LabelProvider import LabelProvider
 from pathlib import Path
 from pathlib import Path
 
 
@@ -20,7 +21,7 @@ class FlatMothLabels(LabelProvider):
         labels = []
         labels = []
         for key, entries in self.mapping.items():
         for key, entries in self.mapping.items():
             display_name = f"{entries['genus']} {entries['species']} ({entries['kr']})"
             display_name = f"{entries['genus']} {entries['species']} ({entries['kr']})"
-            print(key, display_name)
+            app.logger.debug(key, display_name)
             label = self.create_label(key, display_name)
             label = self.create_label(key, display_name)
             labels.append(label)
             labels.append(label)
 
 

+ 5 - 4
models/fixed_model/Pipeline.py

@@ -2,6 +2,7 @@ from json import dump, load
 from os import path
 from os import path
 from time import sleep
 from time import sleep
 
 
+from pycs import app
 from pycs.interfaces.MediaFile import MediaFile
 from pycs.interfaces.MediaFile import MediaFile
 from pycs.interfaces.MediaStorage import MediaStorage
 from pycs.interfaces.MediaStorage import MediaStorage
 from pycs.interfaces.Pipeline import Pipeline as Interface
 from pycs.interfaces.Pipeline import Pipeline as Interface
@@ -9,14 +10,14 @@ from pycs.interfaces.Pipeline import Pipeline as Interface
 
 
 class Pipeline(Interface):
 class Pipeline(Interface):
     def __init__(self, root_folder, distribution):
     def __init__(self, root_folder, distribution):
-        print('fmv1 init')
+        app.logger.debug('fmv1 init')
         self.root_folder = root_folder
         self.root_folder = root_folder
 
 
     def close(self):
     def close(self):
-        print('fmv1 close')
+        app.logger.debug('fmv1 close')
 
 
     def execute(self, storage: MediaStorage, file: MediaFile):
     def execute(self, storage: MediaStorage, file: MediaFile):
-        print('fmv1 execute')
+        app.logger.debug('fmv1 execute')
 
 
         data_file = path.join(self.root_folder, 'data.json')
         data_file = path.join(self.root_folder, 'data.json')
         if path.exists(data_file):
         if path.exists(data_file):
@@ -33,7 +34,7 @@ class Pipeline(Interface):
                     file.set_image_label(r['label'], r['frame'])
                     file.set_image_label(r['label'], r['frame'])
 
 
     def fit(self, storage: MediaStorage):
     def fit(self, storage: MediaStorage):
-        print('fmv1 fit')
+        app.logger.debug('fmv1 fit')
 
 
         for i in range(10):
         for i in range(10):
             yield i / 10
             yield i / 10

+ 4 - 3
models/haarcascade_frontalface_default/Pipeline.py

@@ -4,6 +4,7 @@ from urllib.request import urlretrieve
 
 
 import cv2
 import cv2
 
 
+from pycs import app
 from pycs.interfaces.MediaFile import MediaFile
 from pycs.interfaces.MediaFile import MediaFile
 from pycs.interfaces.MediaStorage import MediaStorage
 from pycs.interfaces.MediaStorage import MediaStorage
 from pycs.interfaces.Pipeline import Pipeline as Interface
 from pycs.interfaces.Pipeline import Pipeline as Interface
@@ -13,7 +14,7 @@ class Pipeline(Interface):
     URL = 'https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml'
     URL = 'https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml'
 
 
     def __init__(self, root_folder, distribution):
     def __init__(self, root_folder, distribution):
-        print('hcffdv1 init')
+        app.logger.debug('hcffdv1 init')
 
 
         # get path to xml file
         # get path to xml file
         xml_file = path.join(root_folder, 'haarcascade_frontalface_default.xml')
         xml_file = path.join(root_folder, 'haarcascade_frontalface_default.xml')
@@ -26,7 +27,7 @@ class Pipeline(Interface):
         self.face_cascade = cv2.CascadeClassifier(xml_file)
         self.face_cascade = cv2.CascadeClassifier(xml_file)
 
 
     def close(self):
     def close(self):
-        print('hcffdv1 close')
+        app.logger.debug('hcffdv1 close')
 
 
     def collections(self) -> List[dict]:
     def collections(self) -> List[dict]:
         return [
         return [
@@ -35,7 +36,7 @@ class Pipeline(Interface):
         ]
         ]
 
 
     def execute(self, storage: MediaStorage, file: MediaFile):
     def execute(self, storage: MediaStorage, file: MediaFile):
-        print('hcffdv1 execute')
+        app.logger.debug('hcffdv1 execute')
 
 
         # load file and analyze frames
         # load file and analyze frames
         found = False
         found = False

+ 1 - 2
pycs/__init__.py

@@ -15,11 +15,10 @@ from sqlalchemy import event
 from sqlalchemy import pool
 from sqlalchemy import pool
 from sqlalchemy.engine import Engine
 from sqlalchemy.engine import Engine
 
 
-print('- Loading settings')
+print('=== Loading settings ===')
 with open('settings.json') as file:
 with open('settings.json') as file:
     settings = munchify(json.load(file))
     settings = munchify(json.load(file))
 
 
-
 # create projects folder
 # create projects folder
 if not os.path.exists(settings.projects_folder):
 if not os.path.exists(settings.projects_folder):
     os.mkdir(settings.projects_folder)
     os.mkdir(settings.projects_folder)

+ 4 - 2
pycs/frontend/WebServer.py

@@ -1,4 +1,5 @@
 import os
 import os
+import logging.config
 
 
 from glob import glob
 from glob import glob
 
 
@@ -60,11 +61,12 @@ class WebServer:
 
 
     def __init__(self, app, settings: dict, discovery: bool = True):
     def __init__(self, app, settings: dict, discovery: bool = True):
 
 
+        logging.config.dictConfig(settings.logging)
         is_production = os.path.exists('webui/index.html')
         is_production = os.path.exists('webui/index.html')
 
 
         # initialize web server
         # initialize web server
         if is_production:
         if is_production:
-            print('production build')
+            app.logger.info('production build')
 
 
             # find static files and folders
             # find static files and folders
             static_files = {}
             static_files = {}
@@ -94,7 +96,7 @@ class WebServer:
                 return send_from_directory(os.path.join(os.getcwd(), 'webui'), 'index.html')
                 return send_from_directory(os.path.join(os.getcwd(), 'webui'), 'index.html')
 
 
         else:
         else:
-            print('development build')
+            app.logger.info('development build')
 
 
             # create service objects
             # create service objects
             self.__sio = socketio.Server(cors_allowed_origins='*', async_mode='eventlet')
             self.__sio = socketio.Server(cors_allowed_origins='*', async_mode='eventlet')

+ 0 - 1
pycs/frontend/endpoints/data/GetResizedFile.py

@@ -37,5 +37,4 @@ class GetResizedFile(View):
                                                   max_width, max_height)
                                                   max_width, max_height)
 
 
         # send to client
         # send to client
-        print(file_name)
         return send_from_directory(file_directory, file_name)
         return send_from_directory(file_directory, file_name)

+ 18 - 17
pycs/frontend/notifications/NotificationManager.py

@@ -1,5 +1,6 @@
 from socketio import Server
 from socketio import Server
 
 
+from pycs import app
 from pycs.database.File import File
 from pycs.database.File import File
 from pycs.database.Label import Label
 from pycs.database.Label import Label
 from pycs.database.Model import Model
 from pycs.database.Model import Model
@@ -29,7 +30,7 @@ class NotificationManager:
         :param created_job:
         :param created_job:
         :return:
         :return:
         """
         """
-        print('create_job', created_job)
+        app.logger.info(created_job)
         self.__emit('create-job', created_job)
         self.__emit('create-job', created_job)
 
 
     def edit_job(self, edited_job: Job):
     def edit_job(self, edited_job: Job):
@@ -39,7 +40,7 @@ class NotificationManager:
         :param edited_job:
         :param edited_job:
         :return:
         :return:
         """
         """
-        print('edit_job', edited_job)
+        app.logger.info(edited_job)
         self.__emit('edit-job', edited_job)
         self.__emit('edit-job', edited_job)
 
 
     def remove_job(self, removed_job: Job):
     def remove_job(self, removed_job: Job):
@@ -49,7 +50,7 @@ class NotificationManager:
         :param removed_job:
         :param removed_job:
         :return:
         :return:
         """
         """
-        print('remove_job', removed_job)
+        app.logger.info(removed_job)
         self.__emit('remove-job', removed_job)
         self.__emit('remove-job', removed_job)
 
 
     def create_model(self, created_model: Model):
     def create_model(self, created_model: Model):
@@ -59,7 +60,7 @@ class NotificationManager:
         :param created_model:
         :param created_model:
         :return:
         :return:
         """
         """
-        print('create_model', created_model)
+        app.logger.info(created_model)
         self.__emit('create-model', created_model)
         self.__emit('create-model', created_model)
 
 
     def remove_model(self, removed_model: Model):
     def remove_model(self, removed_model: Model):
@@ -69,7 +70,7 @@ class NotificationManager:
         :param removed_model:
         :param removed_model:
         :return:
         :return:
         """
         """
-        print('remove_model', removed_model)
+        app.logger.info(removed_model)
         self.__emit('remove-model', removed_model)
         self.__emit('remove-model', removed_model)
 
 
     def create_project(self, created_project: Project):
     def create_project(self, created_project: Project):
@@ -79,7 +80,7 @@ class NotificationManager:
         :param created_project:
         :param created_project:
         :return:
         :return:
         """
         """
-        print('create_project', created_project)
+        app.logger.info(created_project)
         self.__emit('create-project', created_project)
         self.__emit('create-project', created_project)
 
 
     def remove_project(self, removed_project: Project):
     def remove_project(self, removed_project: Project):
@@ -89,7 +90,7 @@ class NotificationManager:
         :param removed_project:
         :param removed_project:
         :return:
         :return:
         """
         """
-        print('remove_project', removed_project)
+        app.logger.info(removed_project)
         self.__emit('remove-project', removed_project)
         self.__emit('remove-project', removed_project)
 
 
     def edit_project(self, edited_project: Project):
     def edit_project(self, edited_project: Project):
@@ -99,7 +100,7 @@ class NotificationManager:
         :param edited_project:
         :param edited_project:
         :return:
         :return:
         """
         """
-        print('edit_project', edited_project)
+        app.logger.info(edited_project)
         self.__emit('edit-project', edited_project)
         self.__emit('edit-project', edited_project)
 
 
     def create_label(self, created_label: Label):
     def create_label(self, created_label: Label):
@@ -109,7 +110,7 @@ class NotificationManager:
         :param created_label:
         :param created_label:
         :return:
         :return:
         """
         """
-        print('create_label', created_label)
+        app.logger.info(created_label)
         self.__emit('create-label', created_label)
         self.__emit('create-label', created_label)
 
 
     def edit_label(self, edited_label: Label):
     def edit_label(self, edited_label: Label):
@@ -119,7 +120,7 @@ class NotificationManager:
         :param edited_label:
         :param edited_label:
         :return:
         :return:
         """
         """
-        print('edit_label', edited_label)
+        app.logger.info(edited_label)
         self.__emit('edit-label', edited_label)
         self.__emit('edit-label', edited_label)
 
 
     def remove_label(self, removed_label: Label):
     def remove_label(self, removed_label: Label):
@@ -129,7 +130,7 @@ class NotificationManager:
         :param removed_label:
         :param removed_label:
         :return:
         :return:
         """
         """
-        print('remove_label', removed_label)
+        app.logger.info(removed_label)
         self.__emit('remove-label', removed_label)
         self.__emit('remove-label', removed_label)
 
 
     def create_file(self, created_file: File):
     def create_file(self, created_file: File):
@@ -139,7 +140,7 @@ class NotificationManager:
         :param created_file:
         :param created_file:
         :return:
         :return:
         """
         """
-        print('create_file', created_file)
+        app.logger.info(created_file)
         self.__emit('create-file', created_file)
         self.__emit('create-file', created_file)
 
 
     def edit_file(self, edited_file: File):
     def edit_file(self, edited_file: File):
@@ -149,7 +150,7 @@ class NotificationManager:
         :param edited_file:
         :param edited_file:
         :return:
         :return:
         """
         """
-        print('edit_file', edited_file)
+        app.logger.info(edited_file)
         self.__emit('edit-file', edited_file)
         self.__emit('edit-file', edited_file)
 
 
     def remove_file(self, removed_file: File):
     def remove_file(self, removed_file: File):
@@ -159,7 +160,7 @@ class NotificationManager:
         :param removed_file:
         :param removed_file:
         :return:
         :return:
         """
         """
-        print('remove_file', removed_file)
+        app.logger.info(removed_file)
         self.__emit('remove-file', removed_file)
         self.__emit('remove-file', removed_file)
 
 
     def create_result(self, created_result: Result):
     def create_result(self, created_result: Result):
@@ -169,7 +170,7 @@ class NotificationManager:
         :param created_result:
         :param created_result:
         :return:
         :return:
         """
         """
-        print('create_result', created_result)
+        app.logger.info(created_result)
         self.__emit('create-result', created_result)
         self.__emit('create-result', created_result)
 
 
     def edit_result(self, edited_result: Result):
     def edit_result(self, edited_result: Result):
@@ -179,7 +180,7 @@ class NotificationManager:
         :param edited_result:
         :param edited_result:
         :return:
         :return:
         """
         """
-        print('edit_result', edited_result)
+        app.logger.info(edited_result)
         self.__emit('edit-result', edited_result)
         self.__emit('edit-result', edited_result)
 
 
     def remove_result(self, removed_result: Result):
     def remove_result(self, removed_result: Result):
@@ -189,5 +190,5 @@ class NotificationManager:
         :param removed_result:
         :param removed_result:
         :return:
         :return:
         """
         """
-        print('remove_result', removed_result)
+        app.logger.info(removed_result)
         self.__emit('remove-result', removed_result)
         self.__emit('remove-result', removed_result)

+ 0 - 1
pycs/util/FileOperations.py

@@ -230,7 +230,6 @@ def crop_image(file_path: str, target_path: str, box: BoundingBox) -> bool:
     crop_y2 = min(int(img_height * box.h) + crop_y1, img_height)
     crop_y2 = min(int(img_height * box.h) + crop_y1, img_height)
 
 
     # crop image
     # crop image
-    print(crop_x1, crop_y1, crop_x2, crop_y2)
     cropped_image = image.crop((crop_x1, crop_y1, crop_x2, crop_y2))
     cropped_image = image.crop((crop_x1, crop_y1, crop_x2, crop_y2))
 
 
     # save to file
     # save to file

+ 4 - 3
pycs/util/PipelineCache.py

@@ -6,6 +6,7 @@ from time import time, sleep
 
 
 from eventlet import tpool, spawn_n
 from eventlet import tpool, spawn_n
 
 
+from pycs import app
 from pycs.database.Project import Project
 from pycs.database.Project import Project
 from pycs.interfaces.Pipeline import Pipeline
 from pycs.interfaces.Pipeline import Pipeline
 from pycs.jobs.JobRunner import JobRunner
 from pycs.jobs.JobRunner import JobRunner
@@ -28,7 +29,7 @@ class PipelineCache:
         self.__lock = Lock()
         self.__lock = Lock()
 
 
         self._cache_time = cache_time or self.CLOSE_TIMER
         self._cache_time = cache_time or self.CLOSE_TIMER
-        print(f"Initialized Pipeline cache (pipelines are closed after {self._cache_time:.3f} sec)")
+        app.logger.info(f"Initialized Pipeline cache (pipelines are closed after {self._cache_time:.3f} sec)")
 
 
     def start(self):
     def start(self):
         """ starts the main worker method """
         """ starts the main worker method """
@@ -110,12 +111,12 @@ class PipelineCache:
             delay = int(timestamp + self._cache_time - time())
             delay = int(timestamp + self._cache_time - time())
 
 
             if delay > 0:
             if delay > 0:
-                print(f"Cache sleeps for {delay:.3f} sec")
+                app.logger.info(f"Cache sleeps for {delay:.3f} sec")
                 sleep(delay)
                 sleep(delay)
 
 
             # lock and access __pipelines
             # lock and access __pipelines
             with self.__lock:
             with self.__lock:
-                print("Removing pipeline from cache")
+                app.logger.info("Removing pipeline from cache")
                 instance = self.__pipelines[root_folder]
                 instance = self.__pipelines[root_folder]
 
 
                 # reference counter greater than 1
                 # reference counter greater than 1

+ 29 - 1
settings.json

@@ -4,5 +4,33 @@
   "allowedOrigins": [],
   "allowedOrigins": [],
   "projects_folder": "projects",
   "projects_folder": "projects",
   "database": "data2.sqlite3",
   "database": "data2.sqlite3",
-  "pipeline_cache_time": 5
+  "pipeline_cache_time": 120,
+
+  "logging": {
+    "version": 1,
+    "formatters": {
+      "default": {
+        "format": "{levelname: ^7s} - [{asctime}] {filename}:L{lineno} [{funcName}]: {message}",
+        "style": "{"
+      }
+    },
+    "handlers": {
+      "console": {
+        "class": "logging.StreamHandler",
+        "stream": "ext://flask.logging.wsgi_errors_stream",
+        "formatter": "default",
+        "level": "INFO"
+      }
+    },
+    "root": {
+      "level": "INFO",
+      "handlers": ["console"]
+    },
+    "loggers": {
+      "sqlalchemy.engine": {
+        "level": "CRITICAL",
+        "handlers": ["console"]
+      }
+    }
+  }
 }
 }

+ 8 - 6
tests/base.py

@@ -1,18 +1,19 @@
+import eventlet
 import os
 import os
 import shutil
 import shutil
-import unittest
-import eventlet
 import typing as T
 import typing as T
+import unittest
+import logging
 
 
-from unittest import mock
 from pathlib import Path
 from pathlib import Path
+from unittest import mock
 
 
 from pycs import app
 from pycs import app
 from pycs import db
 from pycs import db
 from pycs import settings
 from pycs import settings
-from pycs.frontend.WebServer import WebServer
-from pycs.database.Model import Model
 from pycs.database.LabelProvider import LabelProvider
 from pycs.database.LabelProvider import LabelProvider
+from pycs.database.Model import Model
+from pycs.frontend.WebServer import WebServer
 from pycs.util.PipelineCache import PipelineCache
 from pycs.util.PipelineCache import PipelineCache
 
 
 server = None
 server = None
@@ -36,6 +37,7 @@ class BaseTestCase(unittest.TestCase):
     @classmethod
     @classmethod
     def setUpClass(cls, discovery: bool = False):
     def setUpClass(cls, discovery: bool = False):
         global server
         global server
+        app.logger.setLevel(logging.CRITICAL)
         app.config["TESTING"] = True
         app.config["TESTING"] = True
         app.config["WTF_CSRF_ENABLED"] = False
         app.config["WTF_CSRF_ENABLED"] = False
         app.config["DEBUG"] = False
         app.config["DEBUG"] = False
@@ -62,7 +64,7 @@ class BaseTestCase(unittest.TestCase):
             ready = True
             ready = True
             for job in self.server.jobs.list():
             for job in self.server.jobs.list():
                 if job.finished is None:
                 if job.finished is None:
-                    print(f"{job} is not finished!")
+                    app.logger.debug(f"{job} is not finished!")
                     ready = False
                     ready = False
                     break
                     break
 
 

+ 3 - 2
tests/client/test_models/simple_model/model.py

@@ -1,3 +1,4 @@
+from pycs import app
 
 
 from pycs.interfaces.Pipeline import Pipeline
 from pycs.interfaces.Pipeline import Pipeline
 from pycs.interfaces.MediaFile import MediaFile
 from pycs.interfaces.MediaFile import MediaFile
@@ -10,10 +11,10 @@ class Model(Pipeline):
 
 
 
 
     def close(self):
     def close(self):
-        print("Closing")
+        app.logger.debug("closing model")
 
 
     def execute(self, storage: MediaStorage, file: MediaFile):
     def execute(self, storage: MediaStorage, file: MediaFile):
         file.add_bounding_box(0, 0, 1, 1/3)
         file.add_bounding_box(0, 0, 1, 1/3)
 
 
     def fit(self, storage: MediaStorage):
     def fit(self, storage: MediaStorage):
-        print("fitting model")
+        app.logger.debug("fitting model")