Azure / Azure/azure-functions-python-worker
[Bug] Can't flush stdout at shutdown
- Dominant language
- Python
- Stars
- 357
- Forks
- 116
- Avg merge
- 32m
- Merged PRs (30d)
- 1
Description
### Expected Behavior
Hello everyone, I have some azure functions that were working for long time and now they stopped, also locally they work fine, so I tried to investigate for the error, I think the error is due to the fact that I created an AzureLogHandler, that's supposed to log some informations to my Azure Log Analytics and the flush is not well supported. I see that your code is calling `sys.stdout.flush()` [here ](https://github.com/Azure/azure-functions-python-worker/blob/8214d0cec972a31ab165dc2f1cf25518bc58ff07/azure_functions_worker/dispatcher.py#L644) but I guess that's not the right way, maybe it should be done calling [logging.shutdown()](https://docs.python.org/3/library/logging.html#logging.shutdown), so that it doesn't fail.
### Actual Behavior
The Azure function is running fine, but at the end I get this error: `Result: Failure Exception: AttributeError: 'PrintLogger' object has no attribute 'flush' Stack: File "/azure-functions-host/workers/python/3.9/LINUX/X64/azure_functions_worker/dispatcher.py", line 643, in _handle__invocation_request sys.stdout.flush()`
I'd like it to stop throwing this error.
### Steps to Reproduce
_No response_
### Relevant code being tried
```shell
from collections import namedtuple
import json
import os
import datetime
from laura.powerbi_pilot import PowerBIPilot
import logging
import azure.functions as func
from opencensus.ext.azure.log_exporter import AzureLogHandler
def get_powerbi_vars(workspace_id):
powerbi_vars = namedtuple("powerbi_vars", [
'appid',
'password',
'tenant_id',
'workspace_id'
])
t = [os.environ['PowerBiSPAppId'],
os.environ['PowerBiSPSecretId'],
os.environ['TenantId'],
workspace_id
]
powerbi_vars = powerbi_vars._make(t)
return powerbi_vars
def main(logdatasetrefreshtimer: func.TimerRequest) -> None:
utc_timestamp = datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
if logdatasetrefreshtimer.past_due:
logging.info('The timer is past due!')
data_logger = logging.getLogger("data_logging")
data_logger.setLevel(logging.INFO)
logging.info('Fetching APPINSIGHTS key')
app_insights_instr_key = os.environ["APPINSIGHTS_INSTRUMENTATIONKEY"]
logging.info('Adding key to handler')
data_logger.addHandler(AzureLogHandler(
connection_string=f"InstrumentationKey={app_insights_instr_key}")
)
workspaces = list(os.environ["PowerBiWorkspaces"].split(","))
for workspace in workspaces:
logging.info(f"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Workspace: {workspace}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
powerbi_pilot = PowerBIPilot(
powerbi_vars=get_powerbi_vars(workspace_id=workspace))
try:
powerbi_pilot.get_token()
datasets = (json.loads(powerbi_pilot.list_datasets_from_group(powerbi_pilot.workspace_id).content)['value'])
#logging.info(datasets)
for dataset in datasets:
if dataset['name'] not in ["Report Usage Metrics Model","Usage Metrics Report"]:
logging.info(
f"~~~~~~~~~~~~~~ Refresh history dataset: {dataset['id']}: {dataset['name']} ~~~~~~~~~~~~~~")
for refresh in (json.loads(powerbi_pilot.get_refresh_history(dataset['id']).content)['value']):
refresh['dataset'] = dataset['id']
refresh['workspace'] = workspace
data_logger.info(json.dumps(refresh))
except Exception as e:
logging.info(e)
```
### Relevant log output
```shell
06/07/2024, 06:00:09.452
Error
Result: Failure Exception: AttributeError: 'PrintLogger' object has no attribute 'flush' Stack: File "/azure-functions-host/workers/python/3.9/LINUX/X64/azure_functions_worker/dispatcher.py", line 643, in _handle__invocation_request sys.stdout.flush()
06/07/2024, 06:00:09.452
Error
Executed 'Functions.PowerBiLogger' (Failed, Id=6799712d-8639-48e6-85c4-5a506d2a99ab, Duration=9449ms)
06/07/2024, 06:00:09.460
Error
Result: Failure Exception: AttributeError: 'PrintLogger' object has no attribute 'flush' Stack: File "/azure-functions-host/workers/python/3.9/LINUX/X64/azure_functions_worker/dispatcher.py", line 643, in _handle__invocation_request sys.stdout.flush()
```
### requirements.txt file
```shell
azure-functions
requests
databricks-cli
opencensus-ext-azure
pandas
./domains/data_tamers/functions/shared/wheels/laura-0.22.0-py3-none-any.whl
```
### Where are you facing this problem?
Production Environment (explain below)
### Function app name
_No response_
### Additional Information
_No response_
Contributor guide
Assessment
This issue has not been assessed yet.