1# Copyright 2017 The TensorFlow Authors. All Rights Reserved. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14# ============================================================================== 15"""Logging and debugging utilities.""" 16 17from __future__ import absolute_import 18from __future__ import division 19from __future__ import print_function 20 21import os 22import sys 23 24# TODO(mdan): Use a custom logger class. 25from tensorflow.python.platform import tf_logging as logging 26from tensorflow.python.util.tf_export import tf_export 27 28VERBOSITY_VAR_NAME = 'AUTOGRAPH_VERBOSITY' 29DEFAULT_VERBOSITY = 0 30 31verbosity_level = None # vlog-like. Takes precedence over the env variable. 32echo_log_to_stdout = False 33 34# In interactive Python, logging echo is enabled by default. 35if hasattr(sys, 'ps1') or hasattr(sys, 'ps2'): 36 echo_log_to_stdout = True 37 38 39@tf_export('autograph.set_verbosity') 40def set_verbosity(level, alsologtostdout=False): 41 """Sets the AutoGraph verbosity level. 42 43 _Debug logging in AutoGraph_ 44 45 More verbose logging is useful to enable when filing bug reports or doing 46 more in-depth debugging. 47 48 There are two controls that control the logging verbosity: 49 50 * The `set_verbosity` function 51 52 * The `AUTOGRAPH_VERBOSITY` environment variable 53 54 `set_verbosity` takes precedence over the environment variable. 55 56 For example: 57 58 ```python 59 import os 60 import tensorflow as tf 61 62 os.environ['AUTOGRAPH_VERBOSITY'] = 5 63 # Verbosity is now 5 64 65 tf.autograph.set_verbosity(0) 66 # Verbosity is now 0 67 68 os.environ['AUTOGRAPH_VERBOSITY'] = 1 69 # No effect, because set_verbosity was already called. 70 ``` 71 72 Logs entries are output to [absl](https://abseil.io)'s default output, 73 with `INFO` level. 74 Logs can be mirrored to stdout by using the `alsologtostdout` argument. 75 Mirroring is enabled by default when Python runs in interactive mode. 76 77 Args: 78 level: int, the verbosity level; larger values specify increased verbosity; 79 0 means no logging. When reporting bugs, it is recommended to set this 80 value to a larges number, like 10. 81 alsologtostdout: bool, whether to also output log messages to `sys.stdout`. 82 """ 83 global verbosity_level 84 global echo_log_to_stdout 85 verbosity_level = level 86 echo_log_to_stdout = alsologtostdout 87 88 89@tf_export('autograph.trace') 90def trace(*args): 91 """Traces argument information at compilation time. 92 93 `trace` is useful when debugging, and it always executes during the tracing 94 phase, that is, when the TF graph is constructed. 95 96 _Example usage_ 97 98 ```python 99 import tensorflow as tf 100 101 for i in tf.range(10): 102 tf.autograph.trace(i) 103 # Output: <Tensor ...> 104 ``` 105 106 Args: 107 *args: Arguments to print to `sys.stdout`. 108 """ 109 print(*args) 110 111 112def get_verbosity(): 113 global verbosity_level 114 if verbosity_level is not None: 115 return verbosity_level 116 return int(os.getenv(VERBOSITY_VAR_NAME, DEFAULT_VERBOSITY)) 117 118 119def has_verbosity(level): 120 return get_verbosity() >= level 121 122 123def error(level, msg, *args, **kwargs): 124 if has_verbosity(level): 125 logging.error(msg, *args, **kwargs) 126 if echo_log_to_stdout: 127 print(msg % args) 128 129 130def log(level, msg, *args, **kwargs): 131 if has_verbosity(level): 132 logging.info(msg, *args, **kwargs) 133 if echo_log_to_stdout: 134 print(msg % args) 135 136 137def warn(msg, *args, **kwargs): 138 logging.warn(msg, *args, **kwargs) 139 if echo_log_to_stdout: 140 print('WARNING:', msg % args) 141 142 143def warn_first_n(msg, *args, **kwargs): 144 logging.log_first_n(logging.WARN, msg, *args, **kwargs) 145