- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我很难在 HTTP 请求的日志文件中获取 DEBUG 级别日志,例如来自控制台的请求,例如:
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): URI:443
DEBUG:urllib3.connectionpool:URL:443 "POST /endpoint HTTP/1.1" 200 None
import logging
from logging.handlers import TimedRotatingFileHandler
_logger = logging.getLogger(__name__)
def setup_logging(loglevel):
logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s")
if loglevel is not None:
if loglevel == 10:
http.client.HTTPConnection.debuglevel = 1
logformat = "%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s"
logging.basicConfig(level=loglevel, stream=sys.stdout, format=logformat, datefmt="%Y-%m-%d %H:%M:%S")
fileHandler = logging.handlers.TimedRotatingFileHandler("{0}/{1}.log".format(logPath, logFileName), when="midnight")
fileHandler.setFormatter(logFormatter)
_logger.setLevel(logging.DEBUG)
_logger.addHandler(fileHandler)
logging.DEBUG
调用它时日志文件将只包含我将在代码中指定为
_logger.info
的任何内容或
_logger.debug
与控制台日志输出没有什么相似之处。
def main(args):
args = parse_args(args)
cfg = config(args.env)
setup_logging(logging.DEBUG, cfg)
requests.get("https://stackoverflow.com/a/58769712/100297")
最佳答案
您在错误的位置添加处理程序和级别更改。
Python 日志记录模块将记录器对象视为存在于层次结构中,基于它们的名称和 .
的存在。这些名称中的分隔符。姓名"foo.bar.baz"
对于记录器,逻辑上放置为 foo.bar
的子级和 foo
,它们是否存在。层次结构的基础是根记录器,它没有名称。您可以通过 logging.getLogger()
访问它(没有参数,虽然 ''
和 None
也可以工作)。
现在,在记录消息时,首先消息必须通过记录器的有效级别。如果他们通过了,则消息将传递给从当前记录器到根的每个记录器上的处理程序,前提是他们清除找到的每个处理程序的级别。
为了找到有效级别,遍历层次结构以找到最近的具有级别集的记录器对象;如果没有,则消息总是通过。在遍历层次结构以查找处理程序时,日志对象可以阻止传播( propagate
设置为 False
),此时遍历停止。
当您尝试处理 urllib3.connectionpool()
的消息时,您需要将处理程序放在三个位置之一:urllib3.connectionpool
的记录器, 对于 urllib3
或根记录器。你的代码没有这样做。
相反,您可以在自己的记录器上使用不同的名称设置处理程序:
_logger = logging.getLogger(__name__)
__name__
需要为空,绝不是这种情况)也不匹配
urllib3
或
urllib3.connectionpool
记录器(这意味着您的模块也称为
urllib3
或
urllib3.connectionpool)
。
urllib3.connectionpool
的路径中日志消息将随之而来,您的处理程序将永远不会收到这些消息。
fileHandler = logging.handlers.TimedRotatingFileHandler("{0}/{1}.log".format(logPath, logFileName), when="midnight")
fileHandler.setFormatter(logFormatter)
root = logging.getLogger()
root.setLevel(logging.DEBUG)
root.addHandler(fileHandler)
INFO
,并且没有配置其他处理程序,那么您的处理程序将永远不会看到
DEBUG
消息。根记录器的默认级别是
WARNING
.
urllib3
日志消息,或者通过将其最低级别的记录器对象设置为
propagate = False
来使整个包静音)。
logging.basicConfig()
也配置根记录器,但前提是根记录器上已经没有处理程序。如果您使用
force=True
然后
basicConfig()
将删除所有现有的处理程序,然后在根上配置处理程序。它总是会创建一个
Formatter()
实例并将其设置在所有处理程序上。
basicConfig()
满足您的所有根记录器需求:
import http.client
import logging
import os.path
import sys
from logging.handlers import TimedRotatingFileHandler
def setup_logging(loglevel):
# the file handler receives all messages from level DEBUG on up, regardless
fileHandler = TimedRotatingFileHandler(
os.path.join(logPath, logFileName + ".log"),
when="midnight"
)
fileHandler.setLevel(logging.DEBUG)
handlers = [fileHandler]
if loglevel is not None:
# if a log level is configured, use that for logging to the console
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(loglevel)
handlers.append(stream_handler)
if loglevel == logging.DEBUG:
# when logging at debug level, make http.client extra chatty too
# http.client *uses `print()` calls*, not logging.
http.client.HTTPConnection.debuglevel = 1
# finally, configure the root logger with our choice of handlers
# the logging level of the root set to DEBUG (defaults to WARNING otherwise).
logformat = "%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s"
logging.basicConfig(
format=logformat, datefmt="%Y-%m-%d %H:%M:%S",
handlers=handlers, level=logging.DEBUG
)
http.client
图书馆
不使用 logging
输出调试信息;它将始终使用
print()
输出那些。如果您想看到这些消息出现在您的日志中,您需要对库进行猴子补丁,添加替代
print()
全局的:
import http.client
import logging
http_client_logger = logging.getLogger("http.client")
def print_to_log(*args):
http_client_logger.debug(" ".join(args))
# monkey-patch a `print` global into the http.client module; all calls to
# print() in that module will then use our print_to_log implementation
http.client.print = print_to_log
http.client
应用技巧和
setup_logging(logging.DEBUG)
,我看到以下日志都出现在
stdout
当我使用
requests.get("https://stackoverflow.com/a/58769712/100297")
时在文件中:
2019-11-08 16:17:26 [MainThread ] [DEBUG] Starting new HTTPS connection (1): stackoverflow.com:443
2019-11-08 16:17:27 [MainThread ] [DEBUG] send: b'GET /a/58769712/100297 HTTP/1.1\r\nHost: stackoverflow.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n'
2019-11-08 16:17:27 [MainThread ] [DEBUG] reply: 'HTTP/1.1 302 Found\r\n'
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Cache-Control: private
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Content-Type: text/html; charset=utf-8
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Location: /questions/58738195/python-http-request-and-debug-level-logging-to-the-log-file/58769712#58769712
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Frame-Options: SAMEORIGIN
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Request-Guid: 761bd2f8-3e5c-453a-ab46-d01284940541
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Strict-Transport-Security: max-age=15552000
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Feature-Policy: microphone 'none'; speaker 'none'
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Content-Security-Policy: upgrade-insecure-requests; frame-ancestors 'self' https://stackexchange.com
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Accept-Ranges: bytes
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Age: 0
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Content-Length: 214
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Accept-Ranges: bytes
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Date: Fri, 08 Nov 2019 16:17:27 GMT
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Via: 1.1 varnish
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Age: 0
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Connection: keep-alive
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Served-By: cache-lhr7324-LHR
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Cache: MISS
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Cache-Hits: 0
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Timer: S1573229847.069848,VS0,VE80
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Vary: Fastly-SSL
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-DNS-Prefetch-Control: off
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Set-Cookie: prov=0e92634f-abce-9f8e-1865-0d35ebecc595; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
2019-11-08 16:17:27 [MainThread ] [DEBUG] https://stackoverflow.com:443 "GET /a/58769712/100297 HTTP/1.1" 302 214
2019-11-08 16:17:27 [MainThread ] [DEBUG] send: b'GET /questions/58738195/python-http-request-and-debug-level-logging-to-the-log-file/58769712 HTTP/1.1\r\nHost: stackoverflow.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nCookie: prov=0e92634f-abce-9f8e-1865-0d35ebecc595\r\n\r\n'
2019-11-08 16:17:27 [MainThread ] [DEBUG] reply: 'HTTP/1.1 200 OK\r\n'
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Cache-Control: private
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Content-Type: text/html; charset=utf-8
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Content-Encoding: gzip
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Last-Modified: Fri, 08 Nov 2019 16:16:07 GMT
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Frame-Options: SAMEORIGIN
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Request-Guid: 5e48399e-a91c-44aa-aad6-00a96014131f
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Strict-Transport-Security: max-age=15552000
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Feature-Policy: microphone 'none'; speaker 'none'
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Content-Security-Policy: upgrade-insecure-requests; frame-ancestors 'self' https://stackexchange.com
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Accept-Ranges: bytes
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Age: 0
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Content-Length: 42625
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Accept-Ranges: bytes
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Date: Fri, 08 Nov 2019 16:17:27 GMT
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Via: 1.1 varnish
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Age: 0
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Connection: keep-alive
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Served-By: cache-lhr7324-LHR
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Cache: MISS
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Cache-Hits: 0
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-Timer: S1573229847.189349,VS0,VE95
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: Vary: Accept-Encoding,Fastly-SSL
2019-11-08 16:17:27 [MainThread ] [DEBUG] header: X-DNS-Prefetch-Control: off
2019-11-08 16:17:27 [MainThread ] [DEBUG] https://stackoverflow.com:443 "GET /questions/58738195/python-http-request-and-debug-level-logging-to-the-log-file/58769712 HTTP/1.1" 200 42625
import requests
import sys
logPath, logFileName = "/tmp", "demo"
level = logging.DEBUG if "-v" in sys.argv else None
setup_logging(level)
requests.get("https://stackoverflow.com/a/58769712/100297")
python <script.py> -v
将级别设置为详细并将其与
python <script.py>
进行比较根本没有设置级别。
关于Python HTTP 请求和调试级别记录到日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58738195/
Android 项目中最低(最低 sdk)和最高(目标 sdk)级别是否有任何影响。这些东西是否会影响项目的可靠性和效率。 最佳答案 没有影响,如果您以 SDK 级别 8 为目标,那么您的应用将以 9
我将现有的 android 项目升级到 API 级别 31。我使用 Java 作为语言。我改变了 build.gradle compileSdkVersion 31 defaultConfig {
我正在使用 ionic 3 创建一个 android 应用程序,当我尝试上传到 playstore 时,我收到一个错误,提示我的应用程序以 api 25 为目标,当我检查我的 project.prop
我刚刚尝试将应用程序的目标和编译 API 级别更新为 29 (Android 10),并注意到我无法再编译,因为 LocationManager.addNmeaListener 只接受 OnNmeaM
我的代码没有在 Kitkat 上显示工具栏。 这是我的两个 Android 版本的屏幕截图。 Kitkat 版本: Lollipop 版: 这背后的原因可能是什么。 list 文件
我正在构建面向 API 级别 8 的 AccessabilityService,但我想使用 API 级别 18 中引入的功能 (getViewIdResourceName())。这应该可以通过使用 A
当我想在我的电脑上创建一个 android 虚拟机时,有两个选项可以选择目标设备。它们都用于相同的 API 级别。那么我应该选择哪一个呢?它们之间有什么区别? 最佳答案 一个是基本的 Android,
当我选择 tagret 作为 Android 4.2.2(API 级别 17)时,模拟器需要很长时间来加载和启动。 所以我研究它并通过使用 找到了解决方案Intel Atom(x86) 而不是 ARM
我有一个使用 Android Studio 创建的 Android 项目。我在项目中添加了一些第三方依赖项,但是当我尝试在 Android Studio 中编译时,我遇到了以下错误: Error:Ex
如上所述,如何使用 API 8 获取移动设备网络接口(interface)地址? 最佳答案 NetworkInterface.getInetAddresses() 在 API8 中可用。 关于andr
我想显示 Snackbar并使用图像而不是文本进行操作。 我使用以下代码: val imageSpan = ImageSpan(this, R.drawable.star) val b
我有一个用 python 编写的简单命令行程序。程序使用按以下方式配置的日志记录模块将日志记录到屏幕: logging.basicConfig(level=logging.INFO, format='
使用下面的代码,实现游戏状态以控制关卡的最简单和最简单的方法是什么?如果我想从标题画面开始,然后加载一个关卡,并在完成后进入下一个关卡?如果有人能解释处理这个问题的最简单方法,那就太好了! impor
我想创建一个可以找到嵌套树结构深度的属性。下面的静态通过递归找出深度/级别。但是是否可以将此函数作为同一个类中的属性而不是静态方法? public static int GetDepth(MenuGr
var myArray = [{ title: "Title 1", children: [{ title: "Title 1.1", children: [{
通过下面的代码,实现游戏状态来控制关卡的最简单、最容易的方法是什么?如果我想从标题屏幕开始,然后加载一个关卡,并在完成后进入下一个关卡?如果有人可以解释处理这个问题的最简单方法,那就太好了! impo
我有一个树结构,其中每个节点基本上可以有无限个子节点,它正在为博客的评论建模。 根据特定评论的 ID,我试图找出该评论在树中的深度/级别。 我正在关注 this guide that explains
考虑任何给定的唯一整数的数组,例如[1,3,2,4,6,5] 如何确定“排序度”的级别,范围从 0.0 到 1.0 ? 最佳答案 一种方法是评估必须移动以使其排序的项目数量,然后将其除以项目总数。 作
我如何定义一个模板类,它提供一个整数常量,表示作为输入模板参数提供的(指针)类型的“深度”?例如,如果类名为 Depth,则以下内容为真: Depth::value == 3 Depth::value
我的场景是:文件接收器应该包含所有内容。另一个接收器应包含信息消息,但需要注意的是 Microsoft.* 消息很烦人,因此这些消息应仅限于警告。两个sink怎么单独配置?我尝试的第一件事是: str
我是一名优秀的程序员,十分优秀!