日志记录实际上是每个应用程序都必须具备的功能。无论你选择基于哪种技术,都需要监视应用程序的运行状况和操作。随着应用程序扩展,这变得越来越困难,你需要查看不同的文件,文件夹甚至服务器来查找所需的信息。虽然你可以使用内置功能从应用程序本身编写 Python 日志,但应将这些日志集中在 Elastic Stack 之类的工具中。

借助 Elasticsearch 筛选大量数据的效率,应用程序开发人员可以快速缩小最重要的日志的范围。仪表板可发送给运营团队,使他们能够在检测到异常行为时迅速做出反应。

本文将重点介绍为Python应用程序构建健壮的应用程序日志记录基础结构。 Python 是一种非常流行且易于使用的通用编程语言。从学习到编程,再到实施复杂的机器学习解决方案,这是各种活动的绝佳选择。

在我之前的文章 “ Beats: 使用 Filebeat 进行日志结构化 - Python ”,我使用了另外一种方法来记录 Python 日志。

Python 日志概述

Python 随附了一个非常灵活且易于使用的日志记录模块。 与许多日志记录库一样,Python 可以在多个级别进行日志记录(例如,INFO 或 ERROR),以各种方式格式化日志输出,并写入不同的目标位置(例如,控制台或文件)。 实际上,将某些内容记录到文件中很简单:

main.py

import logging
logging.basicConfig(filename="app.log", level=logging.DEBUG)
logging.info('Application running!')

当我们运行上面的 Python 应用后,就会在应用当前的目录里生成一个叫做 app.log 的文件:

app.log

INFO:root:Application running!

当你向日志中添加更多信息时,有必要以人类可读和机器可解析的格式编写日志。 这称为 结构化日志记录 。 JSON结构的日志特别容易传送到 Elastic Stack 中。

将 JSON 格式的日志结构化过程与 Python 的日志记录模块集成在一起很容易,该模块提供了处理程序和格式化程序,以分离处理输出目标和格式化日志本身的问题。 通过这种分离,你可以自定义日志从应用程序代码到其目的地的旅程的任何部分。 实际上, python-json-logger 是一个免费的 Python JSON 记录器。 要进行设置,请先通过 pip 安装它:

pip install python-json-logger

或者针对 Python3 的安装:

pip3 install python-json-logger

接下来,你可以使用具有以下结构的配置文件 logging.conf 来设置 JSON 日志记录。这个文件可以放置于项目的当前目录中:

logging.conf

[loggers]
keys = root
[logger_root]
level = INFO
handlers = root
[handlers]
keys = root
[handler_root]
class = FileHandler
level = INFO
formatter = json
args = ('application.log',)
[formatters]
keys = json
[formatter_json]
class = __main__.ElkJsonFormatter

最后,以下代码允许你编写 JSON 日志:

main.py

import logging
import logging.config
from pythonjsonlogger import jsonlogger
from datetime import datetime;
class ElkJsonFormatter(jsonlogger.JsonFormatter):
    def add_fields(self, log_record, record, message_dict):
        super(ElkJsonFormatter, self).add_fields(log_record, record, message_dict)
        now = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ')
        log_record['@timestamp'] = now
        log_record['level'] = record.levelname
        log_record['logger'] = record.name
logging.config.fileConfig('logging.conf')
logger = logging.getLogger("MainLogger")
logging.info('Application running!')

此代码加载之前在 logging.config 配置中定义的 ElkJsonFormatter 类。 我们本可以直接使用 JsonFormatte r类(来自 python-json-logger)来生成 JSON 日志。 但是,在这种情况下,我们将设置特定的字段(尤其是 @timestamp),这将使将日志更轻松地发送到 Elasticsearch 产生以下结构:

application.log

{"message": "Application running!", "@timestamp": "2021-01-06T03:39:12.846837Z", "level": "INFO", "logger": "root"}

重新运行我们的应用。我们可以在项目当前目录下发现一个叫做 application.log 的文件。

将 Python 日志传送到 Elastic Stack

一旦我们的日志处于我们可以推理的结构中,就可以将其发送到 Elasticsearch 进行处理并生成我们所需的见解。 当日志为 JSON 格式时,这是最容易设置的,但也可以与其他非 JSON 日志一起使用,只要它们具有足够清晰的结构即可解析。

安装 Elastic Stack

如果你还没有安装好自己的 Elastic Stack,那么请参照我之前的文章 “ Elastic:菜鸟上手指南 ” 安装好自己的 Elasticsearch 以及 Kibana。在我们今天的练习中,我将使用 Filebeat 来把数据导入到 Elastic Stack 中。如果你还没有安装好自己的 Filebeat,请阅读之前的介绍文章:

在上面的两篇文章中,它详述了如何安装 Filebeat。

使用 Filebeat 传送 JSON 日志

由于 Filebeat 天生就具有 JSON 处理器,Filebeat 能够很轻松地将 JSON 日志直接传送到 Elasticsearch 中。 为此,我们只需要创建一个 Filebeat 的配置文件:

filebeat_python_logging.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /Users/liuxg/python/python_logging/application.log
  json:
    keys_under_root: true
    overwrite_keys: true
    message_key: 'message'
    add_error_key: true
output.elasticsearch:
  hosts: ["localhost:9200"]
  index: "python_logs"
processors:
 - decode_json_fields:
     fields: ['message']
     target: json
 - drop_fields:
     fields: ["ecs", "agent", "log", "input", "host"]
setup.ilm.enabled: false
setup.template.name: python_logs
setup.template.pattern: python_logs

上面的 paths 路径需要依据你自己的 log 路径改变而改变。在上面我定义了一个特定的索引名称 python_logs。在 filebeat 的安装目录中,我们运行如下的命令:

./filebeat -e -c filebeat_python_logging.yml 

运行完上面的命令后,我们可以在 Kibana 中使用如下的命令进行查看:

GET _cat/indices
yellow open twitter                         ztCFdrdbTHuooTkIdaDcjw 1 1     6   0  10.3kb  10.3kb
green  open .apm-custom-link                p18qhpfTRP6I0xDBjW9Asw 1 0     0   0    208b    208b
green  open .kibana_task_manager_1          nvc7Qkt4RdaCaqClux2G1Q 1 0     5 310 403.5kb 403.5kb
yellow open python_logs                     RihQ0eqIS1ivAtHvC5B_DQ 1 1     1   0   4.5kb   4.5kb
green  open .apm-agent-configuration        hC534SjHSIKdmyH910AVhA 1 0     0   0    208b    208b
green  open kibana_sample_data_logs         QtVaJBiLRc-qj_A0pqlzKw 1 0 14074   0  10.4mb  10.4mb
green  open .kibana-event-log-7.10.0-000001 16sjjPW9QaKsxGw52Snstw 1 0     3   0  16.4kb  16.4kb
green  open .async-search                   i7qc9VdhTlOvBjAbgYTuKQ 1 0     0   0    228b    228b
green  open .kibana_1                       VTuPMA6TRr-vLIRqQFh64g 1 0    97  25  10.4mb  10.4mb

我们可以发现一个新生成的 python_logs 文件已经生成了。我们可以通过如下的命令来查看文档的内容:

GET python_logs/_search
"took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 "hits" : { "total" : { "value" : 1, "relation" : "eq" "max_score" : 1.0, "hits" : [ "_index" : "python_logs", "_type" : "_doc", "_id" : "oOTH1XYBli_HPhP3ZESw", "_score" : 1.0, "_source" : { "@timestamp" : "2021-01-06T03:39:12.846Z", "level" : "INFO", "logger" : "root", "message" : "Application running!"

显然,我们把之前的 application.log 的内容已经成功地导入到 Elasticsearch 之中了。

近几个月来,人们对 ChatGPT 充满了热情,这是一种由 OpenAI 创建的开创性人工智能模型。但 ChatGPT 到底是什么?基于强大的 GPT 架构,ChatGPT 旨在理解文本输入并生成类似人类的响应。GPT 代表 “Generative Pre-trained Transformer”。Transformer 是一种顶尖模型架构,彻底改变了自然语言处理 (NLP) 领域。 在之前的文章 “”,我们详细描述了 Elastic RUM (Real User Monitor)。在今天的文章中,我将详细一步一步地对该文章进行演示以便大家也能和我一样进行展示。和。通常,这四个组件可以通过两种方式协同工作。边缘机器上的 APM 代理将数据发送到集中托管的 APM 集成:在本演示中,我们的边缘设备也即 macOS。它通过 Elastic APM agent 采集信息,并传输到一个中央的 APM 集成。在本次的演示中,我将使用最新的 Elastic Stack 8.6.2 来进行展示。 Elasticsearch 无疑是是目前世界上最为流行的大数据搜索引擎。根据 DB - Engines 的统计,Elasticsearch 雄踞排行榜第一名,并且市场还在不断地扩大:能够成为一名 Elastic 认证工程师也是很多开发者的梦想。这个代表了 Elastic 的最高认证,在业界也得到了很高的认知度。得到认证的工程师,必须除了具有丰富的 Elastic Stack 知识,而且必须有丰富的操作及有效的解决问题的能力。拥有这个认证证书,也代表了个人及公司的荣誉。针对个人的好处是,你可以.. 您们好,我是Elastic的刘晓国。如果大家想开始学习Elastic的话,那么这里将是你理想的学习园地。在我的博客几乎涵盖了你想学习的许多方面。在这里,我来讲述一下作为一个菜鸟该如何阅读我的这些博客文章。我们可以按照如下的步骤来学习:1)Elasticsearch简介:对Elasticsearch做了一个简单的介绍2)Elasticsearch中的一些重要概念:cluster, n.......................................................... 在这篇文章中,我将会把我写的有些内容录制成视频,供大家参考。希望对大家有所帮助。优酷的视频频道地址在这里。Elastic 简介及Elastic Stack 安装:优酷,腾讯 Elastic Stack docker 部署:优酷,腾讯 Elasticsearch中的一些重要概念(Cluster/Shards/Replica/Document/Type/Index):优酷,腾讯 开始使用El............... Elasticsearch是一个非常强大的搜索引擎。它目前被广泛地使用于各个IT公司。Elasticsearch是由Elastic公司创建并开源维护的。它的开源代码位于https://github.com/elastic/elasticsearch。同时,Elastic公司也拥有Logstash及Kibana开源项目。这个三个开源项目组合在一起,就形成了 ELK软件栈。他们三个共同形成了一个强大的... 是一种开源 (Apache 2.0) 规范,是在 Elastic 用户社区的支持下开发的,用于定义在 Elasticsearch 中存储事件数据时要使用的一组通用字段。ECS 的目标是支持并鼓励 Elasticsearch 用户规范化他们的事件数据,以便他们能够更好地分析、可视化和关联事件中表示的数据。ECS是 Elastic 可观察性和安全性解决方案的基础,是一种经过验证且被广泛采用的模式,自2019 年成立以来多年来不断发展壮大。 在我之前的许多文章中,我已经详细地描述了如何配置如下的管道:在实际的使用中,Elastic Stack 中的各个组件极有可能不在同样的一个机器上。我们该如何保证数据在传输过程中的安全呢?我们需要确保在上图所示的每一个连接都是安全的。在今天的教程中,我将详述如何在考虑安全的情况下设置 Filebeat、Logstash、Elasticsearch 和 Kibana。我将在 Ubuntu OS 22.04 上安装最新的 Elastic Stack 8.7.0。 在今天的文章中,我来详述如何部署 Elastic Stack,并使用文章中的示例代码来进行展示。为了展示方便,在今天的展示中,我将所有的组件都安装到同一台机器 macOS 上。它的 private IP 地址为 192.168.0.3。和。通常,这四个组件可以通过两种方式协同工作。边缘机器上的 APM 代理将数据发送到集中托管的 APM 集成:​在本演示中,我们的边缘设备也即 macOS。 Elasticsearch 整合机器学习强化排序, 介绍如何将机器学习预测能力迁移至 ES 内部,增强排序能力, 构建一个高性能,分布式搜排一体系统,并通过落地更多复杂模型特征和更深的计算,为业务带来新的增长点,我们将 LR -> 树模型完成全量排序,给核心业务带来 1.2% 的 ab 增长。我们团队主要负责哈啰四轮司乘匹配的召回排序。在顺风车司乘匹配场景中,司机发单后系统会从订单池中筛选展示合适的乘客订单,促进司机发单到完单,带来营收。整个过程排序是一个非常关键的环节。 我们研究了使用 OpenTelemetry 和 Elastic 监控 ChatGPT。ChatGPT 是一种全球现象,毫无疑问,它会不断发展壮大,很快每个人都会使用它。因为获得响应可能很慢,所以人们能够理解使用此服务的任何代码的性能至关重要。还有成本问题,因为了解这项服务是否正在侵蚀你的利润以及你所要求的是否对你的业务有利可图非常重要。在当前的经济环境下,我们必须密切关注盈利能力。在此处查看此解决方案的代码。请随意使用 “monitor” 库来检测你自己的 OpenAI 代码。 在今天的文章中,我将展示如何使用另外一种过滤器根据类型来保留或者移除一些分词。保留类型分词过滤器能够跨类型保留或删除分词。让我们想象一下项目描述字段,通常这个字段接收带有单词和数字的文本。为所有文本生成分词可能没有意义,为了避免这种情况,我们将使用 Keep 类型分词过滤器。 在这个互联网和信息时代,在应用程序和应用程序中启用基于位置的搜索是一个普遍的要求。基于位置的搜索根据邻近度获取场所或地点,例如附近的餐馆、半径不超过 1 公里的待售房屋等。我们还使用基于位置的搜索来查找前往某个地方或兴趣点的方向。好消息是地理空间支持是 Elasticsearch 中的一等公民。专用数据类型允许我们定义用于索引地理空间数据的模式,从而实现集中搜索。Elasticsearch 提供一组地理空间搜索查询,例如和,具体取决于给定的用例。这些查询足以满足大多数用例。 在我之前的文章 “” 我详述了如何使用已有的处理器来把文档归类到所需要的和文档日期相关的的索引中去。比如,我们想把 2023 年 4 月的所有文档写入到 my-index-2023-04-01 这个索引名称中去。这个处理器很好地解决了在很多情况下,我们需要把当月或者当年的索引放到我们需要的以文档时间戳相关索引名称中,这样便于以后的管理及搜索。在今天的文章中,我们将以另外一种方式来实现同样的方案。 Elastic 技术社区是植根于 Elastic Stack 技术栈的各种开源项目,如果没有这些开放源代码项目的普及,也就不会有大数据搜索的这一细分领域了。国内的开发者们也分享了很多关于开源项目的信息,希望大家能继续与上游的开源项目保持紧密的合作关系,让我们在该领域里一起创新,一起成长。希望所有技术实践者们都能够找到适合自己的交流和分享方式,同时社区也呼唤更多的技术牛人们,踊跃的走向 Meetup 的分享讲台,在分享中不断精进成长,将来也走上 Elastic 开发者大会的讲台。 有时,我们无法控制数据本身,我们需要管理数据的结构,甚至需要在摄取数据时处理字段名称。但有趣的是,我对摄取管道尝试了很多不同的方法,但我找不到解决方案。如你所见,错误与我们上面得到的错误相同。但是,这并不意味着你不能在文档中的任何地方使用这些字段名称。例如,你想使用 Logstash 移动该数据。因此,当你尝试使用 Logstash 摄取它时,你将收到以下错误。Elasticsearch 有一些保留的字段名称,你不能在文档中使用这些名称。究其原因,在上面的 _id 它不是在 root node 下的字段。 我们大多数人已经熟悉 Elastic 产品。在此博客中,我们将逐步介绍配置 Logstash 以使用多个管道摄取和处理数据的步骤。Logstash 是一种开源数据处理管道,可让你摄取、转换和输出数据。它是从各种来源收集和处理大量数据的强大工具,可用于管理和分析日志、指标和其他类型的数据。更多关于 Logstash 的介绍,请阅读我之前的文章 “关于 Logstash 如何处理多个 inputs,请阅读之前的文章 “ 此版本中的另一个新功能是 Elastic Web Crawler 现在支持自定义抓取的编程调度。此功能使你能够注册具有不同配置的多个计划,从而允许你覆盖爬虫的 “默认” 计划配置。例如,你可以为不同的网站安排在不同的时间或间隔进行抓取,或者为内容经常变化的页面安排更频繁的抓取。作为 8.7 中的全新功能,Web 和搜索分析客户端允许你使用 Elastic 通过网站、应用程序和搜索分析来捕获、分析和可视化用户行为,从而为搜索相关性优化和网站改进提供信息。 Elastic Stack 用于大量用例,从操作日志和指标分析到企业和应用程序搜索。 确保你的数据可扩展、持久且安全地传输到 Elasticsearch 非常重要,尤其是对于任务关键型环境。本文档的目的是强调 Logstash 最常见的架构模式以及如何随着部署的增长而有效扩展。 重点将围绕操作日志、指标和安全分析用例,因为它们往往需要更大规模的部署。 此处提供的部署和扩展建议可能因你自己的要求而异。