11import argparse
2+ import logging
3+ import os
24from concurrent import futures
35
46import grpc
57import structlog
68import sys
7- import os
8-
99from cloudquery.discovery_v1 import discovery_pb2_grpc
1010from cloudquery.plugin_v3 import plugin_pb2_grpc
11+ from structlog import wrap_logger
1112
1213from cloudquery.sdk.docs.generator import Generator
1314from cloudquery.sdk.internal.servers.discovery_v1.discovery import DiscoveryServicer
1617
1718DOC_FORMATS = ["json", "markdown"]
1819
19-
2020_IS_WINDOWS = sys.platform == "win32"
2121
2222try:
3333
3434
3535def get_logger(args):
36+ log_level_map = {
37+ "debug": logging.DEBUG,
38+ "info": logging.INFO,
39+ "warning": logging.WARNING,
40+ "error": logging.ERROR,
41+ "critical": logging.CRITICAL,
42+ }
43+
44+ logging.basicConfig(
45+ format="%(message)s",
46+ stream=sys.stdout,
47+ level=log_level_map.get(args.log_level.lower(), logging.INFO),
48+ )
49+
3650 processors = [
3751 structlog.contextvars.merge_contextvars,
3852 structlog.processors.add_log_level,
3953 structlog.processors.StackInfoRenderer(),
4054 structlog.dev.set_exc_info,
41- structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S", utc=False),
55+ structlog.stdlib.filter_by_level,
56+ structlog.processors.TimeStamper(fmt="%Y-%m-%dT%H:%M:%SZ", utc=True),
4257 ]
4358 if args.log_format == "text":
4459 processors.append(
@@ -58,9 +73,7 @@ def get_logger(args):
5873 else:
5974 processors.append(structlog.processors.JSONRenderer())
6075
61- # if args.log_format == "json":
62- # processors.append(structlog.processors.JSONRenderer())
63- log = structlog.get_logger(processors=processors)
76+ log = wrap_logger(logging.getLogger(), processors=processors)
6477 return log
6578
6679
@@ -73,16 +86,42 @@ def run(self, args):
7386 subparsers = parser.add_subparsers(dest="command", required=True)
7487
7588 serve_parser = subparsers.add_parser("serve", help="Start plugin server")
89+ serve_parser.add_argument(
90+ "--log-format",
91+ type=str,
92+ default="text",
93+ choices=["text", "json"],
94+ help="logging format",
95+ )
7696 serve_parser.add_argument(
7797 "--log-level",
7898 type=str,
7999 default="info",
80100 choices=["trace", "debug", "info", "warn", "error"],
81101 help="log level",
82102 )
103+
104+ # ignored for now
83105 serve_parser.add_argument(
84- "--log-format", type=str, default="text", choices=["text", "json"]
106+ "--no-sentry",
107+ action="store_true",
108+ help="disable sentry (placeholder for future use)",
85109 )
110+ # ignored for now
111+ serve_parser.add_argument(
112+ "--otel-endpoint",
113+ type=str,
114+ default="",
115+ help="Open Telemetry HTTP collector endpoint (placeholder for future use)",
116+ )
117+ # ignored for now
118+ serve_parser.add_argument(
119+ "--otel-endpoint-insecure",
120+ type=str,
121+ default="",
122+ help="Open Telemetry HTTP collector endpoint (for development only) (placeholder for future use)",
123+ )
124+
86125 serve_parser.add_argument(
87126 "--address",
88127 type=str,
@@ -140,15 +179,16 @@ def _serve(self, args):
140179 PluginServicer(self._plugin, logger), self._server
141180 )
142181 self._server.add_insecure_port(args.address)
143- print ("Starting server. Listening on " + args.address)
182+ logger.info ("Starting server", address= args.address)
144183 self._server.start()
145184 self._server.wait_for_termination()
146185
147186 def stop(self):
148187 self._server.stop(5)
149188
150189 def _generate_docs(self, args):
151- print("Generating docs in format: " + args.format)
190+ logger = get_logger(args)
191+ logger.info("Generating docs", format=args.format)
152192 generator = Generator(
153193 self._plugin.name(),
154194 self._plugin.get_tables(
0 commit comments