登录 GCP 或本地

Logging on either GCP or local

假设有一个系统在 GCP 上 运行,但作为备份,可以在本地 运行。

运行在云端时,stackdriver 非常简单。

但是,如果在云端,我需要我的系统推送到 stackdriver,如果不在云端,则使用本地 python 记录器。

我也不想包含任何这样做的逻辑,这应该是自动的。

  1. 记录时,直接记录到 Python/local 记录器。
  2. 如果在 GCP 上 -> 将这些推送到 stackdriver。

我可以编写可以实现此功能的逻辑,但这是不好的做法。肯定有一种直接的方法可以让它发挥作用。

例子

import google.cloud.logging

client = google.cloud.logging.Client()
client.setup_logging()


import logging
cl = logging.getLogger()
file_handler = logging.FileHandler('file.log')
cl.addHandler(file_handler)
logging.info("INFO!")

这基本上会记录到 python 记录器,然后 'always' 上传到云记录器。我怎样才能拥有它,这样我就不需要显式添加 import google.cloud.logging 并且基本上如果安装了 stackdriver,它会直接获取日志?这可能吗?如果不能,有人可以从最佳实践的角度解释如何处理吗?

尝试 1 [有效]

已创建/etc/google-fluentd/config.d/workflow_log.conf

<source>
    @type tail
    format none
    path /home/daudn/this_log.log
    pos_file /var/lib/google-fluentd/pos/this_log.pos
    read_from_head true
    tag workflow-log
</source>

已创建/var/log/this_log.log

pos_file /var/lib/google-fluentd/pos/this_log.pos 存在

import logging
cl = logging.getLogger()
file_handler = logging.FileHandler('/var/log/this_log.log')
file_handler.setFormatter(logging.Formatter("%(asctime)s;%(levelname)s;%(message)s"))
cl.addHandler(file_handler)

logging.info("info_log")
logging.error("error_log")

这行得通!查找特定 VM 而非全局的日志>python

幸运的是,这是一个被处理的故事。 Stackdriver Logging 是一个非常通用的日志记录框架。但是,有多种日志记录 APIs,Google 的目的并不是说您必须重写所有现有应用程序才能利用 Stackdriver 日志记录本机 APIs。相反,您可以使用您选择的日志记录 API(包括标准和事实上的 APIs),然后这些日志记录 APIs 将映射到 Stackdriver。如果在 GCP 环境之外执行,或者您只是希望切换到备用日志收集器,则您的应用程序无需重新编码或重新编译。

可在 Setting Up Language Runtimes and this includes Setting Up Stackdriver Logging for Python.

找到可用于不同语言的日志记录列表 API

对于 Python,在运行时,您有一个配置 属性(例如环境变量)声明您是否希望使用 Stackdriver。如果设置为 true,那么 .. 并且只有这样 ...... 您会执行为 Stackdriver 设置本机 Python 日志记录的登录,否则不会调用该逻辑,因此您将不依赖 Stackdriver。

一段可能的代码可能是:

if os.environ.get('USE_STACKDRIVER') == 'true':
  import google.cloud.logging
  client = google.cloud.logging.Client()
  client.setup_logging()

您无需在程序中专门启用或使用 Stackdriver。您可以使用 Python 记录器并写入任何您想要的文件。但是,Stackdriver 仅记录特定的日志文件。这意味着您需要手动设置 Stackdriver 以记录 "your" 个日志文件。

在您的示例中,您正在写入 file.log。修改 /etc/google-fluentd/config.d/mylogfile.conf 以包含以下内容。您需要指定 file.log 的完整路径,而不仅仅是文件名。在这个例子中,我将其命名为/var/log/mylogfile.log。此示例还假定您的日志每一行都以日期开头。

<source>
  @type tail

  # Parse the timestamp, but still collect the entire line as 'message'
  format /^(?<message>(?<time>[^ ]*\s*[^ ]* [^ ]*) .*)$/

  path /var/log/mylogfile.log
  pos_file /var/lib/google-fluentd/pos/mylogfile.log.pos
  read_from_head true
  tag auth
</source>

有关详细信息,请阅读以下文档:

Stackdriver - Configuring the Agent

现在您的程序将 运行 在 GCP 之外,当 运行 在配置的实例上运行时,登录到 Stackdriver。

注意:我会做与你所要求的相反的事情。我会一直使用 Stackdriver。当不在 GCP 中 运行ning 时,我会在我的桌面、本地服务器等上手动设置 Stackdriver,然后继续登录到 Stackdriver。