diff --git a/.gitignore b/.gitignore
index b2887177c433b7bf0e951d5c43a25ff877360aa9..a6a439e6a0c769befb3929b1a5ddd1b590ec861d 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 f242887dff30492f277c359e476df1c198736a6a..528eaed42346247deca26a607de25d23d2934a1d 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 0000000000000000000000000000000000000000..d6bd75243bffe5ba9647b7282c5d56275e74a71a
--- /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 03dd22efaa0a83a953afd35f15e9159764fc79fb..f8a436d59eb21b4aa2bc010f219e92ef8dc37a65 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 4dbcf9e9fb006382af79a477618ef87d28ae69be..c084f54312584584ad6a647c781b4b9b1919a6ee 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