【问题标题】:Logging Python and Google Cloud记录 Python 和 Google Cloud
【发布时间】:2019-11-18 14:00:14
【问题描述】:

我正在创建一个可以在本地或 Google Cloud 上运行的应用程序。为了设置谷歌云记录,我使用了Google Cloud Logging,制作了一个云记录器,基本上使用下面的类进行记录

class CloudLogger():

    def __init__(self, instance_id: str = LOGGER_INSTANCE_ID, instance_zone: str = LOGGER_INSTANCE_ZONE) -> None:
        self.instance_id = instance_id
        self.instance_zone = instance_zone
        self.cred = service_account.Credentials.from_service_account_file(CREDENTIAL_FILE)
        self.client = gcp_logging.Client(project = PROJECT, credentials=self.cred)
        self.res = Resource(type="gce_instance", 
                    labels={
                        "instance_id": self.instance_id, 
                        "zone": self.instance_zone
                        })
        self.hdlr = CloudLoggingHandler(self.client, resource = self.res)
        self.logger = logging.getLogger('my_gcp_logger')
        self.hdlr.setFormatter(logging.Formatter('%(message)s'))
        if not self.logger.handlers:
            self.logger.addHandler(self.hdlr)
            self.logger.setLevel(logging.INFO)

    def info(self, log_this):    
        self.logger.setLevel(logging.INFO)
        self.logger.info(log_this)

我想要这样,如果它在云上运行,它使用 GCP 记录器,如果在本地运行,它使用 python 日志记录。我既可以作为参数传入(“云”、“本地”),也可以让它足够智能以自行理解。但我希望底层逻辑相同,以便我可以无缝登录到云/本地。我该怎么做呢?

想知道(也许)是否有某种方法可以创建本地记录器。如果在云上运行,则将这些本地日志解析到 GCP。

【问题讨论】:

  • GCP Logger 是指 Stackdriver 吗?你有什么问题?您要检测的问题是在云中运行吗?在 Google Cloud 中运行?或者您想同时支持本地日志文件和 Stackdriver? Stackdriver 日志记录可从您的桌面、Google Cloud 内部以及几乎任何地方使用。您确定本地日志与 Stackdriver 日志的标准是什么?使用详细信息编辑您的问题。
  • @JohnHanley 我想使用 python 记录器进行所有记录。如果我在云端运行,请将这些日志传递给 Stackdriver。所以主记录器:Python,如果云:Stackdriver。
  • @daudnadeem,我知道这个问题,我正在与 Google 讨论这个问题。 @JohnHanley,例如,当您在 Cloud Run(或 AppEngine)中记录事物时,例如 logging.debug,在堆栈驱动程序日志记录中未检测到级别,日志为灰色,因为以纯文本形式打印。如果您使用 Cloud Logging 格式化程序,它运行良好,但在本地,您的日志是 FluentD 格式(JSON,难以阅读)。如果你使用 Cloud Function,它运行良好,因为 Logger 在 Function Build 步骤中的格式很好。

标签: python logging google-cloud-platform


【解决方案1】:

我已经解决了这个问题,Google 也意识到了这一点(Go 也是如此)。我的助手这样做:

  • 我向元数据服务器执行请求。使用此标头Metadata-Flavor: Google 访问http://metadata.google.internal/computeMetadata/v1/project/
    • 如果我有 404,我在本地,我将记录器设置为本地
    • 如果我有 2XX,我在 GCP 上,我将记录器设置为使用 FluentD 格式 (GCP Cloud Logging)

不完美,但对我来说足够了!

【讨论】:

  • 最好的台词是“不完美,但对我来说足够了!”谢谢!
  • 有没有办法自动化这个过程?我最近了解到,让我的代码知道它是否在 GCP 上是不好的做法。就像我写给 python 记录器的东西一样,日志直接传递给 Stackdriver -> Global -> Python。我正在尝试找出一种将所有日志写入 python 的方法。如果在 gcp 上,则传递给 stackdriver。否则保留在 python 中。
  • 我不知道你在哪里读到这个,我很感兴趣去研究这个话题。据我了解,您永远不必根据底层基础设施调整您的流程。但是对于技术数据,比如日志格式,可以在不改变业务逻辑的情况下改变格式,这里就是这样。
  • 我实际上在 19 年参加了谷歌云,在那里他们有一个“询问专家”区域。所以我问了一位专家关于我的日志记录问题,他说你应该做的就是: 1. 在机器上安装 stack-driver-logging 2. 配置它。 3. 它将获取本地日志并将它们推送到stackdriver。此外,当您看到日志时,您是通过 global>python 还是在资源名称下查看它们,例如
  • 非常有趣的反馈。上周我也在伦敦。当我向他们提交我的实施示例时,我没有从谷歌那里得到这个反馈。我挖掘了Google Cloud Stackdriver Logging libraryget_default_handler 的代码做一些接近我的提议的事情。我会再次与谷歌循环以确保
猜你喜欢
  • 1970-01-01
  • 2019-11-10
  • 2019-06-06
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2020-05-19
相关资源
最近更新 更多