Skip to content

Commit 43bb8e2

Browse files
author
Vladimir Kotal
authored
add better console logger (#2467)
fixes #2466
1 parent f229463 commit 43bb8e2

File tree

8 files changed

+96
-63
lines changed

8 files changed

+96
-63
lines changed

opengrok-tools/src/main/python/opengrok_tools/deploy.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import tempfile
3030
from zipfile import ZipFile
3131
from shutil import copyfile
32+
from .utils.log import get_console_logger
3233

3334
"""
3435
deploy war file
@@ -109,12 +110,10 @@ def main():
109110

110111
args = parser.parse_args()
111112

113+
loglevel = logging.INFO
112114
if args.debug:
113-
logging.basicConfig(level=logging.DEBUG)
114-
else:
115-
logging.basicConfig()
116-
117-
logger = logging.getLogger(os.path.basename(sys.argv[0]))
115+
loglevel = logging.DEBUG
116+
logger = get_console_logger(os.path.basename(sys.argv[0]), loglevel)
118117

119118
deploy_war(logger, args.source_war[0], args.target_war[0], args.config)
120119

opengrok-tools/src/main/python/opengrok_tools/indexer.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
from .utils.indexer import FindCtags, Indexer
3232
from .utils.java import get_javaparser
33+
from .utils.log import get_console_logger
3334

3435
"""
3536
opengrok.jar wrapper
@@ -46,12 +47,10 @@ def main():
4647

4748
args = parser.parse_args()
4849

50+
loglevel = logging.INFO
4951
if args.debug:
50-
logging.basicConfig(level=logging.DEBUG)
51-
else:
52-
logging.basicConfig()
53-
54-
logger = logging.getLogger(os.path.basename(sys.argv[0]))
52+
loglevel = logging.DEBUG
53+
logger = get_console_logger(os.path.basename(sys.argv[0]), loglevel)
5554

5655
#
5756
# Since it is not possible to tell what kind of action is performed,

opengrok-tools/src/main/python/opengrok_tools/java.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import sys
2929

3030
from .utils.java import Java, get_javaparser
31+
from .utils.log import get_console_logger
3132

3233

3334
def main():
@@ -38,12 +39,10 @@ def main():
3839

3940
args = parser.parse_args()
4041

42+
loglevel = logging.INFO
4143
if args.debug:
42-
logging.basicConfig(level=logging.DEBUG)
43-
else:
44-
logging.basicConfig()
45-
46-
logger = logging.getLogger(os.path.basename(sys.argv[0]))
44+
loglevel = logging.DEBUG
45+
logger = get_console_logger(os.path.basename(sys.argv[0]), loglevel)
4746

4847
java = Java(args.options, logger=logger, java=args.java,
4948
jar=args.jar, java_opts=args.java_opts,

opengrok-tools/src/main/python/opengrok_tools/mirror.py

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
from .utils.filelock import Timeout, FileLock
4141
from .utils.hook import run_hook
42+
from .utils.log import get_console_logger
4243
from .utils.opengrok import get_repos, get_config_value, get_repo_type
4344
from .utils.readconfig import read_config
4445
from .utils.repofactory import get_repository
@@ -52,7 +53,7 @@
5253
print("Need Python 3, you are running {}".format(major_version))
5354
sys.exit(1)
5455

55-
__version__ = "0.4"
56+
__version__ = "0.5"
5657

5758
# "constants"
5859
HOOK_TIMEOUT_PROPERTY = 'hook_timeout'
@@ -134,12 +135,10 @@ def main():
134135
'processing if not found.')
135136
args = parser.parse_args()
136137

138+
loglevel = logging.INFO
137139
if args.debug:
138-
logging.basicConfig(level=logging.DEBUG)
139-
else:
140-
logging.basicConfig()
141-
142-
logger = logging.getLogger(os.path.basename(sys.argv[0]))
140+
loglevel = logging.DEBUG
141+
logger = get_console_logger(os.path.basename(sys.argv[0]), loglevel)
143142

144143
if args.config:
145144
config = read_config(logger, args.config)
@@ -301,31 +300,21 @@ def main():
301300
if not logdir:
302301
logger.error("The logdir property is required in batch mode")
303302
sys.exit(1)
303+
304304
logfile = os.path.join(logdir, args.project + ".log")
305305
logger.debug("Switching logging to the {} file".
306306
format(logfile))
307-
logging.shutdown()
308-
309-
# Remove the existing handler so that logger can be reconfigured.
310-
for handler in logging.root.handlers[:]:
311-
logging.root.removeHandler(handler)
312307

313-
logging.basicConfig(filename=logfile, filemode='a',
314-
level=logging.DEBUG if args.debug
315-
else logging.INFO)
316-
logger = logging.getLogger(os.path.basename(sys.argv[0]))
317-
handler = RotatingFileHandler(logfile, maxBytes=0,
308+
logger = logger.getChild("rotating")
309+
logger.setLevel(logging.DEBUG if args.debug
310+
else logging.INFO)
311+
logger.propagate = False
312+
handler = RotatingFileHandler(logfile, maxBytes=0, mode='a',
318313
backupCount=args.backupcount)
319314
formatter = logging.Formatter("%(asctime)s - %(levelname)s: "
320315
"%(message)s", '%m/%d/%Y %I:%M:%S %p')
321316
handler.setFormatter(formatter)
322317
handler.doRollover()
323-
#
324-
# Technically, adding a handler to the logger is not necessary
325-
# since log rotation is done above using doRollover() however
326-
# it is done anyway in case the handler changes to use implicit
327-
# rotation in the future.
328-
#
329318
logger.addHandler(handler)
330319

331320
# We want this to be logged to the log file (if any).

opengrok-tools/src/main/python/opengrok_tools/projadm.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
from .utils.command import Command
3939
from .utils.filelock import Timeout, FileLock
40+
from .utils.log import get_console_logger
4041
from .utils.opengrok import get_configuration, set_configuration, \
4142
add_project, delete_project, get_config_value
4243
from .utils.utils import get_command, is_web_uri
@@ -247,12 +248,10 @@ def main():
247248
# Setup logger as a first thing after parsing arguments so that it can be
248249
# used through the rest of the program.
249250
#
251+
loglevel = logging.INFO
250252
if args.debug:
251-
logging.basicConfig(level=logging.DEBUG)
252-
else:
253-
logging.basicConfig(format="%(message)s", level=logging.INFO)
254-
255-
logger = logging.getLogger(os.path.basename(sys.argv[0]))
253+
loglevel = logging.DEBUG
254+
logger = get_console_logger(os.path.basename(sys.argv[0]), loglevel)
256255

257256
if args.nosourcedelete and not args.delete:
258257
logger.error("The no source delete option is only valid for delete")

opengrok-tools/src/main/python/opengrok_tools/reindex_project.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
from .utils.indexer import Indexer
3232
from .utils.java import get_javaparser
33+
from .utils.log import get_console_logger
3334
from .utils.opengrok import get_configuration
3435

3536
"""
@@ -86,12 +87,10 @@ def main():
8687

8788
args = parser.parse_args()
8889

90+
loglevel = logging.INFO
8991
if args.debug:
90-
logging.basicConfig(level=logging.DEBUG)
91-
else:
92-
logging.basicConfig()
93-
94-
logger = logging.getLogger(os.path.basename(sys.argv[0]))
92+
loglevel = logging.DEBUG
93+
logger = get_console_logger(os.path.basename(sys.argv[0]), loglevel)
9594

9695
# Make sure the log directory exists.
9796
if not os.path.isdir(args.directory):

opengrok-tools/src/main/python/opengrok_tools/sync.py

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,14 @@
4444
from .utils.opengrok import list_indexed_projects, get_config_value
4545
from .utils.readconfig import read_config
4646
from .utils.utils import is_web_uri
47+
from .utils.log import get_console_logger
4748

4849
major_version = sys.version_info[0]
4950
if (major_version < 3):
5051
print("Need Python 3, you are running {}".format(major_version))
5152
sys.exit(1)
5253

53-
__version__ = "0.5"
54+
__version__ = "0.6"
5455

5556

5657
def worker(base):
@@ -80,13 +81,8 @@ def main():
8081
help='List of projects to process')
8182
parser.add_argument('-I', '--indexed', action='store_true',
8283
help='Sync indexed projects only')
83-
84-
group2 = parser.add_mutually_exclusive_group()
85-
group2.add_argument('-D', '--debug', action='store_true',
84+
parser.add_argument('-D', '--debug', action='store_true',
8685
help='Enable debug prints')
87-
group2.add_argument('-p', '--logplain', action='store_true',
88-
help='log plain messages')
89-
9086
parser.add_argument('-i', '--ignore_errors', nargs='*',
9187
help='ignore errors from these projects')
9288
parser.add_argument('-c', '--config', required=True,
@@ -95,15 +91,10 @@ def main():
9591
help='URI of the webapp with context path')
9692
args = parser.parse_args()
9793

94+
loglevel = logging.INFO
9895
if args.debug:
99-
logging.basicConfig(level=logging.DEBUG)
100-
else:
101-
if args.logplain:
102-
logging.basicConfig(format="%(message)s")
103-
else:
104-
logging.basicConfig()
105-
106-
logger = logging.getLogger(os.path.basename(sys.argv[0]))
96+
loglevel = logging.DEBUG
97+
logger = get_console_logger(os.path.basename(sys.argv[0]), loglevel)
10798

10899
uri = args.uri
109100
if not is_web_uri(uri):
@@ -112,7 +103,7 @@ def main():
112103
logger.debug("web application URI = {}".format(uri))
113104

114105
# Changing working directory to root will avoid problems when running
115-
# via sudo/su.
106+
# programs via sudo/su.
116107
try:
117108
os.chdir("/")
118109
except OSError:
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#
2+
# CDDL HEADER START
3+
#
4+
# The contents of this file are subject to the terms of the
5+
# Common Development and Distribution License (the "License").
6+
# You may not use this file except in compliance with the License.
7+
#
8+
# See LICENSE.txt included in this distribution for the specific
9+
# language governing permissions and limitations under the License.
10+
#
11+
# When distributing Covered Code, include this CDDL HEADER in each
12+
# file and include the License file at LICENSE.txt.
13+
# If applicable, add the following below this CDDL HEADER, with the
14+
# fields enclosed by brackets "[]" replaced with your own identifying
15+
# information: Portions Copyright [yyyy] [name of copyright owner]
16+
#
17+
# CDDL HEADER END
18+
#
19+
20+
#
21+
# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
22+
#
23+
24+
import logging
25+
import sys
26+
27+
28+
def get_console_logger(name, level=logging.INFO, format='%(message)s'):
29+
"""
30+
Get logger that logs logging.ERROR and higher to stderr, the rest
31+
to stdout. For logging.DEBUG level more verbose format is used.
32+
33+
:param name: name of the logger
34+
:param level: base logging level
35+
:param format: format string to use
36+
:return: logger
37+
"""
38+
if level == logging.DEBUG:
39+
format = '%(asctime)s %(levelname)8s %(name)s | %(message)s'
40+
41+
formatter = logging.Formatter(format)
42+
43+
stderr_handler = logging.StreamHandler(stream=sys.stderr)
44+
stderr_handler.setFormatter(formatter)
45+
46+
stdout_handler = logging.StreamHandler(stream=sys.stdout)
47+
stdout_handler.setFormatter(formatter)
48+
49+
stderr_handler.addFilter(lambda rec: rec.levelno >= logging.ERROR)
50+
stdout_handler.addFilter(lambda rec: rec.levelno <= logging.INFO)
51+
52+
logger = logging.getLogger(name)
53+
logger.setLevel(level)
54+
logger.propagate = False
55+
logger.addHandler(stdout_handler)
56+
logger.addHandler(stderr_handler)
57+
58+
return logger

0 commit comments

Comments
 (0)