From dbb536f08b2921ddc343077129130c8e05e4c12e Mon Sep 17 00:00:00 2001
From: Michael Boniface <m.j.boniface@soton.ac.uk>
Date: Tue, 18 Feb 2025 18:12:18 +0000
Subject: [PATCH] added initial logging setup but not updated any of the print
 statements yet as this breaks the tests which rely on sysout

---
 .gitignore         |  1 +
 acmc.py            |  8 +++++++-
 logging_config.py  | 30 ++++++++++++++++++++++++++++++
 phen.py            |  7 ++++++-
 tests/test_acmc.py |  8 ++++++++
 5 files changed, 52 insertions(+), 2 deletions(-)
 create mode 100644 logging_config.py

diff --git a/.gitignore b/.gitignore
index b288717..a6a439e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,6 +11,7 @@ __pycache__
 *.bak
 *.save*
 ~$*
+*.log
 
 # Build and output files
 build/*
diff --git a/acmc.py b/acmc.py
index f242887..528eaed 100644
--- a/acmc.py
+++ b/acmc.py
@@ -1,10 +1,15 @@
 import argparse
+import logging
+from pathlib import Path
 
+# acmc imports
 import trud
 import omop
 import phen
 
-from pathlib import Path
+# setup logging
+from logging_config import setup_logger 
+logger = setup_logger()
 
 BUILD_PATH = Path('build')
 
@@ -61,6 +66,7 @@ def phen_diff(args):
 			 args.phen_dir_old)
 
 def main():
+	logger.info("ACMC Tool")
 	parser = argparse.ArgumentParser(description="ACMC command-line tool")
 	
     # Top-level commands
diff --git a/logging_config.py b/logging_config.py
new file mode 100644
index 0000000..d6bd752
--- /dev/null
+++ b/logging_config.py
@@ -0,0 +1,30 @@
+import logging
+
+DEFAULT_LOG_FILE = "acmc.log"
+
+def setup_logger():
+	# Create a logger
+	logger = logging.getLogger('acmc_logger')
+	logger.setLevel(logging.DEBUG)
+	
+	if not logger.hasHandlers():
+		#Create a file handler that logs to a file
+		file_handler = logging.FileHandler(DEFAULT_LOG_FILE)
+		file_handler.setLevel(logging.DEBUG)
+		
+		# Create a stream handler that prints to the console
+		stream_handler = logging.StreamHandler()
+		stream_handler.setLevel(logging.DEBUG)
+		
+		# Create a formatter for how the log messages should look
+		formatter = logging.Formatter('%(asctime)s - - %(levelname)s - %(message)s')
+		
+		# Add the formatter to both handlers
+		file_handler.setFormatter(formatter)
+		stream_handler.setFormatter(formatter)
+		
+		# Add the handlers to the logger
+		logger.addHandler(file_handler)
+		logger.addHandler(stream_handler)
+	
+	return logger
diff --git a/phen.py b/phen.py
index 03dd22e..f8a436d 100644
--- a/phen.py
+++ b/phen.py
@@ -8,17 +8,22 @@ import sys
 import shutil
 import git
 import re
+import logging
 import requests
 from pathlib import Path
 from urllib.parse import urlparse, urlunparse
 
-# acmc dependencies 
+# acmc imports 
 import trud
 import omop
 from base import log_invalid_code, bcolors, raise_
 from parse import Read2, Read3, Icd10, Snomed, Opcs4, Atc, code_types, vocab_types
 from omop import publish_concept_sets, setup
 
+# setup logging
+from logging_config import setup_logger 
+logger = setup_logger()
+
 pd.set_option("mode.chained_assignment", None)
 
 PHEN_DIR = 'phen'
diff --git a/tests/test_acmc.py b/tests/test_acmc.py
index 4dbcf9e..c084f54 100644
--- a/tests/test_acmc.py
+++ b/tests/test_acmc.py
@@ -2,6 +2,7 @@ import pytest
 import argparse
 import sys
 import shutil
+import logging
 
 import trud
 import omop
@@ -21,6 +22,13 @@ def tmp_dir():
 	# Remove the directory after the test finishes
 	shutil.rmtree(temp_dir)
 
+@pytest.fixture
+def logger():
+	logger = logging.getLogger('acmc_logger')
+	logger.setLevel(logging.DEBUG)
+	stream_handler = logging.StreamHandler(sys.stdout)
+	logger.addHandler(stream_handler)
+
 def test_phen_init_local_default(tmp_dir, monkeypatch, capsys):
 	monkeypatch.setattr(sys, "argv", ["acmc.py", "phen", "init"])
 	# Mock input() to return "yes" to the question about reinitialising the directory 
-- 
GitLab