含父目录的日志文件未写入问题排查
Databricks日志文件无法生成问题排查与解决
我在Databricks的主笔记本中创建了根日志记录器,导入logger.py的配置并调用其他含日志记录器的模块。运行时控制台输出正常,但始终生成不了日志文件,相关代码如下:
主笔记本代码
# main notebook import logging from logger import get_logfile_name, configure_logger NAME = 'job1' from logger import ( configure_logger, get_logfile_name, ) # Set up root logger logger = logging.getLogger() logfile = get_logfile_name(NAME) logger = configure_logger(logger, logfile=logfile)
logger.py代码
import os import logging from dates import get_current_date from source import project_log_dir def get_logfile_name(name): # Get current date to append to file name formatted_date = get_current_date() logfile = f"{name}/{name}_{formatted_date}.log" return logfile def configure_logger(logger, logfile, level=logging.DEBUG): logger.setLevel(level) logfile_output = os.path.join(project_log_dir, logfile) os.makedirs(os.path.dirname(logfile_output), exist_ok=True) if logfile: # Create a file handler with detailed formatting for log output file_handler = logging.FileHandler(logfile_output, mode="a") fformatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s') file_handler.setFormatter(fformatter) logger.addHandler(file_handler) # Create a stream handler with simple formatting for cell output stream_handler = logging.StreamHandler() sformatter = logging.Formatter('%(levelname)s: %(message)s') stream_handler.setFormatter(sformatter) logger.addHandler(stream_handler) # Remove random Pyspark logs logging.getLogger("py4j").setLevel(logging.ERROR) if logfile: logger.info(f'Logger initiated. Logs will be written to {logfile_output}') else: logger.info('Logger initiated.') return logger
其他模块代码
# other modules import logging logger = logging.getLogger(__name__)
运行时控制台能正常输出日志,但对应的日志文件始终没生成。
(图片显示控制台有日志输出记录,但找不到对应的日志文件)
可能的原因及解决方法
- 路径权限与格式问题:Databricks中不能直接用本地路径,
project_log_dir必须指向DBFS路径。比如改成/dbfs/mnt/your-log-dir(本地挂载路径)或dbfs:/mnt/your-log-dir(DBFS协议路径),同时确保该路径已创建且有写入权限。 - 重复添加日志处理器:多次运行笔记本会导致根日志器重复添加处理器,可能引发异常。在
configure_logger函数开头添加以下代码清空现有处理器:# 清空现有处理器,避免重复添加 for handler in logger.handlers[:]: logger.removeHandler(handler) - 路径验证:在
configure_logger中添加路径打印,确认最终日志路径是否正确:
之后可以用print(f"最终日志路径: {logfile_output}")dbutils.fs.ls(logfile_output)在笔记本中检查文件是否存在。 - 子日志器级别设置:确保其他模块的日志器没有单独设置高于
DEBUG的级别,否则会过滤掉日志。可以在其他模块中显式设置级别:logger.setLevel(logging.DEBUG)
内容的提问来源于stack exchange,提问作者csp
相关产品推荐
相关产品推荐

