IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:Logging

共 13 篇相关文章

IT 累计浏览 2,150

折腾 Python logging 的一些记录

这篇讲的是 Python logging 模块的深度“折腾”与实战技巧。作者从 logging 的官方流程图和源码出发,清晰地拆解了从日志请求发出,到经过 Logger、Filter、Handler 层层处理,最终格式化输出的完整链路。 文章的亮点在于,它没有停留在理论层面,而是基于对这套机制的理解,分享了如何巧妙地扩展功能。比如,利用 Filter 不仅能过滤还能**改写** LogRecord 的特性,为日志添加了项目相对路径(`relpath`)。文章也指出了配置中的一个“坑”:自定义 Filter 无法通过 `fileConfig` 文件配置,必须使用 `dictConfig` 或 Python 字典。 更进一步,作者将这套扩展思路应用到了实际工程中。通过 Filter 动态地向 LogRecord 注入上下文,成功地为 Flask 请求和 Celery 任务日志串联上了关键的 `request_id` 和 `task_id`。文章还提到了用装饰器自动记录函数调用参数与返回值,并处理了其中容易出错的日志定位问题。 整体而言,这不仅是一次对 logging 内部机制的剖析,更是一份如何将其“驯服”并服务于复杂应用场景的实践指南,对想深入理解或定制 Python 日志系统的开发者很有启发。

IT 累计浏览 1,848

python之logging模块详解

这篇讲的是 Python 标准库中 logging 模块的实战用法。作者从最基础的 `logging.debug`、`logging.warning` 等函数讲起,清晰地梳理了日志级别从 `DEBUG` 到 `CRITICAL` 的大小关系。 文章的核心在于通过具体代码示例,手把手地演示如何配置和使用 logging。内容涵盖了如何利用 `basicConfig` 函数自定义日志输出格式(例如加入时间戳、文件名、行号),以及如何将日志同时输出到屏幕和文件。其中还详细解释了 `format` 参数中各个占位符的含义,非常实用。 进阶部分,文章介绍了日志回滚机制,并借助 `RotatingFileHandler` 实现了按文件大小自动备份。更重要的是,它梳理了 logging 模块中不同的 Handler 类型,比如 `StreamHandler`、`FileHandler` 和各类网络处理器,点明了它们各自的应用场景。最后,文章展示了如何通过 `logging.config` 模块使用配置文件来统一管理复杂的日志策略,提供了从简单脚本到规范项目的完整演进路径。

IT 累计浏览 2,126

改造 Mojolicious 让日志显示当前模块和行号

这篇讲的是如何为Perl Web框架Mojolicious“加装”一个更强大的日志系统。作者从实际开发中的痛点出发:默认日志只告诉你“做了什么”,却没说“是哪里做的”,排查问题时常常需要来回对照代码。 核心改造思路很巧妙——直接重写框架底层的`Mojo::Log::_format`格式化方法。通过Perl的`caller`函数,获取日志打印语句所处的模块名称和行号,并将其注入日志输出中。文章提供了针对Mojolicious::Lite和标准Mojolicious应用的两种修改代码,只需添加几行,就能将原本模糊的日志 `[debug] Routing to a callback.`,变得一目了然地变成 `[debug] [Mojolicious::Routes 119] Routing to a callback.`。 这个改造让每条日志都自带“源代码坐标”,对于调试复杂路由、插件调用链尤为实用。它不仅是一个实用技巧,也展示了如何通过局部定制来增强框架的可观测性。

IT 累计浏览 3,010

Yii框架的Log系统的分析

这篇讲的是 Yii 框架中日志(Log)系统的内部实现。作者从 logging 目录下的源代码出发,梳理了这个灵活且强大的日志模块是如何工作的。 文章的核心在于剖析其解耦设计:负责“打日志”的 CLogger 和负责“记录日志”的 CLogRouter 是两个独立的对象。CLogger 充当生产者,通过单例模式提供全局调用接口,并将日志信息存入一个内存缓冲区。当缓冲区满时,它会触发一个 onFlush 事件,而不是直接处理。 真正的处理逻辑由订阅了这个事件的 CLogRouter 等路由类来完成,它们作为消费者,在事件中将日志分派给不同的目标,比如文件、邮件或数据库。这种基于事件的发布-订阅模式,将日志的收集与分发完美解耦。文章还展示了如何通过 category 参数对日志进行灵活过滤,确保只处理需要关注的信息。 作者通过阅读源码,不仅展示了如何简单地调用 `Yii::getLogger()->log()`,更揭示了框架在简单接口背后,如何通过精巧的架构实现高性能和高扩展性的日志管理。

IT 累计浏览 3,674

警惕程序日志对性能的影响

这篇讲的是后台系统开发中一个常被忽视的痛点:程序日志(logging)与系统性能之间的微妙平衡。 文章开篇就点出了后台开发的核心挑战——生产环境的bug难以复现和调试。因此,日志成了程序员获取系统运行信息、定位问题的“眼睛”。然而,作者随即提醒,这双“眼睛”本身也可能消耗大量系统资源。如果日志打印过于频繁或内容冗余,在高并发场景下,频繁的I/O操作和序列化开销会显著拖累程序性能,甚至成为新的瓶颈。 文章并未停留在指出问题,而是引导读者思考“如何科学地打日志”。这涉及到在“信息充分”与“性能影响”之间做出权衡:比如采用分级日志、异步日志、精简日志内容或使用条件日志等策略。作者的核心观点是,优秀的后台工程师不仅要懂得如何记录日志,更要懂得如何“克制”与“设计”日志策略。 这对于每一位运维关键服务的开发者都很有启发:日志系统不是免费的,它需要被当作一个需要精心调优的组件来对待。在追求系统可观测性的同时,必须对其性能代价有清醒的认识和规划。

IT 累计浏览 6,718

使用nginx记日志

这篇文章讲的是在 Nginx 中配置灵活日志记录的实战技巧。作者从最基础的 `access_log` 和默认的 `combined` 格式出发,展示了如何一步步将日志改造成更易于分析的格式。 核心思路是使用像 `^A` 这样的特殊字符作为字段分隔符,这能让后续的 `awk`、`sort` 等命令行工具高效地处理和统计日志,比如快速找出请求量最高的 URL。文章不止于此,还深入讲解了如何在日志生成阶段就进行字段预处理,比如通过 `set_unescape_uri` 解码搜索关键词,或使用 `map` 模块为 URL 进行逻辑分类。 更进阶的部分在于,作者演示了利用 `ngx_lua` 脚本处理复杂逻辑,甚至实现了条件记录日志——仅当请求参数满足特定条件(如 `arg_id` 存在且为数字)时,才触发一次内部子请求来写入日志。这不仅提供了记录粒度的精细控制,也展示了如何通过一个打点请求合并多条记录。整篇文章从配置到脚本,层层递进,为需要进行深度日志分析的运维和开发人员提供了一套清晰可行的方案。

IT 累计浏览 2,070

用syslog-ng实时收集每一行php报错

这篇讲的是一个电商创业团队如何用 syslog-ng 实时捕获 PHP 报错,来提升服务可用率。作者从电商服务不能中断、需要快速发现问题的现实需求出发,决定不再依赖人工查日志,而是要把每一行 PHP 报错都集中收集起来。 具体方案是用 syslog-ng 这个高性能的日志管理工具,它像一个灵敏的哨兵,可以实时监听 PHP 产生的错误日志,并把它们统一汇总。这样做的好处是,报错信息能被即时看到和分析,而不是散落在各个服务器的角落里。对于争分夺秒的线上故障排查来说,这种实时性非常关键。 最终,他们通过这样的架构实现了错误的快速发现和响应,为服务稳定性提供了坚实的基础。文章分享的这个从需求到落地的完整路径,对于同样追求高可用的中小团队来说,提供了一个清晰、可实施的参考范例。

IT 累计浏览 3,446

PHP错误处理及异常处理

这篇主要为PHP新手梳理错误处理与异常处理的核心区别。文章从两者的根本机制出发,指出错误(Error)通常是PHP引擎在脚本执行时遇到问题产生的警告或致命错误,比如调用未定义函数或访问不存在的数组键,它的触发是底层的、自动的。而异常(Exception)则需要开发者手动使用 `throw` 关键字“抛出”,并用 `try...catch` 块去捕获和处理,它更适用于业务逻辑中可预见的异常情况。 关键差异在于控制流。错误处理更像是一次性的“提醒”或“中断”,脚本可能会继续执行或停止;而异常处理则提供了更结构化的跳转机制,可以将错误处理逻辑与主业务代码分离。文章强调,理解何时该用 `set_error_handler` 捕获错误,何时该用 `try...catch` 捕获异常,是编写健壮PHP代码的基础。对于新人来说,先分清这两种机制的不同作用域和设计目的,才能在调试和开发中做出合适的选择。

IT 累计浏览 7,769

Python 多进程日志记录

这篇讲的是 Python Web 开发中一个常见却容易被忽略的坑:当你的应用需要记录比 Nginx access log 更详细的自定义日志时,一旦涉及多个 worker 进程,直接使用标准的 logging 模块向同一个文件写入,很可能会导致日志内容交错、损坏甚至丢失。 作者从实际项目需求出发,深入剖析了问题的根源:标准文件处理器在多进程环境下缺乏安全的并发写入机制。文章进而梳理了几种主流解决方案。例如,可以使用 `logging.handlers.QueueHandler` 将所有日志发送到一个独立进程统一写入;也可以在配置中为每个 worker 生成独立的日志文件名,但事后分析会变得繁琐;对于使用 Gunicorn 等服务器的场景,可能需要依赖其提供的日志记录钩子。 文章不仅列举了方法,还对比了它们的优劣和适用场景,比如开发调试与生产环境的不同选择。对于需要自建日志系统或进行性能优化的开发者来说,这篇内容厘清了多进程日志管理的核心矛盾,并提供了从简单规避到架构设计的不同层次的解决思路。

IT 累计浏览 6,572

关于Apache调优点滴

这篇讲的是 Apache 服务器中一个容易被忽略的性能细节:管道模式记录日志(Piped logging)的实际影响。作者从日常运维观察出发,探讨了这种看似“高效”的异步日志方式,在什么情况下反而会成为性能瓶颈。 文章指出,当 Apache 使用管道将日志流交给外部进程(如 Rotatelogs)处理时,会引入进程间通信开销和潜在的阻塞。在高并发场景下,如果日志处理进程响应不及时,这个管道就可能变“堵”,反向拖慢 Apache 主进程处理请求的速度。作者可能结合了具体数据或案例,分析了这种阻塞如何体现在 CPU 使用率、响应延迟等指标上,并分享了如何通过监控和调优来规避这一问题。 对于正在为线上高负载发愁的运维工程师来说,这篇文章的价值在于提供了一个具体的排查视角。它提醒我们,监控系统性能时不能只盯着应用本身,外部辅助进程的健康状态和管道的通畅程度,同样是需要纳入视野的关键环节。

IT 累计浏览 6,124

在 shell 脚本里打日志

这篇讲的是作者在重构脚本模块时,探索出的一个在 shell 脚本里高效打日志的实用技巧。作者从实际开发中遇到的日志需求出发,面对重构代码时需要清晰记录执行过程和错误信息,没有选择复杂的外部工具,而是利用 shell 自身特性来实现轻量级方案。 核心实现思路是定义一个可复用的日志函数,通过结合 echo 命令、重定向和变量控制,实现时间戳、日志级别(如 INFO、ERROR)的自动附加。技巧的巧妙之处在于它简化了配置:函数内部使用 date 命令获取当前时间,通过参数传递日志内容,并支持将输出同时打印到终端和写入文件,避免了手动处理重复代码。 对于脚本开发者来说,这个方法降低了日志集成的门槛,特别适合中小型项目或临时脚本,无需引入额外依赖就能提升调试效率。作者分享的思路展示了如何用基础工具解决常见问题,为类似场景提供了一个清晰、可扩展的参考。

IT 累计浏览 3,163

mysql audit-访问日志记录

这篇讲的是如何为MySQL配置审计日志,让每一次数据访问都“有迹可循”。作者从数据安全与合规的现实需求出发,指出仅仅依靠默认日志往往不够精细。文章核心介绍了MySQL官方审计插件的配置方法,比如如何按用户、按库、按操作类型来筛选和记录日志,并对比了通用查询日志、错误日志和慢查询日志在审计场景下的不同侧重。 特别值得关注的是,作者通过一个实际案例展示了审计日志的妙用:通过分析日志中的高频查询和特定时间窗口的异常连接,成功定位了一个因程序连接池配置不当导致的性能瓶颈。文章没有停留在配置命令的罗列,而是将日志数据与实际的运维排障场景结合起来,解释了这些记录到底“能用来干什么”。 最后,作者也坦诚地讨论了开启审计日志对性能的潜在影响,给出了在测试环境与生产环境进行差异化配置的实用建议。对于需要加强数据库管控或进行事后追溯的团队来说,这篇提供了清晰的配置路径和应用思路。

IT 累计浏览 5,063

多服务器的日志合并统计――apache日志的cronolog轮循

这篇讲的是在分布式系统中一个常见但棘手的日志管理难题:当几十上百台服务器的日志需要汇总分析时,单个日志文件会迅速膨胀到难以处理。作者从实际的运维痛点出发,介绍如何使用 cronolog 这个轻量工具,对 Apache 等服务的日志进行自动、按时间(如每天或每小时)轮循切割。 核心方案是为每台服务器配置 cronolog,让日志按预设周期生成独立文件,并通过简单的命名规范(如包含日期和主机名),使所有服务器的日志文件能被脚本或工具(如 Hadoop)方便地匹配和收集。这个方案的关键在于“规则化”和“自动化”,它将原本混乱的大日志拆解为便于归档、传输和分析的标准化片段。 最终,这种轮循策略不仅避免了单个日志文件过大导致的磁盘和性能问题,更重要的是为跨服务器的日志聚合统计铺平了道路。配合集中式的日志收集,管理员可以高效地进行全站流量分析、错误追踪或安全审计,把散落的数据点变成了有价值的运维洞察。