diff --git a/freqtrade/loggers/__init__.py b/freqtrade/loggers/__init__.py index ba0e23b5e..65162cb0e 100644 --- a/freqtrade/loggers/__init__.py +++ b/freqtrade/loggers/__init__.py @@ -1,4 +1,5 @@ import logging +import sys from logging import Formatter from logging.handlers import RotatingFileHandler, SysLogHandler from pathlib import Path @@ -84,15 +85,27 @@ def setup_logging(config: Config) -> None: handler_jd.setFormatter(Formatter("%(name)s - %(levelname)s - %(message)s")) logging.root.addHandler(handler_jd) else: - Path(logfile).parent.mkdir(parents=True, exist_ok=True) handler_rf = get_existing_handlers(RotatingFileHandler) if handler_rf: logging.root.removeHandler(handler_rf) - handler_rf = RotatingFileHandler( - logfile, - maxBytes=1024 * 1024 * 10, # 10Mb - backupCount=10, - ) + try: + logfile_path = Path(logfile) + logfile_path.parent.mkdir(parents=True, exist_ok=True) + handler_rf = RotatingFileHandler( + logfile_path, + maxBytes=1024 * 1024 * 10, # 10Mb + backupCount=10, + ) + except PermissionError: + logger.error( + f'Failed to create or access log file "{logfile_path.absolute()}". ' + "Please make sure you have the write permission to the log file or its parent " + "directories. If you're running freqtrade using docker, you see this error " + "message probably because you've logged in as the root user, please switch to " + "non-root user, delete and recreate the directories you need, and then try " + "again." + ) + sys.exit(1) handler_rf.setFormatter(Formatter(LOGFORMAT)) logging.root.addHandler(handler_rf) diff --git a/tests/test_log_setup.py b/tests/test_log_setup.py index 19c6b190d..e9cd8c342 100644 --- a/tests/test_log_setup.py +++ b/tests/test_log_setup.py @@ -107,6 +107,27 @@ def test_set_loggers_Filehandler(tmp_path): logger.handlers = orig_handlers +@pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows") +def test_set_loggers_Filehandler_without_permission(tmp_path): + logger = logging.getLogger() + orig_handlers = logger.handlers + logger.handlers = [] + + tmp_path.chmod(0o400) + logfile = tmp_path / "logs/ft_logfile.log" + config = { + "verbosity": 2, + "logfile": str(logfile), + } + + setup_logging_pre() + with pytest.raises(SystemExit) as excinfo: + setup_logging(config) + assert excinfo.value.code == 1 + + logger.handlers = orig_handlers + + @pytest.mark.skip(reason="systemd is not installed on every system, so we're not testing this.") def test_set_loggers_journald(mocker): logger = logging.getLogger()