-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdtrack_logger.py
More file actions
126 lines (97 loc) · 4.03 KB
/
dtrack_logger.py
File metadata and controls
126 lines (97 loc) · 4.03 KB
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# Copyright (c) 2025, Advanced Realtime Tracking GmbH & Co. KG
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of copyright holder nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
"""Logger"""
# TODO, see also `vrController.vrLogInfo()` etc.
import inspect
class Logger:
def __init__(self):
self.callCount = {}
self.countTag = {}
self.enabled = False
def enable( self, enableLog ):
self.enabled = enableLog
def _caller( self):
if self.enabled:
fr = inspect.currentframe().f_back.f_back
fctName = fr.f_code.co_name
lineNo = fr.f_lineno
clsName = ''
if 'self' in fr.f_locals:
clsName = fr.f_locals['self'].__class__.__name__ + '.'
return clsName + fctName + "(" + str( lineNo ) + ")"
def out( self, msg, every = 1, reset = False ):
if self.enabled:
caller = self._caller()
if caller in self.callCount and not reset:
self.callCount[ caller ] += 1
else:
self.callCount[ caller ] = 1
self.countTag[ caller ] = ''
every = 1 if every < 1 else every
if every > 1:
self.countTag[ caller ] = ' [x{}]'.format( every)
if self.callCount[ caller ] % every == 0:
print( "{}: {}{}".format( caller, msg, self.countTag[ caller ] ) )
dtrackLog = Logger()
# # Alternative logger based on 'logging' (does not allow a reset like 'Logger' above)
#
# if False:
#
# import logging
#
# logging.basicConfig(
# level=logging.INFO,
# stream=sys.stderr,
# format='%(levelname)s: %(name)s::%(funcName)s::%(lineno)d: %(message)s'
# )
#
# class EveryNthMessageFilter(logging.Filter):
# def __init__(self):
# super().__init__()
#
# # Pattern '[xN]' in message, e.g. "foo [x1000]"
# self.pattern = re.compile(r'\[x(\d+)\]')
# self.counters = defaultdict(int)
#
# def filter(self, record):
# msg = record.getMessage()
# match = self.pattern.search(msg)
# if match:
# n = int(match.group(1))
#
# key = f"{record.name}::{record.funcName}::{record.lineno}"
# self.counters[key] += 1
#
# # Log only every N-th event
# return self.counters[key] % n == 0
#
# # Log every event
# return True
#
#
# log = logging.getLogger( __name__ )
# log.addFilter( EveryNthMessageFilter())
#