Azure WebApp LogStream отображает один и тот же журнал несколько раз и отображает все журналы как [ОШИБКА], даже если они имеют уровень [INFO]. На следующем изображении показан фактический снимок экрана потока журнала. Журналы
Следующий код Python показывает реализацию logger.py. `
import logging
import os
import uuid
from opencensus.ext.azure.log_exporter import AzureLogHandler
class CustomFormatter(logging.Formatter):
def __init__(self, fmt=None, datefmt=None, style='%', custom_value=''):
super().__init__(fmt, datefmt, style)
self.custom_value = custom_value
def format(self, record):
# Add the custom value to the log record
record.custom_value = self.custom_value
# Call the original format method
return super().format(record)
def set_logger():
logger_id = str(uuid.uuid4())
logging.basicConfig(level=logging.INFO)
format_str = 'log_id: %(custom_value)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s'
handler = logging.StreamHandler()
custom_formatter = CustomFormatter(fmt=format_str, custom_value=logger_id)
handler.setFormatter(custom_formatter)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.addHandler(AzureLogHandler(connection_string=os.environ["LOG_CONNECTION_STRING"]))
logger.addHandler(handler)
return logger
`
Мне нужно отображать уникальные журналы без повторов и следить за тем, чтобы журналы INFO отображались как INFO, журналы ERROR как ERROR и так далее.
@Harshitha Какой файл конфигурации? Не могли бы вы объяснить это немного подробнее
Где вы устанавливаете уровни журнала?
@Harshitha Я установил это в вышеупомянутом коде. 'logger.setLevel(logging.INFO)'
Я создал пример проекта Fast API с ведением журналов Azure, успешно развернул его в службе приложений Azure и без проблем отобразил журналы.
Я установил следующие пакеты в свой проект
pip install fastapi uvicorn
pip install opencensus-ext-azure
Это структура моего проекта:
Fastapilogging/
├── venv/
├── logger.py
├── main.py
├── .env
└── requirements.txt
настроить виртуальную среду
python -m venv venv
venv\Scripts\activate
Регистратор .py:
import logging
import os
import uuid
from opencensus.ext.azure.log_exporter import AzureLogHandler
class CustomFormatter(logging.Formatter):
def __init__(self, fmt=None, datefmt=None, style='%', custom_value=''):
super().__init__(fmt, datefmt, style)
self.custom_value = custom_value
def format(self, record):
record.custom_value = self.custom_value
return super().format(record)
def set_logger():
logger_id = str(uuid.uuid4())
logging.basicConfig(level=logging.INFO)
format_str = 'log_id: %(custom_value)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s'
handler = logging.StreamHandler()
custom_formatter = CustomFormatter(fmt=format_str, custom_value=logger_id)
handler.setFormatter(custom_formatter)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
connection_string = os.getenv("LOG_CONNECTION_STRING")
if connection_string:
logger.addHandler(AzureLogHandler(connection_string=connection_string))
logger.addHandler(handler)
return logger
Добавьте строку подключения в ваш файл .env. .env:
LOG_CONNECTION_STRING=your_azure_connection_string_here
И запустите эту команду
pip install python-dotenv
Я добавил load_dotenv()
в основной .py, чтобы он загружал переменную среды из .env
основной .py:
from fastapi import FastAPI
from logger import set_logger
from dotenv import load_dotenv
import os
load_dotenv()
app = FastAPI()
logger = set_logger()
@app.get("/")
def read_root():
logger.info("Info level log: Hello, world!")
logger.error("Error level log: Something went wrong!")
return {"message": "Hello, World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
logger.info(f"Fetching item {item_id} with query {q}")
return {"item_id": item_id, "q": q}
Локальный выход:
Прежде чем развертывать приложение в Службе приложений Azure, выполните следующую команду в корневом каталоге проекта.
pip freeze > requirements.txt
Это создаст файл requirements.txt
со всеми зависимостями, необходимыми для вашего проекта.
задайте для переменной среды WEBSITE_RUN_FROM_PACKAGE
значение 1
в службе приложений Azure.
Добавьте приведенную ниже команду запуска в раздел «Конфигурация» веб-приложения.
uvicorn main:app --host 0.0.0.0 --port 8000
Вывод после развертывания:
Поток журнала:
Спасибо за отличное объяснение. К сожалению, я забыл упомянуть, что использую FastAPI, а не Flask. В любом случае, я внес те же изменения в код в logger.py, но результат остался тот же.
ОК, постараюсь и дам вам знать.
@user25648715 user25648715 Я обновил свой ответ в соответствии с вашим комментарием, проверьте, пожалуйста.
Это конфигурация, которую я использую в качестве команды запуска: Gunicorn --worker-class uvicorn.workers.UvicornWorker --timeout 600 --access-logfile '-' --error-logfile '-' main:app
@user25648715 user25648715 Я попробовал настроить команду запуска, у меня она работает нормально, у вас она работает?
@ user25648715 Пожалуйста, проверьте, помогло ли вам решение. Дайте мне знать, если я могу чем-то еще помочь
Поделитесь, пожалуйста, файлом конфигурации.