当前位置: 首页 > news >正文

【Python日志模块全面指南】:记录每一行代码的呼吸,掌握应用程序的脉搏

文章目录

      • 🚀一、了解日志
      • 🌈二、日志作用
      • 🌈三、了解日志模块
      • ⭐四、日志级别
      • 💥五、记录日志-基础
      • ❤️六、记录日志-处理器handler
      • 🎬七、记录日志-格式化记录
      • ☔八、记录日志-配置logger
      • 👊九、流程梳理

🚀一、了解日志

在这里插入图片描述

日志是记录了一系列事件或活动的文件。在计算机领域,它通常用于记录程序或系统的运行状况和维护信息,以便在需要时进行故障排除或回溯。通过分析日志文件,管理员可以了解系统的使用情况、问题发生的原因以及如何解决这些问题。

日志通常包含时间戳、事件描述、错误消息、警报等信息。它们可以按照不同的标准来分类和过滤,例如按照事件类型、日志级别、时间戳范围等。常见的日志类型包括系统日志、安全日志、应用程序日志等。

🌈二、日志作用

  1. 调试和故障排除:通过分析日志文件可以了解系统崩溃或出现异常的原因,进而进行修复和调试。
  2. 性能调优:通过记录系统性能指标和资源利用情况等信息,管理员可以了解系统的瓶颈所在,从而进行针对性的优化。
  3. 安全审计:日志可以记录系统的安全事件、访问控制和行为审计等信息,以便于发现并防止潜在的安全问题。
  4. 统计分析:管理员可以通过日志记录用户行为、系统使用情况、网络流量等信息进行统计分析,以便于优化服务和提高用户满意度。

🌈三、了解日志模块

logging 模块提供了一种灵活且易于使用的方式来记录应用程序的状态和调试信息。它允许将消息分发到多个处理程序(handlers),并支持不同级别的日志消息。logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;

⭐四、日志级别

在 logging 模块中,日志级别用于描述日志的重要程度。它们按照严重程度分为以下五个级别:DEBUG:最详细的日志信息,通常只在调试问题时使用;INFO:确认一切按预期运行;WARNING:表示发生了一些意外或异常情况,但是该软件还可以正常运行;ERROR:由于更严重的问题,软件已无法执行某些功能;CRITICAL:严重错误,表明程序本身可能无法继续运行。

默认情况下,logging 组件会关闭低级别的日志消息并仅记录 WARNING 级别及其以上的消息。如果需要记录更多详细信息,则需要将 Logger 的 level 属性设置为其他级别。

# DEBUG
# 最详细的调试信息,通常只在开发阶段使用。通过记录变量值、函数参数、分支走向等信息帮助调试人员解决问题。
# INFO
# INFO 级别的日志通常用于确认系统正在按预期运行。例如,记录请求的处理时间、数据库操作数量、任务的完成状态等。
# WARNING
# WARNING 级别的日志表示出现了一些意外或异常情况,但是该软件还可以正常运行。例如,数据缺失或配置文件格式错误等。
# ERROR
# ERROR 级别的日志表示由于更严重的问题,软件已无法执行某些功能。例如,数据库连接失败、文件无法打开等错误。
# CRITICAL
# 最高级别的日志级别,用于记录严重错误,表明程序本身可能无法继续运行。例如,内存耗尽、服务器崩溃等。

在应用程序中,通常会使用多个不同的日志级别来记录不同类型的事件。这使得开发人员可以快速识别和排除问题,并加快故障排除的过程。

# 开发应用程序或部署开发环境时,
# 可以使用DEBUG或INFO级别的日志获取尽可能详细的日志信息来进行开发或部署调试;
# 
# 
# 
# 应用上线或部署生产环境时,应该使用WARNING或ERROR或CRITICAL级别的日志来降低机器的I/O压力和提高获取错误日志信息的效率。
# 日志级别的指定通常都是在应用程序的配置文件中进行指定的。
# 
# 
# 
# 说明:
# 
# -上面列表中的日志等级是从上到下依次升高的,
#     即:DEBUG < INFO < WARNING < ERROR < CRITICAL,
#     而日志的信息量是依次减少的;
# 
# -当为某个应用程序指定一个日志级别后,
#     应用程序会记录所有日志级别大于或等于指定日志级别的日志信息,
#     而不是仅仅记录指定级别的日志信息,
#     nginx、php等应用程序以及这里的python的logging模块都是这样的。
#     同样,logging模块也可以指定日志记录器的日志级别,
#     只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃。

💥五、记录日志-基础

logging.getLogger(name=None) 是 logging 模块中的一个重要函数,用于创建并返回一个 logger 对象。这个函数可以接受一个字符串作为参数,该字符串表示要创建的 logger 的名称。如果未提供名称,则会创建一个名为 root 的默认 logger。

import logging# 创建一个 logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)# 将 StreamHandler 添加到 logger 中 --- StreamHandler处理器:将日志消息输出到标准输出或标准错误流。
logger.addHandler(logging.StreamHandler())# 记录一条日志消息
logger.info('This is an info message')

在这里插入图片描述

logging 模块定义了五个日志级别(从低到高):DEBUG、INFO、WARNING、ERROR 和 CRITICAL。默认情况下,只有 WARNING 以及更高级别的日志消息才会被记录。可以通过设置 Logger 的日志级别来控制哪些消息应该被记录。

logger.setLevel(logging.DEBUG) # 记录所有级别的日志消息
import logging# 创建一个 logger
logger = logging.getLogger('my_logger')# 设置日志级别
logger.setLevel(logging.DEBUG)# 将 StreamHandler 添加到 logger 中 --- StreamHandler处理器:将日志消息输出到标准输出或标准错误流。
logger.addHandler(logging.StreamHandler())# 发布日志消息
logger.debug('This is a debug message')# 创建了一个名为 'my_logger' 的 logger,设置其日志级别为 DEBUG,并发布了一条 DEBUG 级别的日志消息。

在这里插入图片描述


logging模块定义的模块级别的常用函数

函数说明
logging.debug(msg, *args, **kwargs)创建一条严重级别为DEBUG的日志记录
logging.info(msg, *args, **kwargs)创建一条严重级别为INFO的日志记录
logging.warning(msg, *args, **kwargs)创建一条严重级别为WARNING的日志记录
logging.error(msg, *args, **kwargs)创建一条严重级别为ERROR的日志记录
logging.critical(msg, *args, **kwargs)创建一条严重级别为CRITICAL的日志记录
logging.log(level, *args, **kwargs)创建一条严重级别为level的日志记录
logging.basicConfig(**kwargs)对root logger进行一次性配置
 """logging.log() 函数的参数说明:level:指定要记录的日志级别,可选的取值有 DEBUG、INFO、WARNING、ERROR、CRITICAL。*args:需要记录的一个或多个日志消息(字符串)。**kwargs:可选参数,包括 extra、exc_info、stack_info、etc.
"""		
import logging
# 创建一个 logger
logger = logging.getLogger('my_logger')
# 设置日志级别
logger.setLevel(logging.DEBUG)
# 将 StreamHandler 添加到 logger 中 --- StreamHandler处理器:将日志消息输出到标准输出或标准错误流。
# logger.addHandler(logging.StreamHandler())
# 将一条消息记录到日志文件或控制台
logging.log(logging.INFO, 'This is an info message')

❤️六、记录日志-处理器handler

在 logging 模块中,处理器(handler)是一种组件,可以将日志记录到不同的位置,例如输出到文件、发送到电子邮件、发布至网络等等。每个 logger 可以拥有零个或多个 handler,用于控制将记录哪些消息到哪个位置。

logging 模块支持多种类型的处理器

# StreamHandler:将日志消息输出到标准输出或标准错误流。
# 
# FileHandler:将日志消息输出到指定的文件中。
# 
# RotatingFileHandler:类似于 FileHandler,但它可以自动轮换多个日志文件,以避免一个文件太大而无法存储问题。
# 
# SMTPHandler:向指定的邮件地址发送日志消息。
# 
# SysLogHandler:向系统日志服务(syslog)输出日志消息。
# 
# NTEventLogHandler:向 Windows 事件日志输出日志消息。
import logging# 创建一个 logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)# 创建一个 StreamHandler 并设置日志级别为 INFO
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)# 将 StreamHandler 添加到 logger 中
logger.addHandler(console_handler)# 记录一条日志消息
logger.info('This is an info message')# 首先创建了名为 'my_logger' 的 logger 对象,将其日志级别设置为 INFO。
# 然后,创建了一个名为 console_handler 的 StreamHandler 并将它的日志级别设置为 INFO。
# 最后,将 handler 添加到 logger 中,并通过 logger.info() 方法发布一条 INFO 级别的日志消息。

在这里插入图片描述

使用处理器 handler 可以扩展 logging 模块的功能并将日志记录到不同的位置,这对于应用程序的运行时跟踪或调试非常有用。

🎬七、记录日志-格式化记录

在 logging 模块中,格式化记录(Formatted log record)是一种将日志消息格式化为字符串的方式,以便于输出和阅读。可以使用 Formatter 类来创建自定义的格式化记录,以满足特定应用程序需求。

logging模块中定义好的可以用于format格式字符串说明

字段/属性名称使用格式描述
asctime%(asctime)s将日志的时间构造成可读的形式,默认情况下是‘2016-02-08 12:00:00,123’精确到毫秒
name%(name)s所使用的日志器名称,默认是’root’,因为默认使用的是 rootLogger
filename%(filename)s调用日志输出函数的模块的文件名; pathname的文件名部分,包含文件后缀
funcName%(funcName)s由哪个function发出的log, 调用日志输出函数的函数名
levelname%(levelname)s日志的最终等级(被filter修改后的)
message%(message)s日志信息, 日志记录的文本内容
lineno%(lineno)d当前日志的行号, 调用日志输出函数的语句所在的代码行
levelno%(levelno)s该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
pathname%(pathname)s完整路径 ,调用日志输出函数的模块的完整路径名,可能没有
process%(process)s当前进程, 进程ID。可能没有
processName%(processName)s进程名称,Python 3.1新增
thread%(thread)s当前线程, 线程ID。可能没有
threadName%(thread)s线程名称
module%(module)s调用日志输出函数的模块名, filename的名称部分,不包含后缀即不包含文件后缀的文件名
created%(created)f当前时间,用UNIX标准的表示时间的浮点数表示; 日志事件发生的时间–时间戳,就是当时调用time.time()函数返回的值
relativeCreated%(relativeCreated)d输出日志信息时的,自Logger创建以 来的毫秒数; 日志事件发生的时间相对于logging模块加载时间的相对毫秒数
msecs%(msecs)d日志事件发生事件的毫秒部分。logging.basicConfig()中用了参数datefmt,将会去掉asctime中产生的毫秒部分,可以用这个加上
import logging# 创建一个 logger 对象,并设置其日志级别为 INFO
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)# 创建一个 FileHandler,将日志记录到文件 'example.log' 中
fh = logging.FileHandler('example.log')# 将 FileHandler 添加到 logger 中
logger.addHandler(fh)# 创建一个 Formatter 对象并设置日志消息的格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)# 记录一条 INFO 级别的日志消息
logger.info('This is an info message')# 创建了名为 'my_logger' 的 logger 对象,并将其日志级别设为 INFO。接着,创建了一个 FileHandler 对象并将其添加到 logger 对象中。然后,通过 Formatter 类创建了一个格式化记录对象 formatter,并将其设置为日志消息的格式。最后,将 formatter 对象添加到 FileHandler 对象中,以便对每条日志消息进行格式化处理。# 当调用 logger.info() 方法写入日志消息时,该消息会被传递给已经设置了格式化记录的 FileHandler 对象并格式化为指定的字符串格式。例如,如果设置了 '%(asctime)s - %(name)s - %(levelname)s - %(message)s' 的格式化字符串,则会在每条日志消息中输出时间戳、logger 对象的名称、日志级别和消息内容。
import logging# 创建一个 logger 对象,并设置其日志级别为 INFO
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)# 创建一个 FileHandler,用于将日志记录到文件 'example.log' 中
fh = logging.FileHandler('example.log')# 设置 FileHandler 的日志级别为 DEBUG
fh.setLevel(logging.DEBUG)# 创建一个 Formatter 对象,用于设置日志消息的格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 将 Formatter 对象添加到 FileHandler 中
fh.setFormatter(formatter)# 将 FileHandler 添加到 logger 对象中
logger.addHandler(fh)# 记录一条 INFO 级别的日志消息
logger.info('This is an info message')# 记录一条 DEBUG 级别的日志消息
logger.debug('This is a debug message')# 首先创建了名为 'my_logger' 的 logger 对象,并设置其日志级别为 INFO。接着,创建了一个 FileHandler 对象,并指定要将日志记录到文件 'example.log' 中。然后,将 FileHandler 的日志级别设置为 DEBUG,并创建一个 Formatter 对象,以控制日志消息的格式。最后,将 Formatter 对象和 FileHandler 对象添加到 logger 中。# 在 logger 对象准备就绪后,可以通过调用 logger.info() 和 logger.debug() 方法发布不同级别的日志消息。这些消息将分别记录在 'example.log' 文件中,其中 INFO 级别的消息包含时间戳、logger 名称、日志级别和消息内容等信息,而 DEBUG 级别的消息则包含更多的细节信息,例如变量值和程序状态等。

格式化记录提供了一种控制和定制日志消息输出格式的方法,使其更容易阅读和理解。通过使用 Formatter 类,可以创建自定义的格式化记录并将其添加到 logger 对象中,以实现更灵活和有用的日志记录方案。

☔八、记录日志-配置logger

在 logging 模块中,可以使用 basicConfig() 函数或者通过编程的方式来配置 logger 对象的属性和行为。通常情况下,在应用程序开始执行时调用 basicConfig() 函数即可完成全局的基本配置。

logging.basicConfig参数字段

参数名称描述
filename指定日志输出目标文件的文件名(可以写文件名也可以写文件的完整的绝对路径,写文件名日志放执行文件目录下,写完整路径按照完整路径生成日志文件),指定该设置项后日志信息就不会被输出到控制台了
filemode指定日志文件的打开模式,默认为’a’。需要注意的是,该选项要在filename指定时才有效
format指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。logging模块定义的格式字段下面会列出。
datefmt指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效
level指定日志器的日志级别
stream指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发 ValueError异常
stylePython 3.2中新添加的配置项。指定format格式字符串的风格,可取值为’%‘、’{‘和’$‘,默认为’%’
handlersPython 3.3中新添加的配置项。该选项如果被指定,它应该是一个创建了多个Handler的可迭代对象,这些handler将会被添加到root logger。需要说明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时出现2个或3个,否则会引发ValueError异常。
%Y 四位数的年份表示(000-9999)
%y 两位数的年份表示(00-99)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)
%p 上午AM 下午 PM
import logginglogging.basicConfig(filename='example.log', level=logging.DEBUG,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')# 记录一条日志消息
logging.info('This is an info message')# 首先调用了 basicConfig() 函数,并传递了一些参数来设置日志记录器的属性。例如,指定了要将日志消息记录到文件 'example.log' 中,设置了默认日志级别为 DEBUG,指定了日期时间格式,以及设置了一个自定义的日志消息格式。
# 之后可以通过标准的日志记录函数(如 logging.info())来记录日志消息,这些函数都将根据 global basicConfig() 配置的内容记录日志。
需要注意的是,如果在多个模块或文件中使用相同的 logger 对象,则必须确保在所有地方都调用了 basicConfig() 函数,或者手动对所有 logger 对象进行配置。否则,可能会出现不同部分记录的日志信息不一致的问题。总之,无论是使用 basicConfig() 函数还是编程方式来配置 logger 对象,都需要了解每个参数的含义和作用,并根据具体应用场景去设置它们。这些参数包括日志文件名、日志级别、日期时间格式、日志消息格式等方面。
import logging# 配置全局日志记录器属性
logging.basicConfig(filename='example.log', level=logging.DEBUG,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')# 创建一个 logger 对象
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)# 给 logger 添加处理程序 ConsoleHandler,将日志消息输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)# 记录不同级别的日志消息
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

在这里插入图片描述

👊九、流程梳理

# 1、创建一个logger# 2、设置下logger的日志的等级# 3、创建合适的Handler(FileHandler要有路径)# 4、设置下每个Handler的日志等级# 5、创建下日志的格式# 6、向Handler中添加上面创建的格式# 7、将上面创建的Handler添加到logger中# 8、打印输出logger.debug\logger.info\logger.warning\logger.error\logger.critical
import logging# 配置全局日志记录器属性
#logging.basicConfig(filename='example.log', level=logging.DEBUG,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')# 创建logger,如果参数为空则返回root logger
logger = logging.getLogger("nick")
logger.setLevel(logging.DEBUG)  # 设置logger日志等级# 创建handler
fh = logging.FileHandler("example.log", encoding="utf-8")
ch = logging.StreamHandler()# 设置输出日志格式
formatter = logging.Formatter(fmt="%(asctime)s %(name)s %(filename)s %(message)s",datefmt="%Y/%m/%d %X"
)# 注意 logging.Formatter的大小写# 为handler指定输出格式,注意大小写
fh.setFormatter(formatter)
ch.setFormatter(formatter)# 为logger添加的日志处理器
logger.addHandler(fh)
logger.addHandler(ch)# 输出不同级别的log
logger.warning("警告")
logger.info("提示")
logger.error("错误")

在这里插入图片描述

相关文章:

【Python日志模块全面指南】:记录每一行代码的呼吸,掌握应用程序的脉搏

文章目录 &#x1f680;一、了解日志&#x1f308;二、日志作用&#x1f308;三、了解日志模块⭐四、日志级别&#x1f4a5;五、记录日志-基础❤️六、记录日志-处理器handler&#x1f3ac;七、记录日志-格式化记录☔八、记录日志-配置logger&#x1f44a;九、流程梳理 &#x…...

SpringBoot 多种优雅的线程池配置与使用(异步执行函数,反射机制,动态识别参数,有返回值)

想要明白生活你需要先经历它,而不是总在分析它。 —萨莉鲁尼 文章目录 前言一、@Async注解1. 概念2. 使用2.1 使用@EnableAsync启动函数异步支持2.2 不会异步执行的坑2.2.1 为什么内部调用不会异步执行?2.2.2 如何确保@Async方法异步执行?3. 配置线程池3.1 通过代码配置3.1.…...

ansible copy模块--持续创作中

copy模块用于将文件从ansible控制节点&#xff08;管理主机&#xff09;或者远程主机复制到远程主机上。其操作类似于scp&#xff08;secure copy protocol&#xff09;。 关键参数标红。 参数&#xff1a; src:&#xff08;source&#xff1a;源&#xff09; 要复制到远程…...

自学SAP是学习ECC版本还是S4版本?

很多人想学SAP&#xff0c;问我应该学ECC版本还是S4版本&#xff0c;我的建议如果你是自学的话&#xff0c;我个人建议使用ECC版本就行&#xff0c;因为这两个版本前台业务和后台配置的操作差异并不大&#xff0c;主要差异在于数据库的差异&#xff0c;前台业务操作和后台系统配…...

银河麒麟4.0.2安装带有opengl的Qt5.12.9

银河麒麟4.0.2下载地址&#xff1a;银河麒麟-银河麒麟(云桌面系统)-银河麒麟最新版下载v4.0.2-92下载站 VirtualBox:https://www.virtualbox.org/wiki/Downloads qt下载&#xff1a;Index of /archive/qt/5.12/5.12.9 1安装VirtualBox:网上教材比较多 1&#xff09;安装完后安…...

django学习入门系列之第二点《浏览器能识别的标签3》

文章目录 列表表格往期回顾 列表 无序列表 <!-- <ul </ul> 无序列表 --> <ul><li> 内容1 </li><li> 内容2 </li><li> 内容3 </li><li> 内容4 </li> </ul>有序列表 <!-- <ol> &…...

git常见实用命令,简单上手操作

常用命令&#xff1a; 添加远程账号名称&#xff1a;git config --global user.name ‘’ 添加用户eamil&#xff1a;git config --global user.email ‘’ 初始化厂库&#xff1a;git init 新建文件夹&#xff1a;mkdir 文件夹名 新建文件&#xff1a;touch 文件名 查看…...

2-11 基于matlab的BP-Adaboost的强分类器分类预测

基于matlab的BP-Adaboost的强分类器分类预测&#xff0c;Adaboost是一种迭代分类算法&#xff0c;其在同一训练集采用不同方法训练不同分类器&#xff08;弱分类器&#xff09;&#xff0c;并根据弱分类器的误差分配不同权重&#xff0c;然后将这些弱分类器组合成一个更强的最终…...

Neo4j图形数据库查询,Cypher语言详解

Cypher语言详解 Cypher是一种专为Neo4j图形数据库设计的声明式查询语言。它类似于SQL&#xff0c;但其设计目标是便于表达图数据库中常见的图形结构和操作。本文将详细介绍Cypher语言的基本语法、常见操作、高级功能以及使用Cypher进行图形数据分析的技巧。 1. Cypher的基本概…...

C# Winform Datagridview控件使用和详解

DataGridView 是一种以表格形式显示数据的控件&#xff0c;由Rows(行)&#xff0c;Columns(列)&#xff0c;Cells(单元格)构成。本实例将综合利用DataGridView的属性和事件&#xff0c;展示不同的表格风格数据和操作。包含&#xff1a; 添加Datagridview行&#xff0c;列数据设…...

xshell传输文件速率为0

你们好&#xff0c;我是金金金。 场景 此时我通过xshell客户端上传文件&#xff0c;速率一直为0 解决 安装 yum -y install lrzsz 即可 这个工具主要提供 rz 和 sz 命令&#xff0c;用于通过 Zmodem 协议在本地计算机和远程服务器之间传输文件 编写有误还请大佬指正&#xff0…...

2.spring cloud gateway 源码编译

spring cloud gateway编译 1.编译 命令 mvn clean compile -U2.报错 报错信息 核心信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.1.2:check (checkstyle-validation) on project spring-cloud-gateway-mvc: Failed during …...

[Linux] UDP协议介绍:UDP协议格式、端口号在网络协议栈那一层工作...

TCP/IP网络模型, 将网络分为了四层: 之前的文章中以HTTP和HTTPS这两个协议为代表, 简单介绍了应用层协议. 实际上, 无论是HTTP还是HTTPS等应用层协议, 都是在传输层协议的基础上实现的 而传输层协议中最具代表性的就是: UDP和TCP协议了. 以HTTP为例, 在使用HTTP协议通信之前, …...

Spring Boot 中如何解决跨域问题、Spring Cloud 5大组件、微服务的优缺点是什么?

Spring Boot 中如何解决跨域问题 ? SpringMVC项目中使用CrossOrigin注解来解决跨域问题 , 本质是CORS RequestMapping("/hello")CrossOrigin(origins "*")//CrossOrigin(value "http://localhost:8081") //指定具体ip允许跨域public String …...

[Vulnhub] Sleepy JDWP+Tomcat+Reverse+Reverse-enginnering

信息收集 Server IP AddressPorts Opening192.168.8.100TCP:21,8009,9001 $ nmap -sV -sC 192.168.8.100 -p- --min-rate 1000 -Pn Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-20 05:06 EDT Nmap scan report for 192.168.8.100 (192.168.8.100) Host is up (0.00…...

基于MATLAB的误码率与信噪比(附完整代码与分析)

目录 一. 写在前面 二. 如何计算误码率 三. 带噪声的误码率分析 3.1 代码思路 3.2 MATLAB源代码及分析 四. 总结 4.1 输入参数 4.2 规定比特长度 4.3 特殊形式比较 一. 写在前面 &#xff08;1&#xff09;本文章主要讨论如何仿真误码率随着信噪比变化的图像 &#…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 字符串筛选排序(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 字符串筛选排序(100分) 🌍 评测功能需要 订阅专栏 后私信…...

# 开发安全

开发安全 文章目录 开发安全安全开发生命周期安全开发目标安全开发基本准则注入类攻击手段Sql注入命令执行命令执行防御文件遍历防御 植入类安全漏洞防御XSS&#xff08;前端漏洞&#xff09;防御 储存型XSS文件上传防御 CSRF防御 会话固定防御 其它类型安全漏洞越权访问防御 口…...

Qt MaintenanceTool.exe使用镜像源更新Qt

环境&#xff1a;Windows11&#xff0c;Qt6.5&#xff0c;新版的MaintenanceTool.exe linux环境类似&#xff0c;mac环境可以看官方文档。 cmd命令窗口&#xff1a;切换到MaintenanceTool.exe所在目录&#xff0c;可以用“D:”切换到D盘&#xff0c;“cd xxxx”切换到xxxx目录…...

Java 8 Stream API介绍

Java 8引入了Stream API&#xff0c;这是对集合框架的一种增强&#xff0c;它允许你以一种声明式的方式处理数据集合。Stream API的核心在于将数据的操作分为两个主要阶段&#xff1a;中间操作和终端操作。中间操作返回的是一个新的Stream&#xff0c;可以链式调用多个中间操作…...

【前端技巧】css篇

利用counter实现计数器 counter-reset&#xff1a;为计数器设置名称&#xff0c;语法如下&#xff1a; counter-rese: <idntifier><integer>第一个参数为变量名称&#xff0c;第二个参数为初始值&#xff0c;默认为0 counter-increment&#xff1a;设置计数器增…...

2024年6月20日 (周四) 叶子游戏新闻

超市播音系统: 定时播放不同音乐 强制卸载软件: 一款强制卸载软件 免费多人沙盒游戏《宝藏世界》推出更新“潮起潮落”&#xff0c;带来全新克苏鲁风冒险准备好迎接一场超凡的冒险吧&#xff0c;MMORPG发行商gamigo宣布《宝藏世界》的最新更新&#xff1a;“潮起潮落”。这次更…...

Zookeeper 一、Zookeeper简介

1.分布式系统定义及面临的问题 分布式系统是同时跨越多给物理主机&#xff0c;独立运行的多个软件所组成的系统。类比一下&#xff0c;分布式系统就是一群人一起干活。人多力量大&#xff0c;每个服务器的算力是有限的&#xff0c;但是通过分布式系统&#xff0c;由n个服务器组…...

普通一本能找到嵌入式linux工作吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;首先&#xff0c;普通…...

Effective C++ 改善程序与设计的55个具体做法笔记与心得 3

三. 资源管理 13. 以对象管理资源 请记住&#xff1a; 为防止资源泄露&#xff0c;使用智能指针 14. 在资源管理类中小心copying行为 请记住&#xff1a; 复制RAII对象必须一并复制他所管理的资源&#xff0c;所以资源的copying行为决定RAII对象的copying行为普遍而常见的…...

苹果的后来者居上策略:靠隐私保护打脸微软

01.苹果与微软相比更注重用户隐私 我一直是Windows的忠实用户&#xff0c;但微软疯狂地将人工智能融入一切&#xff0c;让我开始觉得应该咬咬牙换成Mac。 自小我几乎只用Windows电脑&#xff0c;所以我对MacOS一直不太适应。虽然Windows 11有其缺点&#xff0c;但总的来说&am…...

java经典面试题--进程和线程的关系/区别

进程和线程的定义以及作用 进程:进程是操作系统分配资源的基本单位,是程序的一次执行过程,它包括了程序执行的上下文环境,包括程序代码、数据、系统资源&#xff08;内存、文件、设备等&#xff09;以及执行状态等信息&#xff0c;其作用是提供一个独立的执行环境&#xff0c;…...

Solr 日志系统7.4.0部署和迁移到本地,Core Admin 添加新的core报错

文章目录 Solr部署Docker部署二进制部署 Tips:Solr设置账号密码方法1&#xff1a;(不使用)方法2&#xff1a; Core Admin 添加新的core报错Solr数据迁移 Solr部署 Docker部署 docker run -d -p 8983:8983 --name solr solr:latest docker run -d -p 8983:8983 -v /opt/solr:/…...

前缀和+双指针,CF 131F - Present to Mom

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 131F - Present to Mom 二、解题报告 1、思路分析 很经典的一种把列看作cell 来进行双指针/递推的题型 我们考虑&#xff0c;可以预处理出原矩阵中的所有star 然后我们去枚举矩形的上下边界&#xff0c;把…...

HCIA-速查-ENSP模拟器2步清空配置

需求&#xff1a;清空模拟器配置 清空当前图中配置 步骤1&#xff1a;reset saved-configuration 后输入y确认 步骤2&#xff1a;reboot后输入n否认再输入y确认 验证已经清空配置...

装饰公司做网站怎么收费/北京seo关键词优化收费

可燃气体传感器对一种或多种的可燃气体的浓度进行检测并响应&#xff0c;在工业中的使用频率比较高的。近年来&#xff0c;传感器相关技术水平飞速发展&#xff0c;可燃气体传感器也开始朝向高稳定性、易操作性的方向发展。那么可燃气体传感器工作原理是怎样的呢&#xff1f;下…...

cnb网站登入/个人接外包的网站

azure 使用NoSQL存储有很多类型。 一些是文档数据库&#xff0c;另一些存储键/值对&#xff0c;它们都支持许多不同类型的索引和查询。 有基于磁盘的系统和旨在在内存中工作的系统。 有些可以有效处理大量数据&#xff1b; 其他人则专注于提高速度。 拥有如此众多的不同产品&am…...

域名对网站排名的影响/外贸网站制作公司

我的这篇博客有详细的JSON规范格式说明。 JSON格式说明。这篇博客的内容摘录自RFC草案7159&#xff0c;所以权威性很高。 JSON是javascript中引用数据类型–对象的超集(子集:[超-出自java面相对象之继承之super关键词])。它的初衷是为了解决各个软件系统之间交换数据的需求。和…...

普通网站能不能用vue做几个小功能/百度首页排名优化多少钱

PrizmDoc Viewer添加了新的Excel渲染选项 添加了新的Microsoft Excel渲染选项。PrizmDoc Viewer现在提供了在MSO渲染模式下查看Excel文档时自动调整单元格宽度和/或高度的选项。 PrizmDoc Viewer Microsoft Office转换附加选项现在与运行在Microsoft Windows Server 2019/2022上…...

超级链接网站模板/识别关键词软件

Java面向对象-static静态方法与普通方法java里方法分为 static静态方法和普通方法所谓静态方法 是加了static修饰词的方法&#xff0c;我们使用的时候 一般用类名.方法 方式调用&#xff1b;当然也可以用对象.方法 调用&#xff1b; 一般java里的工具类里的工具方法 用static修…...

顺德公司做网站/营销排名seo

MySQL 中的 SQL对于 MySQL &#xff0c;第一件你必须牢记的是它的每一行命令都是用分号 (;) 作为结束的&#xff0c;但……没有完全绝对的事&#xff0c;在这儿也是一样。前面我曾经讲到,当一行 MySQL 被插入在 PHP 代码中时,最好把后面的分号省略掉,例如&#xff1a;mysql_que…...