英文:
GCP: Creating Client() object locally
问题
以下是翻译好的部分:
我有这个用于日志记录到 StackDriver 的类。
```python
from google.cloud.logging.handlers import CloudLoggingHandler
from google.oauth2 import service_account
class GoogleLogger(CloudLoggingHandler):
CREDS = google.cloud.logging.Client(
project=PROJECT, credentials=service_account.Credentials.from_service_account_file("/path/to/creds"))
def __init__(self, client=CREDS):
super(GoogleLogger, self).__init__(client)
当在 Google 云上运行时,这个类可以无缝运行。但是,在本地运行时,它会在 CREDS = google.cloud.logging.Client(project=PROJECT, credentials=service_account.Credentials.from_service_account_file("/path/to/creds"))
处中断,并且我的整个代码都会崩溃。
问题: 是否有办法在不在云上运行时跳过实例化这个类?比如条件类?
或者
问题: 是否有办法让这个在本地运行?它应该可以运行。我已经提供了凭据和项目,根据StackDriver文档,如果我提供了项目和凭据,它应该可以在本地和GCP上运行?
当出现问题时,以下是回溯信息:
Traceback (most recent call last):
File "/Users/daudn/Documents/clean_space/tgs_workflow/utils/logger.py", line 27, in <module>
class GoogleLogger(CloudLoggingHandler):
File "/Users/daudn/Documents/clean_space/tgs_workflow/utils/logger.py", line 36, in GoogleLogger
project=PROJECT, credentials=service_account.Credentials.from_service_account_file(local_or_gcp()))
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
<details>
<summary>英文:</summary>
I have this class which is used for logging to StackDriver.
from google.cloud.logging.handlers import CloudLoggingHandler
from google.oauth2 import service_account
class GoogleLogger(CloudLoggingHandler):
CREDS = google.cloud.logging.Client(
project=PROJECT, credentials=service_account.Credentials.from_service_account_file("/path/to/creds"))
def __init__(self, client=CREDS):
super(GoogleLogger, self).__init__(client)
When run on the google cloud, this works seamlessly. However, when run locally it breaks at `CREDS = google.cloud.logging.Client(project=PROJECT, credentials=service_account.Credentials.from_service_account_file("/path/to/creds"))`
And my entire code breaks.
**Question:** Is there any way to skip instantiating this class if not on the cloud? Like a conditional class?
*OR*
**Question:** Is there any way to make this work locally? It should work. I give it the creds and the project and according to [StackDriver docs](https://cloud.google.com/logging/docs/setup/go) if I give it the project + creds, it should work locally as well as in GCP?
When it breaks this is the traceback:
Traceback (most recent call last):
File "/Users/daudn/Documents/clean_space/tgs_workflow/utils/logger.py", line 27, in <module>
class GoogleLogger(CloudLoggingHandler):
File "/Users/daudn/Documents/clean_space/tgs_workflow/utils/logger.py", line 36, in GoogleLogger
project=PROJECT, credentials=service_account.Credentials.from_service_account_file(local_or_gcp()))
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
</details>
# 答案1
**得分**: 2
Google在此更改中添加了`client_info`参数:https://github.com/googleapis/google-cloud-python/pull/7849/files#diff-340196d499e9d0eea25cd457f53bfa42L31
我怀疑您在GCP环境中运行的是Google Cloud Python SDK的更新版本,在本地环境中运行的是较旧的版本。
<details>
<summary>英文:</summary>
Google added the `client_info` parameter in this change: https://github.com/googleapis/google-cloud-python/pull/7849/files#diff-340196d499e9d0eea25cd457f53bfa42L31
I suspect you are running a newer version of the Google Cloud Python SDK in your GCP environment and and older version on your local environment.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论