Skip to main content

sync and async logging within one logger instance

Project description

janus-logging

https://travis-ci.com/madkote/janus_logging.svg?branch=master https://codecov.io/gh/madkote/janus-logging/branch/master/graph/badge.svg https://img.shields.io/pypi/v/janus_logging.svg

sync and async logging within one logger instance.

Installation

pip install janus-logging

Usage

Default

import asyncio
import logging
import sys

import janus_logging

def threaded(sync_log, counter: int):
    for i in range(counter):
        sync_log.info('s-Hello #%s' % i)
        sync_log.info('s-Finished #%s' % counter)

async def async_coro(async_log, counter: int):
    for i in range(counter):
        await async_log.info('aio-Hello #%s' % i)
        await async_log.info('aio-Finished #%s' % counter)

#
counter = 4
name = 'my_janus_logger'
level = logging.DEBUG
stream = sys.stdout
loop = asyncio.get_event_loop()
#
logger = janus_logging.JanusLogger(name=name, level=level, loop=loop, stream=stream)
loop.run_until_complete(
    asyncio.gather(
    loop.run_in_executor(
        None,
        threaded,
        logger.logger_sync(),
        counter
    ),
    async_coro(
        logger.logger_async(),
        counter
    )
    )
)
logger.shutdown()
#
#
loop.close()

The output of above will look like:

s-Hello #0
s-Hello #1
s-Hello #2
aio-Hello #0
s-Hello #3
s-Finished #4
aio-Hello #1
aio-Hello #2
aio-Hello #3
aio-Finished #4

Please note, that the output might be different on your instance.

JSON

Simply use fixtures.

import asyncio
import logging
import sys

import janus_logging

def threaded(sync_log, counter: int):
    for i in range(counter):
        sync_log.info(
            's-Hello #%s' % i,
            extra=dict(counter=i, log_type='sync', log_status='in progress')
        )
    sync_log.info(
        's-Finished #%s' % counter,
        extra=dict(total=counter, log_type='sync', log_status='finished')
    )


async def async_coro(async_log, counter: int):
    for i in range(counter):
        await async_log.info(
            'aio-Hello #%s' % i,
            extra=dict(counter=i, log_type='async', log_status='in progress')
        )
    await async_log.info(
        'aio-Finished #%s' % counter,
        extra=dict(total=counter, log_type='async', log_status='finished')
    )

#
counter = 4
name = 'my_janus_logger'
level = logging.DEBUG
stream = sys.stdout
loop = asyncio.get_event_loop()
#
logger = janus_logging.JanusLogger(
    name=name,
    level=level,
    loop=loop,
    fixture=janus_logging.fixture_json,
    stream=stream,
    extra=dict(bla='blabla')
)
loop.run_until_complete(
    asyncio.gather(
        loop.run_in_executor(
            None,
            threaded,
            logger.logger_sync(logger_name='logger_sync'),
            counter
        ),
        async_coro(
            logger.logger_async(logger_name='logger_async'),
            counter
        )
    )
)
logger.shutdown()
#
#
loop.close()

The output of above will look like:

{"level": "INFO", "msg": "s-Hello #0", "log_type": "sync", "bla": "blabla", "logger_name": "logger_sync", "counter": 0, "log_status": "in progress", "logged_at": "2019-09-27T12:00:02.517101+02:00", "line_numer": 35, "function": "threaded", "file_path": "demo_janus_log.py"}
{"level": "INFO", "msg": "aio-Hello #1", "log_type": "async", "logged_at": "2019-09-27T12:00:02.518000+02:00", "line_number": 60, "function": "info", "file_path": "/home/madkote/janus-logging/janus_logging/__init__.py", "bla": "blabla", "logger_name": "logger_async", "counter": 1, "log_status": "in progress"}
...

Custom

If a custom logger, formatter, handler are required, then create custom fixtures and pass them to the JanusLogger.

def fixture_custom(
            name: str,
            level: int,
            loop: loop: asyncio.AbstractEventLoop,
            **kwargs
            ) -> logging.Logger:
    ...
    return ...

logger = janus_logging.JanusLogger(
    ...,
    fixture=fixture_custom,
    ...
)

Development

Issues and suggestions are welcome through issues

Changes

1.3.2 (2020-11-25)

  • Cleanup, remove dependency from aiologger, which has too many issues right now.

1.3.1 (2020-02-05)

  • Cleanup

  • add missing parameter for formatter

1.3.0 (2020-01-31)

  • Cleanup

  • Fix duplicate handlers

1.2.1 (2019-11-19)

  • Fix shutdown()

1.2.0 (2019-10-04)

  • Executor based AsyncLoggerAdapter due to issues with aiologger==0.4.0

1.1.1 (2019-10-01)

  • Fix SyncJsonFormatter

1.1.0 (2019-09-27)

  • Add AsyncNullHandler

1.0.0 (2019-09-27)

  • Initial release

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

janus-logging-1.3.2.tar.gz (8.4 kB view hashes)

Uploaded Source

Built Distribution

janus_logging-1.3.2-py3-none-any.whl (8.0 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page