百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

Tornado 应用程序中的监控和日志记录,最佳实践以及演示

liebian365 2024-11-26 05:52 43 浏览 0 评论

监控和日志记录是维护强大、安全和高性能 Web 应用程序的重要方面。它们有助于跟踪应用程序行为、诊断问题并确保一切顺利运行。在本博文中,我们将探讨如何在 Tornado(一个以异步功能而闻名的 Python Web 框架)中实现监控和日志记录。我们将介绍关键概念、最佳实践,并提供演示来说明这些原则。

监控和日志记录为何重要

  1. 调试和故障排除:日志提供了有关应用程序正在做什么的宝贵见解,这对于调试和解决问题至关重要。
  2. 性能跟踪:监控有助于识别性能瓶颈并优化资源使用。
  3. 安全性:记录用户活动有助于检测和防止恶意行为。
  4. 审计和合规性:许多行业对日志记录和监控都有合规性要求,因此这是必不可少的。

在 Tornado 中设置日志记录

Tornado 通过 Python 标准库的日志记录模块内置了对日志记录的支持。这提供了一种简单有效的方法来记录来自 Tornado 应用程序的消息。

基本日志配置

import logging
import tornado.ioloop
import tornado.web


# Configure logging
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    handlers=[
        logging.FileHandler("tornado.log"),
        logging.StreamHandler()
    ]
)


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        logging.info("MainHandler: GET request received")
        self.write("Hello, Tornado!")


def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])


if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    logging.info("Tornado server started on http://localhost:8888")
    tornado.ioloop.IOLoop.current().start()

说明:

  1. 日志配置:我们使用logging.basicConfig来设置日志级别、格式和处理程序。在这里,日志会输出到文件(tornado.log)和控制台。
  2. 使用logging.info:记录一条信息性消息,指示服务器何时启动以及何时收到请求。

日志级别

Tornado的日志系统使用标准日志级别:DEBUG、INFO、WARNING、ERROR和CRITICAL。根据消息类型选择适当的级别:


  1. DEBUG:详细信息,通常仅在诊断问题时才有用。
  2. INFO:确认一切按预期运行。
  3. WARNING:表示发生了意外情况或表明存在某些问题。
  4. ERROR:由于更严重的问题,软件无法执行某些功能。
  5. CRITICAL:非常严重的错误,表示程序本身可能无法继续运行。

高级日志记录:结构化日志记录

对于更复杂的应用程序,建议使用结构化日志记录。这意味着以结构化格式(例如 JSON)记录数据,以便于查询和分析。

import json


class JsonLogFormatter(logging.Formatter):
    def format(self, record):
        log_record = {
            'time': self.formatTime(record, self.datefmt),
            'level': record.levelname,
            'message': record.getMessage(),
            'module': record.module,
            'file': record.pathname,
            'line': record.lineno,
        }
        return json.dumps(log_record)


# Configure structured logging
file_handler = logging.FileHandler('tornado_json.log')
file_handler.setFormatter(JsonLogFormatter())
logging.getLogger().addHandler(file_handler)

说明:

  1. 自定义格式化程序:JsonLogFormatter 将日志消息格式化为 JSON 字符串,使其适合被 ELK(Elasticsearch、Logstash、 Kibana)利用。

监控 Tornado 应用程序

监控涉及跟踪应用程序的性能和运行状况。有几种工具和技术可用于监控 Tornado 应用程序。

将 Prometheus 与 Tornado 结合使用

Prometheus 是一个开源监控系统,通常与 Tornado 应用程序一起使用来跟踪指标。下面是使用 prometheus_client 将 Prometheus 与 Tornado 简单集成。

安装 Prometheus 客户端:

pip install prometheus_client

与 Tornado 集成:

from prometheus_client import start_http_server, Counter
import tornado.ioloop
import tornado.web


# Create a Counter to track the number of requests
REQUEST_COUNT = Counter('tornado_requests_total', 'Total number of requests')


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        REQUEST_COUNT.inc()  # Increment the counter
        self.write("Hello, Tornado with Prometheus!")


def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])


if __name__ == "__main__":
    # Start Prometheus metrics server on port 9091
    start_http_server(9091)
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

说明:

  1. 计数器:Prometheus 计数器用于跟踪传入的 HTTP 请求数。
  2. start_http_server:此函数在端口 9091 上启动一个单独的 HTTP 服务器,该服务器公开指标端点 (/metrics)。Prometheus 可以抓取此端点以收集指标。

使用 WebSockets 进行实时监控

对于实时监控,您可以使用 WebSockets 将日志数据直接发送到监控仪表板。

import tornado.web
import tornado.websocket
import tornado.ioloop


class LogWebSocket(tornado.websocket.WebSocketHandler):
    def open(self):
        logging.info("WebSocket opened")
        self.write_message("Connected to WebSocket log server")


    def on_message(self, message):
        logging.info(f"Message received: {message}")
        self.write_message(f"Echo: {message}")


    def on_close(self):
        logging.info("WebSocket closed")


def make_app():
    return tornado.web.Application([
        (r"/logs", LogWebSocket),
    ])


if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

说明:

  1. WebSocket Handler:LogWebSocket处理程序允许客户端通过 WebSockets 进行连接。它记录连接事件并将任何收到的消息回显给客户端。
  2. 实时反馈:此设置可以扩展为将实时日志或指标流式传输到监控仪表板,从而提供对应用程序性能和行为的即时洞察。

Tornado 中监控和日志记录的最佳实践

  1. 使用适当的日志级别:始终使用正确的日志级别,以避免不必要的信息使日志混乱。
  2. 记录异常:确保使用堆栈跟踪记录所有异常以帮助调试。
  3. 避免记录敏感信息:注意不要记录敏感的用户信息(例如密码、个人数据)。
  4. 实施日志轮换:使用日志轮换来管理日志文件大小并避免消耗过多的磁盘空间。
  5. 监控关键指标:跟踪请求数、响应时间、错误率和资源使用情况等指标,以确保应用程序健康。
  6. 使用结构化日志:如果可能,使用结构化日志以便于分析和与监控工具集成。
  7. 集中日志:使用集中日志系统聚合来自多个来源的日志,使分析更容易。

除了前面提供的演示之外,让我们探索一些用于在 Tornado 应用程序中监控和记录的更实际的示例和技术。这些将帮助您深入了解应用程序行为并确保高效的故障排除和性能跟踪。

演示 1:集成 Sentry 进行错误监控

Sentry 是一种流行的实时错误跟踪和监控工具。它提供详细的错误报告、堆栈跟踪和上下文,使识别和修复问题变得更加容易。以下是如何将 Sentry 与 Tornado 应用程序集成。

步骤 1:安装 Sentry SDK

首先,使用 pip 安装 Python 版 Sentry SDK:

pip install sentry-sdk

步骤 2:在 Tornado 中配置 Sentry

您需要在 Tornado 应用程序中初始化 Sentry。这涉及设置在 Sentry 中创建项目时收到的 Sentry DSN(数据源名称)。

import sentry_sdk
from sentry_sdk.integrations.tornado import TornadoIntegration
import tornado.ioloop
import tornado.web


# Initialize Sentry with Tornado integration
sentry_sdk.init(
    dsn="your_sentry_dsn_here",  # Replace with your actual DSN
    integrations=[TornadoIntegration()]
)


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, Tornado with Sentry!")
        raise Exception("This is a test exception!")  # Example to trigger Sentry


def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])


if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

说明:

  1. Sentry SDK 初始化:sentry_sdk.init() 函数使用给定的 DSN 初始化 Sentry 并设置 Tornado 集成。这允许 Sentry 自动捕获异常。
  2. 错误触发器:引发示例异常以演示 Sentry 如何捕获和报告错误。

步骤 3:查看 Sentry 中的错误

运行您的 Tornado 应用程序并访问端点。Sentry 将捕获引发的异常,您可以在 Sentry 仪表板中查看详细的错误报告。

演示 2:使用 Loguru 进行增强日志记录

Loguru 是一个功能强大的日志记录库,可简化 Python 应用程序中的日志记录。它提供了更方便的 API 和附加功能,例如更好的格式和异步日志记录。

步骤 1:安装 Loguru

使用 pip 安装 Loguru:

pip install loguru

步骤 2:将 Loguru 与 Tornado 集成

使用 Loguru 替换标准日志记录以获得更高级的日志记录功能。

from loguru import logger
import tornado.ioloop
import tornado.web


# Configure Loguru
logger.add("tornado_loguru.log", rotation="1 MB")  # Rotates log file every 1 MB


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        logger.info("MainHandler: GET request received")
        self.write("Hello, Tornado with Loguru!")


def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])


if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    logger.info("Tornado server started on http://localhost:8888")
    tornado.ioloop.IOLoop.current().start()

说明:

  1. Loguru 配置:Loguru 配置为将日志写入文件 tornado_loguru.log,达到 1 MB 后进行日志轮换。
  2. 使用 Loguru 进行日志记录:使用 logger.info() 代替标准 logs.info(),提供更多功能并更好地控制日志输出。

步骤 3:分析 Loguru 日志

运行 Tornado 应用程序并观察 Loguru 如何在 tornado_loguru.log 中格式化日志。日志将根据配置自动轮换。

演示 3:用于基本监控的健康检查端点

实现健康检查端点是一种简单而有效的监控 Tornado 应用程序基本状态的方法。负载均衡器和监控工具可以使用它来检查应用程序是否处于活动状态并响应。

步骤 1:定义健康检查处理程序

创建一个简单的处理程序,返回 200 OK 状态,表示服务器正在运行。

import tornado.ioloop
import tornado.web


class HealthCheckHandler(tornado.web.RequestHandler):
    def get(self):
        self.set_status(200)
        self.write("OK")


def make_app():
    return tornado.web.Application([
        (r"/health", HealthCheckHandler),
    ])


if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

说明:

  1. Health Check Handler:HealthCheckHandler 返回带有 200 状态代码的“OK”响应,表示应用程序正在运行。
  2. 端点:健康检查在 /health 处公开。

步骤 2:自动执行健康检查

使用监控工具或脚本定期检查 /health 端点。如果端点没有响应 200 OK,则表明应用程序可能已关闭,可以采取适当的措施(例如,重新启动服务或发送警报)。

演示 4:集成 Grafana 和 Prometheus 以获取高级指标

在前面的示例中,我们为我集成了 Prometheustrics 集合。在这里,我们将扩展此设置以使用流行的开源分析和监控解决方案 Grafana 可视化指标。

步骤 1:使用 Docker 运行 Prometheus 和 Grafana

为简单起见,使用 Docker 运行 Prometheus 和 Grafana。创建一个 docker-compose.yml 文件来设置 Prometheus 和 Grafana。

version: '3'


services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    ports:
      - 9090:9090


  grafana:
    image: grafana/grafana
    ports:
      - 3000:3000
scrape_configs:
  - job_name: 'tornado'
    static_configs:
      - targets: ['host.docker.internal:9091']  # Tornado metrics endpoint

步骤 2:配置 Grafana 仪表板

使用以下命令运行 Docker 容器:

docker-compose up -d

通过以下方式访问 Grafana在浏览器中导航到 http://localhost:3000。使用默认登录名 (admin/admin)。

在 Grafana 中添加 Prometheus 作为数据源,将其指向 http://prometheus:9090。

创建仪表板并添加面板以可视化 Tornado 应用程序中的指标。

步骤 3:监控指标

将 Grafana 连接到 Prometheus 后,您可以可视化 Tornado 应用程序中的实时指标。使用 Grafana 强大的查询和可视化功能创建自定义仪表板,以深入了解应用程序的性能。

演示 5:使用 StatsD 进行实时指标收集

StatsD 是另一种流行的实时指标收集和聚合工具。Tornado 可以将指标发送到 StatsD,然后可以使用 Grafana 等工具对其进行可视化。

步骤 1:安装 statsd Python 库

pip install statsd

步骤 2:将指标从 Tornado 发送到 StatsD

将 StatsD 集成到您的 Tornado 应用程序中以发送指标。

import statsd
import tornado.ioloop
import tornado.web


# Initialize StatsD client
statsd_client = statsd.StatsClient('localhost', 8125)


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        # Increment request count metric
        statsd_client.incr('tornado.request.count')
        self.write("Hello, Tornado with StatsD!")


def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])


if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

说明:

  1. StatsD 客户端:创建 StatsClient 对象以将指标发送到在本地主机上运行的 StatsD 服务器。
  2. 指标:每次收到请求时,incr 方法都会增加 tornado.request.count 指标。

步骤 3:可视化指标

使用 Grafana 或其他可视化工具可视化 StatsD 收集的指标。将 StatsD 设置为数据源并创建仪表板以监控 Tornado 应用程序的实时性能。

写在最后:

  1. 这些演示全面概述了如何在 Tornado 应用程序中实现监控和日志记录。通过使用 Sentry、Loguru、Prometheus、Grafana 和 StatsD 等工具,您可以深入了解应用程序性能,快速检测和诊断问题,并保持高质量的用户体验。定制这些解决方案以满足您的特定需求和基础架构,以从 Tornado 应用程序中获得最佳结果。
  2. 监控和日志记录对于维护 Tornado 应用程序的健康和性能至关重要。通过实施有效的日志记录策略并使用 Prometheus 等监控工具,您可以深入了解应用程序的行为,快速诊断问题并确保流畅的用户体验。此处提供的演示可作为将日志记录和监控集成到 Tornado 应用程序中的起点。根据您的特定需求量身定制它们,并随着应用程序的增长而扩展。

通过遵循这些准则并使用提供的示例,您可以增强基于 Tornado 的 Web 应用程序的可靠性和可维护性。祝您编码愉快!

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: