登录 GCP 和本地

2024-04-07

我正在构建一个旨在在 Google Cloud Platform 中的虚拟机上运行的系统。但是,作为一种备份形式,它也可以在本地运行。话虽这么说,我目前的问题是日志记录。我有两个记录器,都可以工作,一个本地记录器和一个云记录器。

云记录器

import google.cloud.logging
from google.cloud.logging.handlers import CloudLoggingHandler
from google.oauth2 import service_account

CREDS = google.cloud.logging.Client(
        project=PROJECT, credentials=service_account.Credentials.from_service_account_file(CREDENTIAL_FILE))

class GoogleLogger(CloudLoggingHandler):

    def __init__(self, client=CREDS):
        super(GoogleLogger, self).__init__(client)

def setup_logging():
    """
    This function can be invoked in order to setup logging based on a yaml config in the 
    root dir of this project
    """
    try:
        # with open('logging.yaml', 'rt') as f:
        with open(LOGGING_CONFIG, 'rt') as f:
            config = yaml.safe_load(f.read())
            f.close()
        logging.config.dictConfig(config)
    except Exception:
        print('Error in Logging Configuration. Using default configs')
        print(traceback.format_exc())
        logging.basicConfig(level=logging.INFO)

日志记录.yaml

version: 1

formatters:
    simple:
        format: "%(name)s - %(lineno)d -  %(message)s"

    complex:
        format: "%(asctime)s - %(name)s | %(levelname)s | %(module)s : [%(filename)s: %(lineno)d] - %(message)s"

    json:
        class: logger.JsonFormatter

handlers:
    console:
        class: logging.StreamHandler
        level: DEBUG
        formatter: complex

    cloud:
        class: logger.GoogleLogger
        formatter: json
        level: INFO

loggers:

    cloud:
        level: INFO
        handlers: [console,cloud]
        propagate: yes

    __main__:
        level: DEBUG
        handlers: [console]
        propagate: yes

I use setup_logging()像这样设置一切:

setup_logging()
logger = logging.getLogger(<type_of_logger>)

can be "cloud" or "__main__"

"main“仅在本地记录,“云”同时记录到 GCP Stackdriver 日志和本地。

现在,如果我不在 GCP 上运行,则会在此处引发错误:

CREDS = google.cloud.logging.Client(
        project=PROJECT, credentials=service_account.Credentials.from_service_account_file(CREDENTIAL_FILE))

解决这个问题的最佳方法是什么?这class GoogleLogger(CloudLoggingHandler):总是会运行,如果不在 GCP 中,它就会崩溃。

一个想法是将类包装在try/except阻止,但这听起来是一个可怕的想法。如何使我的代码足够智能以自动选择哪个记录器?如果在本地运行,则完全忽略GoogleLogger?

编辑(回溯)

File "import_test.py", line 2, in <module>
    from logger import setup_logging
  File "/Users/daudn/Documents/clean_space/tgs_workflow/utils/logger.py", line 16, in <module>
    class GoogleLogger(CloudLoggingHandler):
  File "/Users/daudn/Documents/clean_space/tgs_workflow/utils/logger.py", line 23, in GoogleLogger
    project=PROJECT, credentials=service_account.Credentials.from_service_account_file(CREDENTIAL_FILE))
  File "/usr/local/lib/python3.7/site-packages/google/cloud/logging/client.py", line 123, in __init__
    self._connection = Connection(self, client_info=client_info)
  File "/usr/local/lib/python3.7/site-packages/google/cloud/logging/_http.py", line 39, in __init__
    super(Connection, self).__init__(client, client_info)
TypeError: __init__() takes 2 positional arguments but 3 were given

这是由于不良继承造成的。

尝试将客户传递给父母__init__ instead

class LoggingHandlerInherited(CloudLoggingHandler):
    def __init__(self):
        super().__init__(client=google.cloud.logging.Client())

确保您的环境中有 GOOGLE_APPLICATION_CREDENTIALS

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

登录 GCP 和本地 的相关文章

随机推荐

  • .NET 中的值类型实际上是如何工作的?

    我在理解 NET 中的值类型表示时遇到问题 每个值类型都派生自 System ValueType 类 那么这是否意味着值类型是一个类 例如 如果我写 int x 5 这意味着我创建了一个实例System Int32类an 将其写入变量x S
  • 如何监听任意端口的广播包?

    使用 NET 如何在任何端口上侦听发送到 255的udp广播数据包 而不需要绑定到特定端口 我自己找到了办法 它是这样工作的 mainSocket new Socket AddressFamily InterNetwork SocketTy
  • JavaScript 访问父对象属性

    我在 JS 中遇到一个小问题 我有两个嵌套对象 我想从父对象访问一个变量 如下所示 var parent a 5 child b 3 displayA function console log this a undefined displa
  • iOS 中的本地通知没有任何声音

    void notifyMe UILocalNotification localNotification UILocalNotification alloc init localNotification fireDate NSDate dat
  • Git:父提交比后代提交年轻?

    我正在浏览http arago project org git projects linux omap3 git http arago project org git projects linux omap3 gitrepo 并遇到了一个奇
  • MASM0015; Web服务HandlerTubeFactory异常

    我正在尝试创建一个可以调用另一个的网络服务链 我已经创建了第一个服务并成功部署在 weblogic12c 上 当第一个 Web 服务尝试调用外部 Web 服务时 出现以下异常 notifyAbout WSTestOuter outer ne
  • 使用 javascript 加载部分 html

    在我的网站上 我加载在服务器 nodejs 上呈现的 html 并将其插入到正确的位置 大多数情况下是带有 id 内容的 div 如何在客户端插入接收到的 html 以便执行包含的脚本标记 我在客户端使用下划线和把手 但 vanillajs
  • 为什么GK110有192个核心和4个扭曲?

    我想感受一下开普勒的架构 但这对我来说没有意义 如果一个 warp 有 32 个线程 其中 4 个被调度 执行 则意味着 128 个核心正在使用 64 个核心处于空闲状态 白皮书中提到了独立指令 那么64核是为这些指令保留的吗 如果是这样
  • 如何从此类图像中删除背景?

    我想删除该图像的背景以仅获取人物 我有数千张这样的图像 基本上是一个人和一个有点发白的背景 我所做的是使用边缘检测器 例如 canny 边缘检测器或索贝尔滤波器 来自skimage图书馆 然后我认为可以做的是 将边缘内的像素变白 并将边缘外
  • 如何在 React + Babel 中允许异步函数?

    我有一个 Typescript React 应用程序 它可以使用 then catch Promise 执行异步函数 但不能使用 async await try catch 执行异步函数 错误是 Uncaught ReferenceErro
  • 使用 Visual Studio 查找 C++ 应用程序中的内存泄漏

    在Linux中 我一直使用valgrind来检查应用程序中是否存在内存泄漏 Windows 中的等效项是什么 这可以用 Visual Studio 2010 来完成吗 Visual Studio 2019 有一个不错的内存分析工具 它可以在
  • jpql“加入获取”与 EntityGraph

    我想使用 jpql 或 jpa 实体图加载相关实体 看起来两者都做同样的事情 我为什么要使用实体图而不是普通的jpql 有什么好处吗 使用jpql有什么区别 select distinct u from User u join fetch
  • 无法从“node_modules\react-native-gesture-handler\createHandler.js”解析“fbjs/lib/areEqual”

    我正在使用 expo 构建一个反应本机应用程序 但是 我有一个错误 因此我无法继续构建该应用程序 我什至在错误消息中提到的node modules 中查找了文件 我正在使用 React native gesture handler 进行屏幕
  • 快速引导大量分层数据的策略以及在任何记录发生更改时更新 Elasticsearch 中的单个分层 json 文档的方法

    根据业务场景 来自 2 个关系表 最好是多个表 例如 6 7 的列必须合并到单个分层 json 文档中 以用于 Elasticsearch 上的单个索引 如下面示例文档中所述 样本文件 员工及联系信息 id 1 name tom john
  • 如何在 TypeORM 查找选项中设置 IS NULL 条件?

    在我的查询中我使用 TypeORMfind选项 我怎样才能拥有IS NULL条件在where clause 如果有人正在寻找 NOT NULL 它会是这样的 import IsNull Not from typeorm return awa
  • AWS CloudWatch 未使用的自定义指标保留和定价 - 2018 年

    如果我理解正确的话 自定义指标似乎将保留 15 个月 因为根据数据 它们会聚合为更高分辨率https aws amazon com cloudwatch faqs https aws amazon com cloudwatch faqs 这
  • 正则表达式匹配未完成

    我曾经有过一次回答了一个问题 https stackoverflow com a 17723854 882200关于将带引号的字符串与转义引号匹配 似乎有些情况会在 NET 上挂起并在 Mono 上崩溃 带有OutOfMemoryExcep
  • 使用描述符进行类型提示

    In 这个拉取请求 https github com python mypy pull 2266看起来添加了对描述符的类型提示支持 然而 似乎没有发布最终的 正确 用法示例 也没有添加任何文档到typing module https doc
  • C# htmlagilitypack,捕获重定向

    大家好 这真的很简单 我希望 我正在使用 htmlagility pack 进行网络爬虫 那么 如果我输入 url 然后将我定向到新的 url 会发生什么情况 如何捕获该新的重定向 URL 如果 htmlagilitypack 没有办法 有
  • 登录 GCP 和本地

    我正在构建一个旨在在 Google Cloud Platform 中的虚拟机上运行的系统 但是 作为一种备份形式 它也可以在本地运行 话虽这么说 我目前的问题是日志记录 我有两个记录器 都可以工作 一个本地记录器和一个云记录器 云记录器 i