diff options
author | Qin Zhao <zhaoqin@google.com> | 2015-11-18 17:21:48 -0500 |
---|---|---|
committer | Qin Zhao <zhaoqin@google.com> | 2015-11-18 17:21:48 -0500 |
commit | 2ef59d1ec8dbb9d3d221309f04c71e2a562e771c (patch) | |
tree | 38e76ba27de262bf2292a311081903edf2c0890d /tools/drmemory/scripts/logging_utils.py | |
parent | 3cca9c8f68e7a60a9e064bb2e036fdd51ae6eb55 (diff) | |
download | pdfium-2ef59d1ec8dbb9d3d221309f04c71e2a562e771c.tar.xz |
Merge to XFA: Add Dr. Memory tool
This CL adds DrMemory-Windows-sfx.exe into tools/drmemory.
It also adds a set of scripts from chromium/src/tools/valgrind for
running Dr. Memory. Now we can run pdfium tests with Dr. Memory:
$ .\tools\drmemory\scripts\pdfium_tests.bat -b out\Debug -t pdfium_unittests
More update on scripts is required, but this should be a good start.
Changes from chromium/src/tools/valgrind
- rename chrome_tests.py to pdfium_tests.py
- update pdfium_tests.bat
- remove chrome tests in pdfium_tests.py
- remove memcheck code in valgrind_test.py
R=thestig@chromium.org
BUG=pdfium:238
Review URL: https://codereview.chromium.org/1452293002 .
(cherry picked from commit 4dcf313c46c176e5afa1328f5f07fce4e614366d)
Review URL: https://codereview.chromium.org/1452373004 .
Diffstat (limited to 'tools/drmemory/scripts/logging_utils.py')
-rw-r--r-- | tools/drmemory/scripts/logging_utils.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/tools/drmemory/scripts/logging_utils.py b/tools/drmemory/scripts/logging_utils.py new file mode 100644 index 0000000000..ef2d674950 --- /dev/null +++ b/tools/drmemory/scripts/logging_utils.py @@ -0,0 +1,82 @@ +# Copyright (c) 2011 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +''' Utility functions and objects for logging. +''' + +import logging +import sys + +class StdoutStderrHandler(logging.Handler): + ''' Subclass of logging.Handler which outputs to either stdout or stderr + based on a threshold level. + ''' + + def __init__(self, threshold=logging.WARNING, err=sys.stderr, out=sys.stdout): + ''' Args: + threshold: below this logging level messages are sent to stdout, + otherwise they are sent to stderr + err: a stream object that error messages are sent to, defaults to + sys.stderr + out: a stream object that non-error messages are sent to, defaults to + sys.stdout + ''' + logging.Handler.__init__(self) + self._err = logging.StreamHandler(err) + self._out = logging.StreamHandler(out) + self._threshold = threshold + self._last_was_err = False + + def setLevel(self, lvl): + logging.Handler.setLevel(self, lvl) + self._err.setLevel(lvl) + self._out.setLevel(lvl) + + def setFormatter(self, formatter): + logging.Handler.setFormatter(self, formatter) + self._err.setFormatter(formatter) + self._out.setFormatter(formatter) + + def emit(self, record): + if record.levelno < self._threshold: + self._out.emit(record) + self._last_was_err = False + else: + self._err.emit(record) + self._last_was_err = False + + def flush(self): + # preserve order on the flushing, the stalest stream gets flushed first + if self._last_was_err: + self._out.flush() + self._err.flush() + else: + self._err.flush() + self._out.flush() + + +FORMAT = "%(asctime)s %(filename)s [%(levelname)s] %(message)s" +DATEFMT = "%H:%M:%S" + +def config_root(level=logging.INFO, threshold=logging.WARNING, format=FORMAT, + datefmt=DATEFMT): + ''' Configure the root logger to use a StdoutStderrHandler and some default + formatting. + Args: + level: messages below this level are ignored + threshold: below this logging level messages are sent to stdout, + otherwise they are sent to stderr + format: format for log messages, see logger.Format + datefmt: format for date in log messages + + ''' + # to set the handler of the root logging object, we need to do setup + # manually rather than using basicConfig + root = logging.getLogger() + root.setLevel(level) + formatter = logging.Formatter(format, datefmt) + handler = StdoutStderrHandler(threshold=threshold) + handler.setLevel(level) + handler.setFormatter(formatter) + root.addHandler(handler) |