diff --git a/CHANGELOG.md b/CHANGELOG.md
index d900ae9552fd364a2bbb0604bde450cbf5385ffa..2b4c8f976e83cfb73ebde3904b6aa5991dfca94c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -74,6 +74,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 * The `identifiable_adapters.IdentifiableAdapter` uses entity ids (negative for
   entities that don't exist remotely) instead of entity objects for keeping
   track of references.
+* Log output is either written to $SHARED_DIR/ (when this variable is set) or just to the terminal.
 
 ### Deprecated ###
 
diff --git a/src/caoscrawler/crawl.py b/src/caoscrawler/crawl.py
index d21e6e2521578dc407e445d8220506677be84e26..c926df4443fa461505d428e1738db43f8683def2 100644
--- a/src/caoscrawler/crawl.py
+++ b/src/caoscrawler/crawl.py
@@ -1550,11 +1550,19 @@ def crawler_main(crawled_directory_path: str,
     try:
         crawler = Crawler(securityMode=securityMode)
 
-        # setup logging and reporting if serverside execution
-        if "SHARED_DIR" in os.environ:
+        if "SHARED_DIR" in os.environ:  # setup logging and reporting if serverside execution
             userlog_public, htmluserlog_public, debuglog_public = configure_server_side_logging()
+            # TODO make this optional
             _create_status_record(
-                get_config_setting("public_host_url") + "/Shared/" + htmluserlog_public, crawler.run_id)
+                get_config_setting("public_host_url") + "/Shared/" + htmluserlog_public,
+                crawler.run_id)
+        else:  # setup stdout logging for other cases
+            root_logger = logging.getLogger()
+            root_logger.setLevel(level=(logging.DEBUG if debug else logging.INFO))
+            handler = logging.StreamHandler(stream=sys.stdout)
+            handler.setLevel(logging.DEBUG if debug else logging.INFO)
+            root_logger.addHandler(handler)
+            logger.handlers.clear()
 
         debug_tree = DebugTree()
         crawled_data = scan_directory(