Browse Source

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

Dimitri Korsch 3 years ago
parent
commit
63bbf031fe

+ 1 - 1
.pylintrc

@@ -440,7 +440,7 @@ contextmanager-decorators=contextlib.contextmanager
 # List of members which are set dynamically and missed by pylint inference
 # system, and so shouldn't trigger E1101 when accessed. Python regular
 # expressions are accepted.
-generated-members=
+generated-members=app.logger
 
 # Tells whether missing members accessed in mixin class should be ignored. A
 # 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 typing as T
 
+from pycs import app
 from pycs.interfaces.LabelProvider import LabelProvider
 from pathlib import Path
 
@@ -20,7 +21,7 @@ class FlatMothLabels(LabelProvider):
         labels = []
         for key, entries in self.mapping.items():
             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)
             labels.append(label)
 

+ 5 - 4
models/fixed_model/Pipeline.py

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

+ 4 - 3
models/haarcascade_frontalface_default/Pipeline.py

@@ -4,6 +4,7 @@ from urllib.request import urlretrieve
 
 import cv2
 
+from pycs import app
 from pycs.interfaces.MediaFile import MediaFile
 from pycs.interfaces.MediaStorage import MediaStorage
 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'
 
     def __init__(self, root_folder, distribution):
-        print('hcffdv1 init')
+        app.logger.debug('hcffdv1 init')
 
         # get path to xml file
         xml_file = path.join(root_folder, 'haarcascade_frontalface_default.xml')
@@ -26,7 +27,7 @@ class Pipeline(Interface):
         self.face_cascade = cv2.CascadeClassifier(xml_file)
 
     def close(self):
-        print('hcffdv1 close')
+        app.logger.debug('hcffdv1 close')
 
     def collections(self) -> List[dict]:
         return [
@@ -35,7 +36,7 @@ class Pipeline(Interface):
         ]
 
     def execute(self, storage: MediaStorage, file: MediaFile):
-        print('hcffdv1 execute')
+        app.logger.debug('hcffdv1 execute')
 
         # load file and analyze frames
         found = False

+ 1 - 2
pycs/__init__.py

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

+ 4 - 2
pycs/frontend/WebServer.py

@@ -1,4 +1,5 @@
 import os
+import logging.config
 
 from glob import glob
 
@@ -60,11 +61,12 @@ class WebServer:
 
     def __init__(self, app, settings: dict, discovery: bool = True):
 
+        logging.config.dictConfig(settings.logging)
         is_production = os.path.exists('webui/index.html')
 
         # initialize web server
         if is_production:
-            print('production build')
+            app.logger.info('production build')
 
             # find static files and folders
             static_files = {}
@@ -94,7 +96,7 @@ class WebServer:
                 return send_from_directory(os.path.join(os.getcwd(), 'webui'), 'index.html')
 
         else:
-            print('development build')
+            app.logger.info('development build')
 
             # create service objects
             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)
 
         # send to client
-        print(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 pycs import app
 from pycs.database.File import File
 from pycs.database.Label import Label
 from pycs.database.Model import Model
@@ -29,7 +30,7 @@ class NotificationManager:
         :param created_job:
         :return:
         """
-        print('create_job', created_job)
+        app.logger.info(created_job)
         self.__emit('create-job', created_job)
 
     def edit_job(self, edited_job: Job):
@@ -39,7 +40,7 @@ class NotificationManager:
         :param edited_job:
         :return:
         """
-        print('edit_job', edited_job)
+        app.logger.info(edited_job)
         self.__emit('edit-job', edited_job)
 
     def remove_job(self, removed_job: Job):
@@ -49,7 +50,7 @@ class NotificationManager:
         :param removed_job:
         :return:
         """
-        print('remove_job', removed_job)
+        app.logger.info(removed_job)
         self.__emit('remove-job', removed_job)
 
     def create_model(self, created_model: Model):
@@ -59,7 +60,7 @@ class NotificationManager:
         :param created_model:
         :return:
         """
-        print('create_model', created_model)
+        app.logger.info(created_model)
         self.__emit('create-model', created_model)
 
     def remove_model(self, removed_model: Model):
@@ -69,7 +70,7 @@ class NotificationManager:
         :param removed_model:
         :return:
         """
-        print('remove_model', removed_model)
+        app.logger.info(removed_model)
         self.__emit('remove-model', removed_model)
 
     def create_project(self, created_project: Project):
@@ -79,7 +80,7 @@ class NotificationManager:
         :param created_project:
         :return:
         """
-        print('create_project', created_project)
+        app.logger.info(created_project)
         self.__emit('create-project', created_project)
 
     def remove_project(self, removed_project: Project):
@@ -89,7 +90,7 @@ class NotificationManager:
         :param removed_project:
         :return:
         """
-        print('remove_project', removed_project)
+        app.logger.info(removed_project)
         self.__emit('remove-project', removed_project)
 
     def edit_project(self, edited_project: Project):
@@ -99,7 +100,7 @@ class NotificationManager:
         :param edited_project:
         :return:
         """
-        print('edit_project', edited_project)
+        app.logger.info(edited_project)
         self.__emit('edit-project', edited_project)
 
     def create_label(self, created_label: Label):
@@ -109,7 +110,7 @@ class NotificationManager:
         :param created_label:
         :return:
         """
-        print('create_label', created_label)
+        app.logger.info(created_label)
         self.__emit('create-label', created_label)
 
     def edit_label(self, edited_label: Label):
@@ -119,7 +120,7 @@ class NotificationManager:
         :param edited_label:
         :return:
         """
-        print('edit_label', edited_label)
+        app.logger.info(edited_label)
         self.__emit('edit-label', edited_label)
 
     def remove_label(self, removed_label: Label):
@@ -129,7 +130,7 @@ class NotificationManager:
         :param removed_label:
         :return:
         """
-        print('remove_label', removed_label)
+        app.logger.info(removed_label)
         self.__emit('remove-label', removed_label)
 
     def create_file(self, created_file: File):
@@ -139,7 +140,7 @@ class NotificationManager:
         :param created_file:
         :return:
         """
-        print('create_file', created_file)
+        app.logger.info(created_file)
         self.__emit('create-file', created_file)
 
     def edit_file(self, edited_file: File):
@@ -149,7 +150,7 @@ class NotificationManager:
         :param edited_file:
         :return:
         """
-        print('edit_file', edited_file)
+        app.logger.info(edited_file)
         self.__emit('edit-file', edited_file)
 
     def remove_file(self, removed_file: File):
@@ -159,7 +160,7 @@ class NotificationManager:
         :param removed_file:
         :return:
         """
-        print('remove_file', removed_file)
+        app.logger.info(removed_file)
         self.__emit('remove-file', removed_file)
 
     def create_result(self, created_result: Result):
@@ -169,7 +170,7 @@ class NotificationManager:
         :param created_result:
         :return:
         """
-        print('create_result', created_result)
+        app.logger.info(created_result)
         self.__emit('create-result', created_result)
 
     def edit_result(self, edited_result: Result):
@@ -179,7 +180,7 @@ class NotificationManager:
         :param edited_result:
         :return:
         """
-        print('edit_result', edited_result)
+        app.logger.info(edited_result)
         self.__emit('edit-result', edited_result)
 
     def remove_result(self, removed_result: Result):
@@ -189,5 +190,5 @@ class NotificationManager:
         :param removed_result:
         :return:
         """
-        print('remove_result', removed_result)
+        app.logger.info(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 image
-    print(crop_x1, crop_y1, crop_x2, crop_y2)
     cropped_image = image.crop((crop_x1, crop_y1, crop_x2, crop_y2))
 
     # 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 pycs import app
 from pycs.database.Project import Project
 from pycs.interfaces.Pipeline import Pipeline
 from pycs.jobs.JobRunner import JobRunner
@@ -28,7 +29,7 @@ class PipelineCache:
         self.__lock = Lock()
 
         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):
         """ starts the main worker method """
@@ -110,12 +111,12 @@ class PipelineCache:
             delay = int(timestamp + self._cache_time - time())
 
             if delay > 0:
-                print(f"Cache sleeps for {delay:.3f} sec")
+                app.logger.info(f"Cache sleeps for {delay:.3f} sec")
                 sleep(delay)
 
             # lock and access __pipelines
             with self.__lock:
-                print("Removing pipeline from cache")
+                app.logger.info("Removing pipeline from cache")
                 instance = self.__pipelines[root_folder]
 
                 # reference counter greater than 1

+ 29 - 1
settings.json

@@ -4,5 +4,33 @@
   "allowedOrigins": [],
   "projects_folder": "projects",
   "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 shutil
-import unittest
-import eventlet
 import typing as T
+import unittest
+import logging
 
-from unittest import mock
 from pathlib import Path
+from unittest import mock
 
 from pycs import app
 from pycs import db
 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.Model import Model
+from pycs.frontend.WebServer import WebServer
 from pycs.util.PipelineCache import PipelineCache
 
 server = None
@@ -36,6 +37,7 @@ class BaseTestCase(unittest.TestCase):
     @classmethod
     def setUpClass(cls, discovery: bool = False):
         global server
+        app.logger.setLevel(logging.CRITICAL)
         app.config["TESTING"] = True
         app.config["WTF_CSRF_ENABLED"] = False
         app.config["DEBUG"] = False
@@ -62,7 +64,7 @@ class BaseTestCase(unittest.TestCase):
             ready = True
             for job in self.server.jobs.list():
                 if job.finished is None:
-                    print(f"{job} is not finished!")
+                    app.logger.debug(f"{job} is not finished!")
                     ready = False
                     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.MediaFile import MediaFile
@@ -10,10 +11,10 @@ class Model(Pipeline):
 
 
     def close(self):
-        print("Closing")
+        app.logger.debug("closing model")
 
     def execute(self, storage: MediaStorage, file: MediaFile):
         file.add_bounding_box(0, 0, 1, 1/3)
 
     def fit(self, storage: MediaStorage):
-        print("fitting model")
+        app.logger.debug("fitting model")