Meraki API - 将 stdout、stderr 重定向到 websocket 或文件
Meraki API - Redirect stdout, stderr to websocket or file
我正在使用 Flask 路由调用 Meraky python library 并尝试将每个 API 调用的 stdout 和 stderr 重定向到 websocket 或最终日志文件,这里是我的代码米使用:
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 服务器,第一次调用一切正常,我得到了所需的输出:
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,它 returns 什么也没有!
我尝试过不同的方法,例如。 sys.stdout、sys.stderr、使用 websocket 或重定向到文件、Flask、FastAPI...随你便!
我只能在服务器重新启动后第一次获得 stdout/stderr。
有人有想法吗?
此致
法布里齐奥
我终于能够解决这个问题,问题是 io.String() 如何处理缓冲区...但我最终得到了一个完整的其他解决方案。
我一直在寻找 API 执行日志并将其显示在 Web 应用程序控制台中,最好的解决方案是将 stdout/stderr 重定向到 redis pub/sub 服务器,如下所示:
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 服务器然后将所有输出发送到其连接的客户端(web 应用程序控制台)。
结果是一个“实时日志”控制台,让您无需等待 API 响应即可跟踪脚本执行。
最终结果可见here
我正在使用 Flask 路由调用 Meraky python library 并尝试将每个 API 调用的 stdout 和 stderr 重定向到 websocket 或最终日志文件,这里是我的代码米使用:
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 服务器,第一次调用一切正常,我得到了所需的输出:
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,它 returns 什么也没有!
我尝试过不同的方法,例如。 sys.stdout、sys.stderr、使用 websocket 或重定向到文件、Flask、FastAPI...随你便! 我只能在服务器重新启动后第一次获得 stdout/stderr。
有人有想法吗?
此致
法布里齐奥
我终于能够解决这个问题,问题是 io.String() 如何处理缓冲区...但我最终得到了一个完整的其他解决方案。 我一直在寻找 API 执行日志并将其显示在 Web 应用程序控制台中,最好的解决方案是将 stdout/stderr 重定向到 redis pub/sub 服务器,如下所示:
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 服务器然后将所有输出发送到其连接的客户端(web 应用程序控制台)。 结果是一个“实时日志”控制台,让您无需等待 API 响应即可跟踪脚本执行。 最终结果可见here