面试题答案
一键面试日志收集
- 使用logging模块:
- 在每个Python多线程服务中,使用Python内置的
logging
模块来记录日志。 - 配置
logging
模块,设置日志级别、格式等。例如:
import logging logging.basicConfig( level = logging.INFO, format='%(asctime)s - %(threadName)s - %(levelname)s - %(message)s' )
- 这里
%(asctime)s
表示时间,%(threadName)s
有助于追踪具体线程,%(levelname)s
是日志级别,%(message)s
为具体日志内容。
- 在每个Python多线程服务中,使用Python内置的
- 添加唯一标识符:为了实现可追踪性,在每个日志记录中添加一个唯一标识符,例如请求ID。可以通过在每个服务的入口生成一个唯一ID,并将其传递给各个相关的函数或模块,在日志记录时带上这个ID。
import uuid request_id = str(uuid.uuid4()) logging.info(f'Process started with request ID: {request_id}')
日志存储
- 使用日志文件:可以将日志存储在本地文件中。在
logging.basicConfig
中配置filename
参数,将日志写入指定文件。logging.basicConfig( level = logging.INFO, format='%(asctime)s - %(threadName)s - %(levelname)s - %(message)s', filename='service.log' )
- 集中式存储(推荐):
- 使用Elasticsearch:
- 安装
elasticsearch
Python客户端库。 - 在每个服务中,配置日志处理器将日志发送到Elasticsearch。例如:
from elasticsearch import Elasticsearch from logging.handlers import ElasticsearchHandler es = Elasticsearch(['localhost:9200']) handler = ElasticsearchHandler(es, index='service-logs') logger = logging.getLogger() logger.addHandler(handler)
- 安装
- 使用Kafka(结合其他存储):
- 安装
kafka - python
库。 - 配置日志处理器将日志发送到Kafka主题。
from kafka import KafkaProducer import json producer = KafkaProducer(bootstrap_servers=['localhost:9092'], value_serializer=lambda v: json.dumps(v).encode('utf - 8')) def send_log_to_kafka(log): producer.send('service - logs - topic', log) producer.flush() logger.addHandler(logging.StreamHandler()) logger.addHandler(logging.Handler(send_log_to_kafka))
- 可以后续通过Kafka Connect等工具将Kafka中的日志数据同步到其他存储,如Elasticsearch。
- 安装
- 使用Elasticsearch:
日志查询
- 基于文件查询:如果使用本地日志文件存储,可以使用命令行工具如
grep
、awk
等进行简单查询。例如,要查找包含特定请求ID的日志:grep 'request_id_value' service.log
- Elasticsearch查询:
- 可以使用Kibana与Elasticsearch配合。Kibana提供了可视化的查询界面。
- 也可以通过Elasticsearch的Python客户端库进行查询。例如:
from elasticsearch import Elasticsearch es = Elasticsearch(['localhost:9200']) query = { "query": { "match": { "message": "specific_log_content" } } } result = es.search(index='service - logs', body=query) print(result)
- Kafka查询:如果日志存储在Kafka中,可以使用Kafka的命令行工具
kafka - console - consumer.sh
进行简单查询,或者开发定制的查询应用程序,从Kafka主题中消费日志数据并进行过滤展示。kafka - console - consumer.sh --bootstrap - servers localhost:9092 --topic service - logs - topic