diff --git a/src/logging.py b/logging.py
similarity index 100%
rename from src/logging.py
rename to logging.py
diff --git a/main.py b/tests/main.py
similarity index 96%
rename from main.py
rename to tests/main.py
index b5dcb31ee0e984b52ea03be72886b31f7e4e4663..eccfe3af0303c856b86c0e6dda18d8f1c212a954 100644
--- a/main.py
+++ b/tests/main.py
@@ -1,5 +1,5 @@
 """
-Descripton here.
+Test logging usage.
 """
 
 # User Imports.
diff --git a/tests/src/logging.py b/tests/src/logging.py
new file mode 100644
index 0000000000000000000000000000000000000000..4441fe0d32034a0cc98793c85609b1eedae8ef35
--- /dev/null
+++ b/tests/src/logging.py
@@ -0,0 +1,119 @@
+"""
+Custom Python logger, defined via a dictionary of logging settings.
+
+https://git.brandon-rodriguez.com/python/custom_logger
+Version 1.0
+"""
+
+
+# System Imports.
+import logging.config, os
+
+
+# Logging Variables.
+project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+logging_directory = os.path.join(project_dir, 'src/logs')
+logging_class = 'logging.handlers.RotatingFileHandler'
+logging_max_bytes = 1024 * 1024 * 10    # Max log file size of 10 MB.
+logging_backup_count = 10               # Keep 10 log files before overwriting.
+
+
+def init_logging(caller):
+    """
+    Returns an instance of the logger.
+    """
+    return logging.getLogger(caller)
+
+
+# Create logging folder if does not exist.
+if not os.path.exists(logging_directory):
+    print('Creating logging folders.')
+    os.makedirs(logging_directory)
+
+
+# Dictionary style logging options.
+LOGGING = {
+    'version': 1,
+    'formatters': {
+        # Minimal logging. Only includes message.
+        # Generally meant for terminal "end user" interface display.
+        'minimal': {
+            'format': '%(message)s',
+        },
+        # Simple logging. Includes message type and actual message.
+        # Generally meant for console logging.
+        'simple': {
+            'format': '[%(levelname)s] [%(filename)s %(lineno)d]: %(message)s',
+        },
+        # Basic logging. Includes date, message type, file originated, and actual message.
+        # Generally meant for file logging.
+        'standard': {
+            'format': '%(asctime)s [%(levelname)s] [%(name)s %(lineno)d]: %(message)s',
+        },
+        # Verbose logging. Includes standard plus the process number and thread id.
+        # For when you wanna be really verbose.
+        'verbose': {
+            'format': '%(asctime)s [%(levelname)s] [%(name)s %(lineno)d] || %(process)d %(thread)d || %(message)s'
+        },
+    },
+    'handlers': {
+        # Sends log message to the void. May be useful for debugging.
+        'null': {
+            'class': 'logging.NullHandler',
+        },
+        # To console.
+        'console': {
+            'level': 'INFO',
+            'class': 'logging.StreamHandler',
+            'formatter': 'simple',
+        },
+        # Debug Level - To file.
+        'file_debug': {
+            'level': 'DEBUG',
+            'class': logging_class,
+            'filename': os.path.join(logging_directory, 'debug.log'),
+            'maxBytes': logging_max_bytes,
+            'backupCount': logging_backup_count,
+            'formatter': 'standard',
+        },
+        # Info Level - To file.
+        'file_info': {
+            'level': 'INFO',
+            'class': logging_class,
+            'filename': os.path.join(logging_directory, 'info.log'),
+            'maxBytes': logging_max_bytes,
+            'backupCount': logging_backup_count,
+            'formatter': 'standard',
+        },
+        # Warn Level - To file.
+        'file_warn': {
+            'level': 'WARNING',
+            'class': logging_class,
+            'filename': os.path.join(logging_directory, 'warn.log'),
+            'maxBytes': logging_max_bytes,
+            'backupCount': logging_backup_count,
+            'formatter': 'standard',
+        },
+        # Error Level - To file.
+        'file_error': {
+            'level': 'ERROR',
+            'class': logging_class,
+            'filename': os.path.join(logging_directory, 'error.log'),
+            'maxBytes': logging_max_bytes,
+            'backupCount': logging_backup_count,
+            'formatter': 'standard',
+        },
+    },
+    'loggers': {
+        # All basic logging.
+        '': {
+            'handlers': ['console', 'file_debug', 'file_info', 'file_warn', 'file_error'],
+            'level': 'NOTSET',
+            'propagate': False,
+        }
+    },
+}
+
+
+# Load dictionary of settings into logger.
+logging.config.dictConfig(LOGGING)