This functionality reports logs collected from the Python logging module (in theory, also logging libraries depending on the core logging module).
To utilize this feature, you will need to add some new configurations to the agent initialization step.
from skywalking import agent, config config.init(collector_address='127.0.0.1:11800', service_name='your awesome service', log_reporter_active=True) # defaults to grpc protocol agent.start()
Log reporter supports all three protocols including grpc
, http
and kafka
, which shares the same config protocol
with trace reporter.
If chosen http
protocol, the logs will be batch-reported to the collector REST endpoint oap/v3/logs
.
If chosen kafka
protocol, please make sure to config kafka-fetcher on the OAP side, and make sure Python agent config kafka_bootstrap_servers
points to your Kafka brokers.
log_reporter_active=True
- Enables the log reporter.
log_reporter_max_buffer_size
- The maximum queue backlog size for sending log data to backend, logs beyond this are silently dropped.
Alternatively, you can pass configurations through environment variables. Please refer to the Environment Variables List for the list of environment variables associated with the log reporter.
Only the logs with a level equal to or higher than the specified will be collected and reported. In other words, the agent ignores some unwanted logs based on your level threshold.
log_reporter_level
- The string name of a logger level.
Note that it also works with your custom logger levels, simply specify its string name in the config.
The following config is disabled by default. When enabled, the log reporter will collect logs disregarding your custom log filters.
For example, if you attach the filter below to the logger - the default behavior of log reporting aligns with the filter (not reporting any logs with a message starting with SW test
)
class AppFilter(logging.Filter): def filter(self, record): return not record.getMessage().startswith('SW test') logger.addFilter(AppFilter())
However, if you do would like to report those filtered logs, set the log_reporter_ignore_filter
to True
.
Note that regardless of the formatting, Python agent will always report the following three tags -
level
- the logger level name
logger
- the logger name
thread
- the thread name
You can set the cause_exception_depth
config entry to a desired level(defaults to 10), which limits the output depth of exception stacktrace in reporting.
This config limits agent to report up to limit
stacktrace, please refer to Python traceback for more explanations.
You can choose to report collected logs in a custom layout.
If not set, the agent uses the layout below by default, else the agent uses your custom layout set in log_reporter_layout
.
'%(asctime)s [%(threadName)s] %(levelname)s %(name)s - %(message)s'
If the layout is set to None
, the reported log content will only contain the pre-formatted LogRecord.message
(msg % args
) without any additional styles or extra fields, stacktrace will be attached if an exception was raised.
You can also choose to report the log messages without any formatting. It separates the raw log msg logRecord.msg
and logRecord.args
, then puts them into message content and tags starting from argument.0
, respectively, along with an exception
tag if an exception was raised.
Note when you set log_reporter_formatted
to False, it ignores your custom layout introduced above.
As an example, the following code:
logger.info("SW test log %s %s %s", 'arg0', 'arg1', 'arg2')
Will result in:
{ "content": "SW test log %s %s %s", "tags": [ { "key": "argument.0", "value": "arg0" }, { "key": "argument.1", "value": "arg1" }, { "key": "argument.2", "value": "arg2" } ] }