Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
History
=======

0.4.2 (2025-07-26)
------------------

* A bugfix to correctly propagate `MessageTemplate` / `@mt` to Seq (tintoy/seqlog#88).

0.4.1 (2025-05-11)
------------------

Expand Down
2 changes: 1 addition & 1 deletion meta.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package:
name: seqlog
version: 0.4.1
version: 0.4.2

requirements:
host:
Expand Down
2 changes: 1 addition & 1 deletion seqlog/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

__author__ = 'Adam Friedman'
__email__ = 'tintoy@tintoy.io'
__version__ = '0.4.1'
__version__ = '0.4.2'


def configure_from_file(file_name, override_root_logger=True, support_extra_properties=False, support_stack_info=False, ignore_seq_submission_errors=False,
Expand Down
38 changes: 36 additions & 2 deletions seqlog/structured_logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,30 @@ def getMessage(self):
else:
return self.msg

def getMessageTemplate(self):
"""
Get the raw (unformatted) message template used to generate the message for the log record (used in cases where formatting will be performed by the target that receives the published log record).
:return: The message template.
"""

if self.msg is None:
warnings.warn('You just passed a None as a message content!', UserWarning)
self.msg = ''

# See https://docs.python.org/3/library/logging.html#logging.LogRecord.getMessage for details
if not isinstance(self.msg, str):
self.msg = str(self.msg)

if self.args:
# Not using {NamedHole}-style formatting, so we still return the formatted log message (since we don't have a _compatible_ message template).
return self.getMessage()
elif self.log_props:
# We're using using {NamedHole}-style formatting, so msg is the message template.
return self.msg
else:
# in this case, we have no message template, and so we can safely assume that the message itself is the message template.
return self.msg


class StructuredLogger(logging.Logger):
"""
Expand Down Expand Up @@ -521,10 +545,15 @@ def _build_event_data_ingest(self, record):

logger_name = record.name if record.name else None

if isinstance(record, StructuredLogRecord):
message_template = record.getMessageTemplate()
else:
message_template = record.getMessage()

event_data = {
"Timestamp": _get_local_timestamp(record),
"Level": logging.getLevelName(record.levelno),
"MessageTemplate": record.getMessage(),
"MessageTemplate": message_template,
"Properties": get_global_log_properties(logger_name)
}

Expand Down Expand Up @@ -579,10 +608,15 @@ def _build_event_data_clef(self, record):

logger_name = record.name if record.name else None

if isinstance(record, StructuredLogRecord):
message_template = record.getMessageTemplate()
else:
message_template = record.getMessage()

event_data = {
"@t": _get_local_timestamp(record, True),
"@l": logging.getLevelName(record.levelno),
"@mt": record.getMessage(),
"@mt": message_template,
}
props = {}
for key, value in get_global_log_properties(logger_name).items():
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def normalize_line_endings(text: str):

setup(
name='seqlog',
version='0.4.1',
version='0.4.2',
description="SeqLog enables logging from Python to Seq.",
long_description=readme + '\n\n' + history,
long_description_content_type='text/x-rst',
Expand Down
1 change: 1 addition & 0 deletions tests/test_configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
format: '[%(levelname)s] %(asctime)s %(name)s: %(message)s'
"""


class TestConfiguration(object):
def test_valid_config(self):
try:
Expand Down