File: logging.rst

package info (click to toggle)
schedule 1.2.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 300 kB
  • sloc: python: 1,725; makefile: 198
file content (74 lines) | stat: -rw-r--r-- 1,830 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Logging
=======

Schedule logs messages to the Python logger named ``schedule`` at ``DEBUG`` level.
To receive logs from Schedule, set the logging level to ``DEBUG``.

.. code-block:: python

    import schedule
    import logging

    logging.basicConfig()
    schedule_logger = logging.getLogger('schedule')
    schedule_logger.setLevel(level=logging.DEBUG)

    def job():
        print("Hello, Logs")

    schedule.every().second.do(job)

    schedule.run_all()

    schedule.clear()

This will result in the following log messages:

.. code-block:: text

    DEBUG:schedule:Running *all* 1 jobs with 0s delay in between
    DEBUG:schedule:Running job Job(interval=1, unit=seconds, do=job, args=(), kwargs={})
    Hello, Logs
    DEBUG:schedule:Deleting *all* jobs


Customize logging
-----------------
The easiest way to add reusable logging to jobs is to implement a decorator that handles logging.
As an example, below code adds the ``print_elapsed_time`` decorator:

.. code-block:: python

    import functools
    import time
    import schedule

    # This decorator can be applied to any job function to log the elapsed time of each job
    def print_elapsed_time(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            start_timestamp = time.time()
            print('LOG: Running job "%s"' % func.__name__)
            result = func(*args, **kwargs)
            print('LOG: Job "%s" completed in %d seconds' % (func.__name__, time.time() - start_timestamp))
            return result

        return wrapper


    @print_elapsed_time
    def job():
        print('Hello, Logs')
        time.sleep(5)

    schedule.every().second.do(job)

    schedule.run_all()

This outputs:

.. code-block:: text

    LOG: Running job "job"
    Hello, Logs
    LOG: Job "job" completed in 5 seconds