Skip to content

Commit 4e5862d

Browse files
vdk-structlog: LTSV formatting (#2887)
This PR incorporates the LTSV formatting which was present in the vdk-logging-format plugin to vdk-structlog, rendering vdk-logging- format unneccessary. Addresses #2812 Testing done: unit tests cover LTSV formatting --------- Signed-off-by: Gabriel Georgiev <gageorgiev@vmware.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 745b14d commit 4e5862d

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

projects/vdk-plugins/vdk-structlog/src/vdk/plugin/structlog/formatters.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,24 @@ def add_fields(
3939
del log_record["created"]
4040

4141

42+
class LtsvFormatter(Formatter):
43+
"""
44+
Formats logs in the Labelled Tab Separated Values (LTSV) format.
45+
You can read more about this format here: http://ltsv.org/
46+
47+
"""
48+
49+
def format(self, record: LogRecord) -> LogRecord:
50+
record.message = record.getMessage()
51+
record.timestamp = self.formatTime(record, self.datefmt)
52+
record.line_number = record.lineno
53+
if ("level" not in record.__dict__) or (not record.__dict__["level"]):
54+
record.level = record.levelname
55+
56+
s = self.formatMessage(record)
57+
return s
58+
59+
4260
class ConsoleFormatter(Formatter):
4361
"""
4462
Console formatter. Basically the same as logging.Formatter.
@@ -102,6 +120,17 @@ def build_console_format(self) -> str:
102120
out.append("- %(message)s")
103121
return " ".join(out)
104122

123+
def build_ltsv_format(self) -> str:
124+
out = []
125+
for key in self._metadata_keys:
126+
if key in STRUCTLOG_LOGGING_METADATA_ALL:
127+
out.append(key + ":" + STRUCTLOG_LOGGING_METADATA_ALL[key])
128+
else:
129+
out.append(key + ":" + f"%({key})s")
130+
out.append("message:%(message)s")
131+
ltsv_format = "\t".join(out)
132+
return ltsv_format
133+
105134

106135
def create_formatter(logging_format: str, metadata_keys: str) -> [Formatter, Filter]:
107136
"""
@@ -118,6 +147,11 @@ def create_formatter(logging_format: str, metadata_keys: str) -> [Formatter, Fil
118147
StructlogMetadataBuilder(metadata_keys).build_json_format()
119148
)
120149
custom_key_filter = JsonMetadataFilter(key_set)
150+
elif logging_format == "ltsv":
151+
formatter = LtsvFormatter(
152+
fmt=StructlogMetadataBuilder(metadata_keys).build_ltsv_format()
153+
)
154+
custom_key_filter = ConsoleMetadataFilter(key_set)
121155
else:
122156
formatter = ConsoleFormatter(
123157
fmt=StructlogMetadataBuilder(metadata_keys).build_console_format()

projects/vdk-plugins/vdk-structlog/tests/test_structlog.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@
3737
"function_name": "run",
3838
"vdk_job_name": JOB_NAME,
3939
},
40+
"ltsv": {
41+
"timestamp": r"timestamp:\d+\.\d+",
42+
"level": r"level:INFO",
43+
"file_name": r"file_name:10_dummy\.py",
44+
"line_number": "line_number:[0-9]+",
45+
"function_name": "function_name:run",
46+
"vdk_job_name": f"vdk_job_name:{JOB_NAME}",
47+
},
4048
"json": {
4149
"timestamp": r'"timestamp": \d+\.\d+',
4250
"level": '"level": "INFO"',
@@ -48,7 +56,7 @@
4856
}
4957

5058

51-
@pytest.mark.parametrize("log_format", ["console", "json"])
59+
@pytest.mark.parametrize("log_format", ["console", "ltsv", "json"])
5260
def test_structlog(log_format):
5361
with mock.patch.dict(
5462
os.environ,
@@ -76,7 +84,7 @@ def test_structlog(log_format):
7684
)
7785

7886

79-
@pytest.mark.parametrize("log_format", ["console", "json"])
87+
@pytest.mark.parametrize("log_format", ["console", "ltsv", "json"])
8088
def test_stock_fields_removal(log_format):
8189
stock_field_reps = STOCK_FIELD_REPRESENTATIONS[log_format]
8290

0 commit comments

Comments
 (0)