Cognee 日志系统完全指南:日志目录结构、明文格式与文件保留策略

发布时间:2026/11/5 16:29:21

Cognee 日志系统完全指南:日志目录结构、明文格式与文件保留策略 Cognee 日志系统完全指南日志目录结构、明文格式与文件保留策略【免费下载链接】cogneeCognee is the open-source AI memory platform for agents. Give your AI agents persistent long-term memory across sessions with a self-hosted knowledge graph engine.项目地址: https://gitcode.com/GitHub_Trending/co/cognee本篇技术指南围绕 Cognee 仓库中的 logs/README.md 展开完整讲解日志文件的命名规则、单条日志的结构化字段、自动保留策略并结合 cognee/shared/logging_utils.py 的源码实现深入剖析日志文件从创建、写入、轮转到清理的完整生命周期。读完本文你将能够定位 Cognee 运行时日志的实际落盘位置读懂每一条日志的结构并通过环境变量灵活控制日志行为为长期部署的自检与排障提供依据。日志目录定位logs/在仓库中的角色在 Cognee 仓库根目录下存在一个logs/目录其中只保留了 logs/README.md 一个说明文件。根据仓库根目录的 .gitignore 配置# Cognee logs directory - keep directory, ignore contents logs/* !logs/.gitkeep !logs/README.md可以确认目录结构被保留在版本控制中而实际产生的.log日志文件全部被 gitignore 忽略。也就是说logs/只是应用日志的约定存放位置运行期生成的日志不会进入 Git 历史避免了仓库体积随运行时长无限膨胀。这与 README 中 The logs directory structure is preserved in version control, but the log files themselves are gitignored 的描述完全一致。需要补充的是Cognee 的日志实际写入路径并非写死的仓库logs/目录而是由配置动态解析的。在 cognee/base_config.py 中logs_root_directory: str os.getenv(COGNEE_LOGS_DIR, str(Path.home() / .cognee / logs))即日志根目录的默认值是用户主目录下的~/.cognee/logs可通过环境变量COGNEE_LOGS_DIR覆盖。而 cognee/shared/logging_utils.py 中的resolve_logs_dir()则给出了完整的解析优先级BaseConfig.logs_root_directory默认~/.cognee/logs可被COGNEE_LOGS_DIR覆盖并尝试创建目录、校验可写性若上述目录不可写则回退到/tmp/cognee_logs同样尽力创建并校验两者都不可用时返回None文件日志将被跳过仅在控制台输出。因此在排查问题时可依次检查COGNEE_LOGS_DIR指向的目录、~/.cognee/logs与/tmp/cognee_logs三处。日志文件命名规则根据 logs/README.md日志文件按日期命名格式为YYYY-MM-DD_HH-MM-SS.log例如一次启动产生的日志文件可能是2025-03-27_13-05-27.log。这一命名规则在源码中得到印证。在 cognee/shared/logging_utils.py 的setup_logging()中# NOTE: environment variable must be used here as it allows us to # log to a single file with a name based on a timestamp in a multiprocess setting. # Without it, we would have a separate log file for every process. log_file_path os.environ.get(LOG_FILE_NAME) if not log_file_path and logs_dir is not None: # Create a new log file name with the cognee start time start_time datetime.now().strftime(%Y-%m-%d_%H-%M-%S) log_file_path str((logs_dir / f{start_time}.log).resolve()) os.environ[LOG_FILE_NAME] log_file_path两个关键细节值得注意文件名取的是进程启动时刻的时间戳strftime(%Y-%m-%d_%H-%M-%S)而不是每条日志的写入时间。因此一个进程整个生命周期内的日志都写入同一个文件便于按一次运行为单位回溯生成的文件路径会被写入环境变量LOG_FILE_NAME供多进程场景复用。注释明确指出如果每次都重新生成文件名多进程部署中每个进程都会各建一个日志文件而共享LOG_FILE_NAME后同一部署中的所有进程可以把日志合并写入单一文件方便统一采集与分析。单条日志的结构与示例README 给出的示例日志条目为2025-03-27T13:05:27.481446Z [INFO ] Structured log message user_iduser123 actionlogin statussuccess [TestLogger]对照 README 的字段说明一条日志包含五个组成部分字段说明示例值时间戳ISO 格式UTC含微秒2025-03-27T13:05:27.481446Z日志级别填充到固定宽度左对齐补齐[INFO ]消息日志主体内容Structured log message附加上下文以keyvalue形式附加的键值对可选user_iduser123 actionlogin statussuccess日志器名称方括号包裹[TestLogger]错误级别的日志还会附带完整的异常 traceback。这一行式结构由 cognee/shared/logging_utils.py 中的PlainFileHandler生成。该类继承自logging.handlers.RotatingFileHandler其emit()方法从 structlog 的字典型日志记录中提取各字段按固定模板格式化log_entry f{timestamp} [{record.levelname.ljust(8)}] {message}{context_str} [{logger_name}]\n可以逐项对应到 README 的结构描述时间戳datetime.now().strftime(get_timestamp_format())默认格式为%Y-%m-%dT%H:%M:%S.%fUTC即2025-03-27T13:05:27.481446加Z后缀get_timestamp_format() 对不支持微秒的平台做了兜底——检测到ValueError时退化为%Y-%m-%dT%H:%M:%S日志级别record.levelname.ljust(8)将级别名左对齐填充到 8 个字符宽度例如INFO补齐为INFO保证整列日志级别垂直对齐便于肉眼扫描消息取自 structlog 记录中的event键附加上下文剔除event、logger、level、timestamp、exc_info等元字段后其余键值对以kv空格分隔拼接——这正是示例中user_iduser123 actionlogin statussuccess的来源适用于注入用户 ID、操作名、状态码等结构化诊断信息日志器名称取自记录中的logger键缺省时回退到 Python 日志器的record.name异常 traceback当记录携带exc_info无论是标准元组形式还是直接传入的异常对象时通过traceback.format_exception()格式化后追加写入文件这与 README Exception tracebacks are included for error logs 的说明一致。日志系统的底层structlog 集成理解上述结构离不开 Cognee 的日志基础设施。cognee/shared/logging_utils.py 的setup_logging()是统一入口cognee/__init__.py在模块加载时即调用logger setup_logging()保证整个框架共享同一套日志配置。setup_logging()完成的关键工作包括structlog 配置通过structlog.configure()挂载处理器链filter_by_level→add_logger_name→add_log_level→TimeStamper→ 自定义exception_handler等使每条日志都携带统一的时间戳、级别与日志器名系统级异常钩子将sys.excepthook替换为handle_exception让未捕获异常也经由 structlog 记录后再交给默认钩子KeyboardInterrupt直接透传不记录。对应测试位于 cognee/tests/unit/shared/test_logging_setup_excepthook.py其中验证了钩子安装、异常渲染失败时回退到普通 traceback、以及KeyboardInterrupt透传三个契约控制台输出使用带颜色的ConsoleRenderer并特意关闭了 Rich traceback 的 locals 渲染源码注释说明检索路径上的异常若渲染帧局部变量可能因递归展开嵌入向量等大对象导致内存暴涨甚至 OOM外部库日志治理configure_external_library_logging()通过环境变量与日志器级setLevel(logging.CRITICAL)disabledTrue抑制 LiteLLM 等依赖库的噪声日志还挂载了过滤loggingworker cancelled、cancellederror等关键字的自定义 Filter。文件保留策略仅保留最近 10 个日志文件README 明确说明系统自动仅保留最近 10 个日志文件新文件创建时自动删除更旧的日志以防止长时间运行部署中磁盘占用失控。这一策略在源码中有两处实现1. 文件数量级清理cleanup_old_logscognee/shared/logging_utils.py 中的cleanup_old_logs()在每次setup_logging()完成后被调用# Maximum number of log files to keep MAX_LOG_FILES 10 ... log_files [f for f in logs_dir.glob(*.log) if f.is_file()] log_files.sort(keylambda x: x.stat().st_mtime, reverseTrue) if len(log_files) max_files: for old_file in log_files[max_files:]: old_file.unlink()其逻辑是扫描日志目录下所有*.log文件按修改时间从新到旧排序删除超出MAX_LOG_FILES即 10之外的最旧文件。这与 README keeps only the 10 most recent log files 完全一致。此外它还做了 CLI 模式适配——在COGNEE_CLI_MODEtrue时只输出一条汇总信息避免刷屏。2. 单文件大小级轮转PlainFileHandler继承自RotatingFileHandler除了文件数量上限每个日志文件本身还有大小上限。PlainFileHandler在emit()中自行检查当前文件大小超过阈值即调用doRollover()触发轮转# Log rotation defaults — override via COGNEE_LOG_MAX_BYTES / COGNEE_LOG_BACKUP_COUNT LOG_MAX_BYTES int(os.getenv(COGNEE_LOG_MAX_BYTES, 50 * 1024 * 1024)) # 50 MB LOG_BACKUP_COUNT int(os.getenv(COGNEE_LOG_BACKUP_COUNT, 5)) # 5 backups → 300 MB cap默认每个文件 50 MB最多保留 5 个轮转备份单进程累计上限约 250–300 MB。这一大小轮转策略与保留最近 10 个文件的数量策略相互配合大小轮转防止单文件无限增长数量清理防止文件数量无限积累两者共同构成长期运行部署的磁盘保护机制。相关环境变量汇总综合源码与日志行为相关的环境变量如下环境变量默认值作用COGNEE_LOGS_DIR~/.cognee/logs指定日志根目录COGNEE_LOG_FILEtrue设为false/0/no可完全禁用文件日志仅保留控制台输出LOG_FILE_NAME无自动生成显式指定日志文件完整路径多进程部署中可共享同一路径实现单文件合并写入LOG_LEVELINFO全局日志级别DEBUG/INFO/WARNING/ERROR/CRITICAL等setup_logging()按此设置控制台与文件 handler 的级别COGNEE_LOG_MAX_BYTES5242880050 MB单个日志文件的大小上限触发轮转COGNEE_LOG_BACKUP_COUNT5轮转备份文件的最大数量COGNEE_CLI_MODE无true时清理旧日志只输出汇总信息避免逐文件刷屏使用方式自动生成无需人工干预README 明确指出日志由应用自身的日志机制自动生成使用该功能无需任何手动操作。结合源码日志文件的生命周期大致如下进程启动时cognee/__init__.py调用setup_logging()setup_logging()解析日志目录COGNEE_LOGS_DIR→~/.cognee/logs→/tmp/cognee_logs以启动时刻生成YYYY-MM-DD_HH-MM-SS.log文件名并挂载PlainFileHandler运行期间各模块通过get_logger()获取 structlog 日志器写入结构化日志控制台 文件双通道单文件达到 50 MB 时触发大小轮转新一次启动后cleanup_old_logs(logs_dir, MAX_LOG_FILES)删除超出 10 个的最旧文件。对开发与运维人员而言常见的排查手段是通过 get_log_file_location()遍历 root logger 的 handler返回当前文件日志路径在运行时确认实际落盘文件启动日志中也会输出一行Log file created at: path见 setup_logging()启动时通过LOG_LEVELDEBUG临时提升日志级别以获取更细粒度的诊断信息长期部署中无需手动清理——数量上限10 个文件与大小上限50 MB × 5 备份已由系统自动兜底。总结logs/README.md用极简的篇幅定义了 Cognee 应用日志的约定而其背后的实现远比表面丰富YYYY-MM-DD_HH-MM-SS.log命名对应进程启动时间戳与多进程单文件合并机制[INFO ]的定宽级别来自ljust(8)格式化10 个文件上限来自cleanup_old_logs()的修改时间排序删除而大小轮转与数量清理的双层策略为长期运行的 AI 记忆服务提供了磁盘使用的双重保障。无论是阅读日志定位问题还是通过环境变量调整日志行为本文梳理的目录定位、字段语义与保留策略均可直接对照 cognee/shared/logging_utils.py 源码进一步验证与扩展。【免费下载链接】cogneeCognee is the open-source AI memory platform for agents. Give your AI agents persistent long-term memory across sessions with a self-hosted knowledge graph engine.项目地址: https://gitcode.com/GitHub_Trending/co/cognee创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 13:55:19

GD32E10x官方例程入门:从GPIO点灯到串口调试

简介:这份GD32E10x系列官方例程面向嵌入式硬件与单片机开发者,基于ARM Cortex-M3内核,汇集兆易创新GD32E10x的示例代码,适合工业控制、消费电子、通信设备等场景的学习、验证与二次开发。压缩包共935个文件,约11.16MB&…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑