diff --git a/src/Model/DB.py b/src/Model/DB.py
index 9405ef78dea59941944b83cac46adf88a2e99d36..eb836c04e07957244dda1204e651cfdfb61b60a8 100644
--- a/src/Model/DB.py
+++ b/src/Model/DB.py
@@ -2,12 +2,15 @@
 
 import os
 import sqlite3
+import logging
 
 from pathlib import Path
 
 from tools import SQL
 from Model.Except import NotImplementedMethodeError
 
+logger = logging.getLogger()
+
 # Top level model class
 class SQLModel(SQL):
     _sub_classes = []
@@ -22,11 +25,11 @@ class SQLModel(SQL):
         self._cur = self._db.cursor()
 
         if is_new:
-            print("CREATE")
+            logger.info("Create database")
             self._create()      # Create db
             # self._save()        # Save
         else:
-            print("UPDATE")
+            logger.info("Update database")
             self._update()      # Update db scheme if necessary
             # self._load()        # Load data
 
diff --git a/src/View/Configure/Window.py b/src/View/Configure/Window.py
index 69d64a69d5284dc8aaf9fae85012779df885013c..818e5d9c2e9c4170dc68d1e3b006c9a3899ca1f4 100644
--- a/src/View/Configure/Window.py
+++ b/src/View/Configure/Window.py
@@ -1,6 +1,9 @@
 # -*- coding: utf-8 -*-
 
+import logging
+
 from copy import deepcopy
+
 from config import Config
 from View.ASubWindow import ASubWindow
 from View.ListedSubWindow import ListedSubWindow
@@ -27,6 +30,8 @@ from PyQt5.QtWidgets import (
 
 from Solver.Solvers import solver_long_name
 
+logger = logging.getLogger()
+
 class SolverTableModel(QAbstractTableModel):
     def __init__(self, headers=[], rows=[]):
         super(QAbstractTableModel, self).__init__()
@@ -215,7 +220,7 @@ class ConfigureWindow(ASubWindow, ListedSubWindow):
     # Debug
     def set_debug(self):
         self.conf.debug = not self.conf.debug
-        print(f"[DEBUG] Debug mode set : {self.conf.debug}")
+        logger.info(f"Debug mode set : {self.conf.debug}")
         self.parent.setup_debug_mode()
 
     # Solvers
diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py
index e763e9562d9b803ad6df9bddef66fb546a815dba..d44e53f09f2668bc0fae6deedabd8537a7d9a73a 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import os
+import logging
 from queue import Queue
 
 from PyQt5 import QtGui
@@ -39,6 +40,8 @@ from View.Debug.Window import ReplWindow
 
 from Model.Study import Study
 
+logger = logging.getLogger()
+
 no_model_action = [
     "action_menu_new", "action_menu_open", "action_menu_import_mage",
     "action_menu_import_rubarbe", "action_toolBar_open",
@@ -206,6 +209,15 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
         # Maximise window
         self.showMaximized()
 
+    def set_debug_lvl(self, debug = True):
+        if debug:
+            logger.setLevel(logging.DEBUG)
+            logger.info("Set logging level to DEBUG")
+        else:
+            logger.setLevel(logging.INFO)
+            logger.info("Set logging level to INFO")
+
+
     def setup_debug_mode(self, init = False):
         menu = self.findChild(QMenu, "menu_help")
 
@@ -216,11 +228,14 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
 
             if self.conf.debug:
                 menu.addAction(self.debug_action)
+                self.set_debug_lvl(debug = True)
         else:
             if self.conf.debug:
                 menu.addAction(self.debug_action)
+                self.set_debug_lvl(debug = True)
             else:
                 menu.removeAction(self.debug_action)
+                self.set_debug_lvl(debug = False)
 
     #########
     # MODEL #
@@ -283,7 +298,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
             else:
                 self.model.filename = file_name + ".pamhyr"
 
-        print("[INFO] Save...")
+        logger.info("Save...")
         self.model.save()
 
     def save_as_study(self):
@@ -380,7 +395,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
             if dialog.exec_():
                 file_name = dialog.selectedFiles()
                 self.set_model(Study.open(file_name[0]))
-                print(f"[MainWindow] Open Study : {self.model.name}")
+                logger.info(f"Open Study - {self.model.name}")
 
     def open_new_study(self):
         """Open dialog to set new study
diff --git a/src/config.py b/src/config.py
index 24ebebe987ab931887fc02c53da5eba4c29d118c..c865ded27b588fa6de183263d17887870ed6bf66 100644
--- a/src/config.py
+++ b/src/config.py
@@ -2,6 +2,7 @@
 
 import os
 import pickle
+import logging
 
 from tools import SQL
 
@@ -13,13 +14,15 @@ from Solver.Solvers import solver_type_list
 config_dir = "/.cache/pamhyr/"
 config_file = "config.sqlite3"
 
+logger = logging.getLogger()
+
 class Config(SQL):
     def __init__(self):
         self._version = '0.0.1'
         self.filename = Config.filename()
         self.set_default_value()
 
-        print(self.filename)
+        logging.info(f"Configuration file : {self.filename}")
 
         super(Config, self).__init__(filename = self.filename)
 
@@ -61,10 +64,10 @@ class Config(SQL):
         self.commit()
 
     def _update(self):
-        version = self.execute(f"SELECT value FROM info WHERE key='version'")
+        version = self.execute(f"SELECT value FROM info WHERE key='version'")[0]
 
         if version != self._version:
-            print("update")
+            logger.info(f"Configuration file update from {version} to {self._version}...")
 
     def _load_solver(self):
         self._solvers = []
diff --git a/src/pamhyr.py b/src/pamhyr.py
index 6bfa2f9bd191d2ace2db51d63a4b81f64fd18a79..8a832e1885e8ee15e78538720d82f8a3b7993724 100755
--- a/src/pamhyr.py
+++ b/src/pamhyr.py
@@ -3,6 +3,7 @@
 
 import sys, os
 import locale
+import logging
 
 from PyQt5.QtCore import QTranslator
 from PyQt5.QtWidgets import QApplication
@@ -15,6 +16,13 @@ from tools import (
 from View.MainWindow import ApplicationWindow
 from Model.Study import Study
 
+logging.basicConfig(
+    level=logging.DEBUG,
+    format='[PAMHYR][%(levelname)s] %(message)s'
+)
+logger = logging.getLogger()
+logger.setLevel(logging.INFO)
+
 def main():
     conf = Config.load()
     app = QApplication(sys.argv)
@@ -37,7 +45,7 @@ def main():
     if lang_file != "":
         ok = translator.load(lang_file)
         if not ok:
-            print("failed")
+            logger.error("Failed to load translate file")
 
     app.installTranslator(translator)
 
diff --git a/src/tools.py b/src/tools.py
index 410cb7998f113c98f63890ba5da68bfd8c2a5888..701dd23686b18d68c3f0fb1b74aa6b962ab389bb 100644
--- a/src/tools.py
+++ b/src/tools.py
@@ -3,6 +3,7 @@
 import os
 import time
 import sqlite3
+import logging
 import traceback
 
 from datetime import datetime
@@ -16,6 +17,12 @@ from functools import (
     reduce, partial, wraps
 )
 
+###########
+# LOGGING #
+###########
+
+logger = logging.getLogger()
+
 ##########
 # TIMERS #
 ##########
@@ -242,7 +249,7 @@ class SQL(object):
 
     @timer
     def execute(self, cmd, fetch_one = True, commit = False):
-        # print(f"[SQL] {cmd}")
+        logger.debug(f"SQL - {cmd}")
         res = self._cur.execute(cmd)
 
         if commit:
@@ -252,13 +259,13 @@ class SQL(object):
         return value
 
     def _create(self):
-        print("TODO: Create")
+        logger.warning("TODO: Create")
 
     def _update(self):
-        print("TODO: Update")
+        logger.warning("TODO: Update")
 
     def _save(self):
-        print("TODO: Save")
+        logger.warning("TODO: Save")
 
     def _load(self):
-        print("TODO: Load")
+        logger.warning("TODO: LOAD")