首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Meraki API -将stdout、stderr重定向到websocket或文件

Meraki API -将stdout、stderr重定向到websocket或文件
EN

Stack Overflow用户
提问于 2022-05-05 18:41:27
回答 1查看 106关注 0票数 0

我使用一个Flask路由来调用Meraky库,并试图将每个API调用的stdout和stderr重定向到一个websocket或最终一个日志文件,这里是我使用的代码:

代码语言:javascript
复制
import meraki
from contextlib import redirect_stdout, redirect_stderr
import io
from flask import Flask
from flask_socketio import SocketIO, emit

async_mode = None

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, async_mode=async_mode)

@app.route('/getOrganizations')
def getOrganizations():
    captured_output = io.StringIO()
    with redirect_stdout(captured_output), redirect_stderr(captured_output):
        try:
            API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            dashboard = meraki.DashboardAPI(API_KEY, output_log=False)

            organizations = dashboard.organizations.getOrganizations()
            socketio.emit('my_test',
                          {'data': captured_output.getvalue()})
            return {'organizations': organizations}

        except meraki.APIError as err:
            print('Error: ', err)
            return {'error': err}

如果我重新启动了Flask服务器,第一次调用就可以正常工作,并获得所需的输出:

代码语言:javascript
复制
2022-05-05 17:02:32 meraki: INFO > Meraki dashboard API session initialized with these parameters: {'version': '1.15.0', 'api_key': '************************************9ea0', 'base_url': 'https://api.meraki.com/api/v1', 'single_request_timeout': 60, 'certificate_path': '', 'requests_proxy': '', 'wait_on_rate_limit': True, 'nginx_429_retry_wait_time': 60, 'action_batch_retry_wait_time': 60, 'retry_4xx_error': False, 'retry_4xx_error_wait_time': 60, 'maximum_retries': 2, 'simulate': False, 'be_geo_id': None, 'caller': None, 'use_iterator_for_get_pages': False} 2022-05-05 17:02:32 meraki: DEBUG > {'tags': ['organizations', 'configure'], 'operation': 'getOrganizations', 'method': 'GET', 'url': '/organizations', 'params': None} 2022-05-05 17:02:32 meraki: INFO > GET https://api.meraki.com/api/v1/organizations 2022-05-05 17:02:33 meraki: INFO > GET https://n392.meraki.com/api/v1/organizations 2022-05-05 17:02:34 meraki: INFO > organizations, getOrganizations - 200 OK

但是在随后的调用中,没有任何东西会被重定向到captured_output,它只返回任何东西!

我尝试过不同的方法。sys.stdout,sys.stderr,带websocket或重定向到文件,FastAPI...you命名它!我只能在服务器重新启动后第一次获得stdout/stderr。

有人有主意吗?

问候

法布里齐奥

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-18 05:18:29

我终于能够解决这个问题了,问题是io.String()是如何处理buffer...but的,我最终得到了一个完整的其他解决方案。我希望捕捉API执行日志并将其显示在web应用程序控制台中,最好的解决方案是将stdout/stderr重定向到redis pub/ server,如下所示:

代码语言:javascript
复制
from rlog import RedisHandler

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s %(name)12s: %(levelname)8s > %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
)

logger = logging.getLogger()
logger.addHandler(RedisHandler(channel='live_log',host=redis_hostname, port=6379))

RedisHandler将stdout/stderr转发给redis,这是一个websocket服务器,然后将所有输出发送到其连接的客户端( webapplication控制台)。结果是一个“活动日志”控制台,它允许您跟踪脚本执行,而无需等待API响应。最终结果可以看到这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72132172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档