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 details)

Uploaded Source

Built Distribution

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

Uploaded Python 3

File details

Details for the file janus-logging-1.3.2.tar.gz.

File metadata

  • Download URL: janus-logging-1.3.2.tar.gz
  • Upload date:
  • Size: 8.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.7.9

File hashes

Hashes for janus-logging-1.3.2.tar.gz
Algorithm Hash digest
SHA256 77360de8f1b1cfbeba8736b4a4c43357451333d4edc5795987f40b540c073ac1
MD5 dfc9744dc9e2fd31c8c7b790e6928321
BLAKE2b-256 9ffaac23eb718489743d08658a90a2993bf9c8f0022e8f7095bd86dfd6f72fc9

See more details on using hashes here.

File details

Details for the file janus_logging-1.3.2-py3-none-any.whl.

File metadata

  • Download URL: janus_logging-1.3.2-py3-none-any.whl
  • Upload date:
  • Size: 8.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.53.0 CPython/3.7.9

File hashes

Hashes for janus_logging-1.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ef29ec3eb497eefad205110f96b68dd816567502ea144a0dffc5ad8715139fb5
MD5 ea83169aa4339b4de6381e91883065a1
BLAKE2b-256 ce8694a797081c4b25d009d78d893333da9c9a4fbe0762ba038c5ca2d6454c3f

See more details on using hashes here.

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