【C++】POCO学习总结(十七):日志系统(级别、通道、格式化、记录流)

【C++】郭老二博文之:C++目录

1、Poco::Message 日志消息

1.1 说明

所有日志消息都在Poco::Message对象中存储和传输。
头文件:#include “Poco/Message.h”
一条消息包含如下内容:优先级、来源、一个文本、一个时间戳、进程和线程标识符、可选参数(名称-值对)

1.2 消息优先级

POCO定义了8个消息优先级:

  • PRIO_FATAL(最高优先级)
  • PRIO_CRITICAL
  • PRIO_ERROR
  • PRIO_WARNING
  • PRIO_NOTICE
  • PRIO_INFORMATION
  • PRIO_DEBUG
  • PRIO_TRACE(最低优先级)

设置、获取优先级

  • void setPriority(Priority prio)
  • Priority getPriority() const

1.3 消息来源

消息来源:一般用生成消息的类的名称,或者产生消息的子系统的名称

  • void setSource(const std::string& source)
  • const std::string& getSource() const

1.4 消息内容

要记录的实际消息。对格式、长度等没有要求。可以在出现在日志目的地之前由格式化程序修改

  • void setText(const std::string& text)
  • const std::string& getText() const

1.5 时间戳

创建消息的日期和时间,精度可达微秒级。
由Poco::Message的构造函数自动初始化为当前日期和时间。

  • void setTime(const Timestamp& time)
  • const Timestamp& getTime() const

1.6 进程和线程标识符

进程标识符(PID)是一个长整型值,用于存储系统的进程ID。
线程标识符(TID)也是一个长整型值,存储当前线程的序列号。
进程标识符、线程标识符和线程名称在Poco::Message的构造函数中初始化。

  • void setThread(const std::string& threadName)
  • const std::string& getThread() const
  • void setTid(long tid)
  • long getTid() const
  • void setPid(long pid)
  • long getPid() const

1.7 消息参数

消息可以存储任意数量的键值对。键和值可以是任意字符串。消息参数可以在格式化程序中引用。使用索引操作符访问消息参数。

2、Poco::Logger 日志记录

2.1 创建

Poco::Logger是日志框架的主要入口点。
头文件 #include “Poco/Logger.h”
应用程序使用Poco::Logger类的实例来生成日志消息。
每个记录器都有一个附加的通道,该通道将消息传递到它们的目的地(可能通过其他通道)。
每个记录器都有一个名称,它成为该记录器生成的所有消息的源。该名称是在创建时设置的,以后不可更改

2.2 优先级

日志记录器根据消息的优先级过滤消息。
只有优先级等于或高于日志记录器日志级别的消息才会被传播。
例如:
日志级别设置为PRIO_ERROR的日志记录器将只传播优先级为PRIO_ERROR、PRIO_CRITICAL或PRIO_FATAL的消息。
PRIO_WARNING或更低的值将被丢弃。

2.3 记录器的层次结构

根据它们的名字,记录器形成了一个树状的层次结构。
日志记录器的名称由一个或多个组件组成,以句点分隔。每个组件对应于前一个组件的名称空间中的一个名称。
一个特殊的记录器,根记录器,是一个以空字符串作为其名称的记录器。它构成了日志记录器层次结构的根。
日志记录器层次结构的最大深度没有限制。

在这里插入图片描述

2.4 继承层次结构

新创建的日志记录器从日志记录器层次结构中的祖先继承其日志级别和附加通道。
例如:在创建时,记录器“HTTPServer.RequestHandler.cgi”将从名为“HTTPServer.RequestHandler”的记录器继承其日志级别和附加通道。
一旦日志程序被完全创建,它就不再与它的祖先相关。换句话说,对日志记录器的日志级别或通道的更改对其已经存在的后代没有影响。

2.5 记录日志

  • void log(const Message& msg):如果消息的优先级大于或等于记录器的日志级别,则将消息传播到附加的通道。信息保持不变。

  • void log(const Exception& exc):创建并记录一条优先级为PRIO_ERROR的消息和异常的显示文本

创建并记录具有各自优先级和给定文本的消息:

  • void fatal(const std::string& text)
  • void critical(const std::string& text)
  • void error(const std::string& text)
  • void warning(const std::string& text)
  • void notice(const std::string& text)
  • void information(const std::string& text)
  • void debug(const std::string& text)
  • void trace(const std::string& text)

void dump(const std::string& text,const void* buffer, int length,Message::Priority prio = Message::PRIO_DEBUG)
用给定的优先级记录给定的消息。文本之后是给定缓冲区的十六进制转储。

2.6 日志级别

  • bool is(int level) const:如果日志记录器的日志级别至少为level,则返回true。- bool fatal() const

如果日志记录器的日志级别至少是相应的级别,则返回true:

  • bool critical() const
  • bool error() const
  • bool warning() const
  • bool notice() const
  • bool information() const
  • bool debug() const
  • bool trace() const

2.7 记录器

POCO管理一个全局的记录器映射。
不要自己创建记录器。要使用POCO提供记录器的引用。POCO会根据需要动态创建新的记录器。

static Logger& get(const std::string& name)

返回对具有给定名称的记录器的引用。如果没有会自动创建日志记录器。这是线程安全的。

2.8 示例

#include "Poco/Logger.h"
using Poco::Logger;
int main(int argc, char** argv)
{
	Logger& logger = Logger::get("TestLogger");
	logger.information("This is an informational message");
	logger.warning("This is a warning message");
	return 0;
}

3、Poco::Channel 通道

3.1 说明

Poco::Channel的子类负责将消息(Poco::Message)传递到它们的目的地(例如,控制台或日志文件)。
每个Poco::Logger(它本身是Poco::Channel的子类)都连接到Poco::Channel。POCO提供了POCO::Channel的各种子类,这些子类将消息传递到控制台、日志文件或系统的日志记录设施。
可以定义你自己的通道类。
通道使用引用计数进行内存管理。

3.2 信道特性

通道可以支持任意数量的属性(键值对),这些属性用于配置通道。
属性是通过setProperty()成员函数设置的:
属性的值可以通过getProperty()获得:
这两个函数是在Poco::Configurable类中定义的,它是Poco::Channel的超类。

  • void setProperty(const std::string& name, const std::string& value)
  • std::string getProperty(const sdt::string& name)

3.3 Poco::ConsoleChannel 控制台通道

Poco::ConsoleChannel 是最基本的通道实现。
头文件:#include “Poco/ConsoleChannel.h”
Poco::ConsoleChannel 只是将接收到的任何消息的文本写入标准输出(std::clog)。
Poco::ConsoleChannel 没有可配置的属性。
Poco::ConsoleChannel 是根记录器的默认通道。

3.4 Poco::WindowsConsoleChannel Windows控制台

Poco::WindowsConsoleChannel类似于ConsoleChannel,但直接写入Windows控制台,而不是std::clog。
头文件:#include “Poco/WindowsConsoleChannel.h”
Poco::WindowsConsoleChannel 只是将接收到的任何消息的文本写入Windows控制台。
Poco::WindowsConsoleChannel 没有可配置的属性。
Poco::WindowsConsoleChannel 支持> UTF-8编码的文本。

3.5 Poco::NullChannel 空通道

Poco::NullChannel丢弃发送给它的所有消息。
头文件:#include “Poco/NullChannel.h”

3.6 Poco::SimpleFileChannel 最简日志文件

3.6.1 说明

Poco::SimpleFileChannel是编写日志文件最简单的方法。
消息的文本被附加到一个文件中,后跟一个换行符。
支持可选的简单日志文件轮换:在主日志文件和备日志文件之间轮流写,当一旦主日志文件超过一定大小,将创建一个备日志文件(如果已经存在,则将其清空)。如果备日志文件超过最大大小,则清空主日志文件,并继续记录主日志文件,依此类推。

3.6.2 属性

1)path:主日志文件路径。
2)secondaryPath:备日志文件路径。默认为path.1
3) rotation:日志文件大小

  • never:默认的,一直记录在主日志文件
  • n:当文件大小超过n字节时轮换
  • n K:当文件大小超过n Kb时轮换
  • n M:当文件大小超过n Mb时轮换

3.6.3 示例

#include "Poco/Logger.h"
#include "Poco/SimpleFileChannel.h"
#include "Poco/AutoPtr.h"
using Poco::Logger;
using Poco::SimpleFileChannel;
using Poco::AutoPtr;
int main(int argc, char** argv)
{
	AutoPtr<SimpleFileChannel> pChannel(new SimpleFileChannel);
	pChannel->setProperty("path", "sample.log");
	pChannel->setProperty("rotation", "2 K");
	Logger::root().setChannel(pChannel);
	Logger& logger = Logger::get("TestLogger"); // 继承根通道
	for (int i = 0; i < 100; ++i)
		logger.information("Testing SimpleFileChannel");
	return 0;
}

3.7 Poco::FileChannel 文件通道

3.7.1 说明

Poco::FileChannel提供了全面的日志文件支持。
头文件:#include “Poco/FileChannel.h”
消息的文本被附加到一个文件中,后跟一个换行符。
Poco::FileChannel 支持根据文件大小或时间间隔轮换日志文件。
Poco::FileChannel 支持归档日志文件的自动归档(不同的文件命名策略)、压缩(gzip)和清除(根据归档文件的时间或归档文件的数量)。

3.7.2 属性

1)path:日志文件路径
2)rotation:日志文件的轮换方式

  • never 不轮换
    • n:当文件大小超过n字节时轮换
  • n K:当文件大小超过n Kb时轮换
  • n M:当文件大小超过n Mb时轮换
  • [day,][hh:][mm]:在指定的星期/时间轮换
  • daily/weekly/monthly:每天/每周/每月
  • n hours/weeks/months:每n个小时/周/月

3)archive:归档日志文件的命名

  • number:一个自动递增的数字,从0开始,附加到日志文件名后。最新存档的文件总是0。
  • timestamp: 以 YYYYMMDDHHMMSS 格式的时间戳附加到日志文件中。

4)times:指定轮换时间是作为本地时间还是UTC时间处理。有效值为local和utc。
5)compress:自动压缩归档文件。指定true或false。
6)purgeAge:指定归档日志文件的最大保存时间。超过这个时间的文件将被清除。
7)purgeCount:指定归档日志文件的最大数目。如果达到这个数字,那么最旧的归档日志文件将被清除。

3.7.3 示例

#include "Poco/Logger.h"
#include "Poco/FileChannel.h"
#include "Poco/AutoPtr.h"
using Poco::Logger;
using Poco::FileChannel;
using Poco::AutoPtr;
int main(int argc, char** argv)
{
	AutoPtr<FileChannel> pChannel(new FileChannel);
	pChannel->setProperty("path", "sample.log");
	pChannel->setProperty("rotation", "2 K");
	pChannel->setProperty("archive", "timestamp");
	Logger::root().setChannel(pChannel);
	Logger& logger = Logger::get("TestLogger"); // 继承根通道
	for (int i = 0; i < 100; ++i)
		logger.information("Testing FileChannel");
	return 0;
}

3.8 Poco::EventLogChannel Windows专用

Poco::EventLogChannel:仅在Windows NT平台上使用,记录Windows事件日志。
Poco::EventLogChannel将PocoFoundation.dll注册为Windows事件日志中的消息定义资源DLL。
当查看Windows事件日志时,事件查看器应用程序必须能够找到PocoFoundation.dll,否则日志消息将不会按预期显示。

3.9 Poco::SyslogChannel Linux专用

仅在Unix平台上可用的Poco::SyslogChannel将日志记录到本地Syslog守护进程。
Net库包含一个RemoteSyslogChannel类,它使用基于udp的Syslog协议与远程Syslog守护进程一起工作。

3.10 Poco::AsyncChannel 异步通道

Poco::AsyncChannel允许在单独的线程中运行通道。
将产生日志消息的线程与传递日志消息的线程解耦。
所有日志消息都存储在FIFO队列中。
一个单独的线程从队列中提取消息并将它们发送到另一个通道。

#include "Poco/Logger.h"
#include "Poco/AsyncChannel.h"
#include "Poco/ConsoleChannel.h"
#include "Poco/AutoPtr.h"
using Poco::Logger;
using Poco::AsyncChannel;
using Poco::ConsoleChannel;
using Poco::AutoPtr;
int main(int argc, char** argv)
{
	AutoPtr<ConsoleChannel> pCons(new ConsoleChannel);
	AutoPtr<AsyncChannel> pAsync(new AsyncChannel(pCons));
	Logger::root().setChannel(pAsync);
	Logger& logger = Logger::get("TestLogger");
	for (int i = 0; i < 10; ++i)
		logger.information("This is a test");
	return 0;
}

3.11 Poco::SplitterChannel 分发通道

Poco::SplitterChannel将消息转发到一个或多个其他通道。
void addChannel(Channel* pChannel)为Poco::SplitterChannel添加一个新通道

#include "Poco/Logger.h"
#include "Poco/SplitterChannel.h"
#include "Poco/ConsoleChannel.h"
#include "Poco/SimpleFileChannel.h"
#include "Poco/AutoPtr.h"
using Poco::Logger;
using Poco::SplitterChannel;
using Poco::ConsoleChannel;
using Poco::SimpleFileChannel;
using Poco::AutoPtr;
int main(int argc, char** argv)
{
	AutoPtr<ConsoleChannel> pCons(new ConsoleChannel);
	AutoPtr<SimpleFileChannel> pFile(new SimpleFileChannel("test.log"));
	AutoPtr<SplitterChannel> pSplitter(new SplitterChannel);
	pSplitter->addChannel(pCons);
	pSplitter->addChannel(pFile);
	Logger::root().setChannel(pSplitter);
	Logger::root().information("This is a test");
	return 0;
}

4、Poco::LogStream 日志流

Poco::LogStream为Logger提供了ostream接口。
流的所有特性都可用于格式化日志消息。
日志消息必须以std::endl(或CR或LF字符)结束。

可以设置消息的优先级

  • LogStream& priority(Message::Priority prio)
  • LogStream& fatal()
  • LogStream& critical()
  • LogStream& error()
  • LogStream& warning()
  • LogStream& notice()
  • LogStream& information()
  • LogStream& debug()
  • LogStream& trace
#include "Poco/LogStream.h"
#include "Poco/Logger.h"
using Poco::Logger;
using Poco::LogStream;
int main(int argc, char** argv)
{
	Logger& logger = Logger::get("TestLogger");
	LogStream lstr(logger);
	lstr << "This is a test" << std::endl;
	return 0;
}

5、日志格式化

5.1 说明

Poco::FormattingChannel 和 Poco::Formatter 负责格式化日志消息。
在将消息传播到下一个通道之前,Poco::FormattingChannel 将它接收到的每个消息传递给 Poco::Formatter。
Formatter是所有格式化器类的基类。
与通道一样,格式化器也可以使用属性进行配置。

5.2 PatternFormatter

PatternFormatter根据printstyle打印模式格式化消息

#include "Poco/ConsoleChannel.h"
#include "Poco/FormattingChannel.h"
#include "Poco/PatternFormatter.h"
#include "Poco/Logger.h"
#include "Poco/AutoPtr.h"
using Poco::ConsoleChannel;
using Poco::FormattingChannel;
using Poco::PatternFormatter;
using Poco::Logger;
using Poco::AutoPtr;
int main(int argc, char** argv)
{
	AutoPtr<ConsoleChannel> pCons(new ConsoleChannel);
	AutoPtr<PatternFormatter> pPF(new PatternFormatter);
	pPF->setProperty("pattern", "%Y-%m-%d %H:%M:%S %s: %t");
	AutoPtr<FormattingChannel> pFC(new FormattingChannel(pPF, pCons));
	Logger::root().setChannel(pFC);
	Logger::get("TestChannel").information("This is a test");
	return 0;
}

6、性能

创建消息需要花费一些时间(必须确定当前时间、当前进程ID和当前线程ID)。
创建一个有意义的消息可能需要更多的时间,因为字符串连接和数字格式等是必要的。
消息通常通过引用在通道链中传递。
特别的:formatingchannel和AsyncChannel创建消息的副本。

对于每个日志记录器,总是分别启用或禁用日志记录(或者更准确地说,设置日志级别),因此,一旦有了对日志记录器的引用,确定为特定日志记录器设置哪个日志级别是一个常数时间操作(简单的内联整数比较)。

获取对记录器的引用是一个具有对数复杂度的操作(基本上是std::map查找)。记录器的名称用作查找中的键,因此记录器名称的长度线性地影响查找时间(字符串比较)。然而,这一点可能可以忽略不计。

通常,对记录器(logger::get())的引用只在应用程序中获得一次。例如,在一个类中,可以在类的构造函数中获得对其日志记录器的引用,然后从此只使用该引用。
应该避免频繁调用Logger::get()。最好是对将要使用的每个记录器调用它一次,然后存储对记录器的引用以供以后使用。
日志性能取决于你要使用的通道。实际信道性能是高度依赖于系统的。

构造日志消息通常是一个耗时的操作,包括字符串创建、字符串连接、数字格式化等。
在这种情况下,使用is()、fatal()、critical()等方法,在构造消息之前检查消息是否会被记录是一个好主意。
还有一些宏在构造消息之前做检查:poco_fatal(msg), poco_critical(msg), poco_error(msg)

if (logger.warning())
{
	std::string msg("This is a warning");
	logger.warning(msg);
}

等同于:poco_warning(logger, “This is a warning”);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/248940.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacOS下载配置OpenCV

主要参考的是OpenCV官方的这篇文章&#xff1a;OpenCV: Installation in MacOS 安装OpenCV需要下载一些安装包&#xff1a;CMake3.9、Git、Python这些我之前已经下载好&#xff0c;这里就不过多阐述了&#xff0c;自行百度安装即可 1.从Git库获取OpenCV&#xff1a; git clon…

Chrome安装Vue插件vue-devtools

1.下载 下载扩展文件&#xff0c;可以去官网下载 GitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging Vue.js applications. 可以在这里下载&#xff0c;比较方便 https://gitee.com/zhang_banglong/vue-devtools 2.解压 下载好之后解压文件 3.打开控制…

vue-实现高德地图-省级行政区地块显示+悬浮显示+标签显示

<template><div><div id"container" /><div click"showFn">显示</div><div click"removeFn">移除</div></div> </template><script> import AMapLoader from amap/amap-jsapi-load…

基于Nexus搭建Maven私服基础入门

什么是Nexus&#xff1f;它有什么优势&#xff1f; 要了解为什么需要nexus的存在&#xff0c;我们不妨从以下几个问题来简单了解一下: 为什么需要搭建私服&#xff1f;如果没有私服会出现什么问题&#xff1f; 对于企业开发而言&#xff0c;如果没有私服&#xff0c;我们所有…

浅析AI视频分析与视频管理系统EasyCVR平台及场景应用

人工智能的战略重要性导致对视频智能分析的需求不断增加。鉴于人工智能视觉技术的巨大潜力&#xff0c;人们的注意力正在从传统的视频监控转移到计算机视觉的监控过程自动化。 1、什么是视频分析&#xff1f; 视频分析或视频识别技术&#xff0c;是指从视频片段中提取有用信息…

自动驾驶学习笔记(十八)——Lidar感知

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 Lidar感知 运动补偿 点云分割 总结…

2021年数维杯国际大学生数学建模A题新冠肺炎背景下港口资源优化配置策略求解全过程文档及程序

2021年数维杯国际大学生数学建模 A题 新冠肺炎背景下港口资源优化配置策略 原题再现&#xff1a; 2020年初&#xff0c;新型冠状病毒&#xff08;COVID-19&#xff09;在全球迅速蔓延。根据世界卫生组织2021年7月31日的报告&#xff0c;新冠病毒疫情对人类的影响可能比原先预…

动手学深度学习-自然语言处理-预训练

词嵌入模型 将单词映射到实向量的技术称为词嵌入。 为什么独热向量不能表达词之间的相似性&#xff1f; 自监督的word2vec。 word2vec将每个词映射到一个固定长度的向量&#xff0c;这些向量能更好的表达不同词之间的相似性和类比关系。 word2vec分为两类&#xff0c;两类…

RT-DETR 图片目标计数 | 特定目标进行计数

全类别计数特定类别计数如何使用 RT-DETR 进行对象计数 有很多同学留言说想学 RT-DETR 目标计数。那么今天这篇博客,我将教大家如何使用 RT-DETR 进行对象计数。RT-DETR 是一种非常强大的对象检测模型,它可以识别图像中的各种对象。我们将学习如何利用这个模型对特定对象进行…

JAVA 异常分类及处理

JAVA 异常分类及处理 概念 如果某个方法不能按照正常的途径完成任务&#xff0c;就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时&#xff0c;这个方法会立刻退出同时不返回任何值。另外&#xff0c;调用这个方法的其他代码也无法继续执行&…

如何查看Linux中glibc的Version

用ldd --version ldd --version 运行libc.so 你没有看错&#xff0c;libc.so是一个可执行程序。 但前提是你要找到它。因为它并不在PATH所包含的目录下。 ppdell:~$ ldd which cat | grep libclibc.so.6 > /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0e6fb34000)ppdell:~…

【单调栈]LeetCode84: 柱状图中最大的矩形

作者推荐 【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数 本文涉及的知识点 单调栈 题目 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形…

【JVM从入门到实战】(七)运行时数据区的组成

运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。 《Java虚拟机规范》中规定了每一部分的作用 线程不共享&#xff1a;程序计数器、虚拟机栈、本地方法栈 线程共享&#xff1a;方法区&#xff0c;堆 1. 程序计数器(Program Count…

代码随想录刷题题Day14

刷题的第十四天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day14 任务 ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和 1 平衡二叉树 二叉树节点的深度&#xff1a;指从根节…

​LeetCode解法汇总1631. 最小体力消耗路径

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 你准备参…

spring 笔记八 SpringMVC异常处理和SpringMVC拦截器

文章目录 SpringMVC拦截器拦截器&#xff08;interceptor&#xff09;的作用拦截器和过滤器区别拦截器是快速入门拦截器方法说明 SpringMVC拦截器拦截器&#xff08;interceptor&#xff09;的作用拦截器和过滤器区别拦截器是快速入门拦截器方法说明 SpringMVC异常处理异常处理…

JMeter安装RabbitMQ测试插件

整体流程如下&#xff1a;先下载AMQP插件源码&#xff0c;可以通过antivy在本地编译成jar包&#xff0c;再将jar包导入JMeter目录下&#xff0c;重启JMeter生效。 Apache Ant 是一个基于 Java 的构建工具。Ant 可用于自动化构建和部署 Java 应用程序&#xff0c;使开发人员更轻…

MATLAB 计算点云坐标的最大最小值 (38)

MATLAB 计算点云坐标的最大最小值 (38) 一、算法介绍二、算法实现1.代码一、算法介绍 沿着X Y Z三个坐标轴方向,点云坐标存在对应的最大最小值,这在计算点云体积或者其他方面有使用,这里使用MATLAB快速获取xmax xmin ymax ymin zmax zmin6个最大最小值 二、算法实现 1.代…

jmeter,断言:响应断言、Json断言

一、响应断言 接口A请求正常返回值如下&#xff1a; {"status": 10013, "message": "user sign timeout"} 在该接口下创建【响应断言】元件&#xff0c;配置如下&#xff1a; 若断言成功&#xff0c;则查看结果树的接口显示绿色&#xff0c;若…

nodejs+vue+微信小程序+python+PHP的微博网络舆情分析系统-计算机毕业设计推荐

2.3.1 功能性分析 按照微博网络舆情分析系统的角色&#xff0c;我划分为了微博用户管理模块和管理员管理模块这三大部分。 微博用户管理模块&#xff1a;&#xff08;1&#xff09;用户登录&#xff1a;用户登录微博网络舆情分析系统 &#xff1b;用户对个人信息的增删改查&…