TL, DR; уровни журналов игнорируются при вызове API ведения журнала Stackdriver с использованием CloudLoggingHandler из контейнера Docker с помощью Драйвер Google Cloud Logging.
Подробно. Рекомендуемый способ получения журналов из контейнера Docker, запущенного в Google Compute Engine, - использовать Stackdriver Logging Agent:
Рекомендуется запускать агент Stackdriver Logging на всех экземплярах виртуальных машин. Агент работает как под Linux, так и под Windows. Чтобы установить агент Stackdriver Logging, см. Установка агента Logging.
Следующие шаги были выполнены успешно:
- Убедитесь, что учетная запись службы Compute Engine по умолчанию имеет роли
Editor
иLogs Writer
. - Убедитесь, что у экземпляра виртуальной машины есть область доступа Cloud API для Stackdriver Logging API (полная)
- Установите и запустите Stackdriver Logging Agent.
Затем я скопировал пример CloudLoggingHandler из Документы Python по облачной платформе.
import logging
import google.cloud.logging
from google.cloud.logging.handlers import CloudLoggingHandler
client = google.cloud.logging.Client()
handler = CloudLoggingHandler(client)
cloud_logger = logging.getLogger('cloudLogger')
cloud_logger.setLevel(logging.INFO)
cloud_logger.addHandler(handler)
cloud_logger.error('bad news error')
cloud_logger.warning('bad news warning')
cloud_logger.info('bad news info')
Контейнер Docker запускается с флагом Google Cloud Logging Driver (--log-driver=gcplogs
):
sudo docker run --log-driver=gcplogs --name=server gcr.io/my-project/server:latest
Это работает, однако все журналы, независимо от уровня, видны в Stackdriver только при просмотре «Любой уровень журнала». Как ни странно, само сообщение содержит уровень:
2018-08-22 22:34:42.176 BST
ERROR:bad news error
2018-08-22 22:34:42.176 BST
WARNING:bad news warning
2018-08-22 22:34:42.176 BST
WARNING:bad news info
Это делает невозможным фильтрацию по уровню в пользовательском интерфейсе Stackdriver:
На снимке экрана ниже все значки на левой стороне каждой записи журнала показывают уровень как Any
: