Azure WebApp LogStream отображает один и тот же журнал несколько раз и отображает все журналы как [ОШИБКА], даже если они имеют уровень [INFO]

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 20.06.2024 13:44

@Harshitha Какой файл конфигурации? Не могли бы вы объяснить это немного подробнее

user25648715 20.06.2024 20:18

Где вы устанавливаете уровни журнала?

Harshitha 21.06.2024 02:31

@Harshitha Я установил это в вышеупомянутом коде. 'logger.setLevel(logging.INFO)'

user25648715 23.06.2024 19:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я создал пример проекта 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 23.06.2024 19:38

ОК, постараюсь и дам вам знать.

Sirra Sneha 23.06.2024 20:27

@user25648715 user25648715 Я обновил свой ответ в соответствии с вашим комментарием, проверьте, пожалуйста.

Sirra Sneha 24.06.2024 07:18

Это конфигурация, которую я использую в качестве команды запуска: Gunicorn --worker-class uvicorn.workers.UvicornWorker --timeout 600 --access-logfile '-' --error-logfile '-' main:app

user25648715 24.06.2024 08:37

@user25648715 user25648715 Я попробовал настроить команду запуска, у меня она работает нормально, у вас она работает?

Sirra Sneha 24.06.2024 08:49

@ user25648715 Пожалуйста, проверьте, помогло ли вам решение. Дайте мне знать, если я могу чем-то еще помочь

Sirra Sneha 05.07.2024 11:42

Другие вопросы по теме