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

Django笔记之log日志记录详解

以下是一个简单的 logging 模块示例,可以先预览一下,接下来会详细介绍各个模块的具体功能:

LOGGING = {'version': 1,'disable_existing_loggers': False,'formatters': {'verbose': {'format': '%(levelname)s %(message)s',}},'handlers': {'file_1': {'level': 'INFO','filename': '/Users/hunter/python/log_path/file_1.log','formatter': 'verbose','class': 'logging.FileHandler',},'file_2': {'level': 'INFO','class': 'logging.FileHandler','filename': '/Users/hunter/python/log_path/file_2.log','formatter': 'verbose',},'custom_file': {'level': 'INFO','class': 'logging.FileHandler','filename': '/Users/hunter/python/log_path/custome_file.log','formatter': 'verbose',}},'loggers': {'': {'handlers': ['file_1'],'level': 'INFO','propagate': False,},'django': { 'handlers': ['file_2'],'level': 'INFO','propagate': True,},'custom': {'handlers': ['custom_file'],'level': 'INFO','propagate': False,}}
}

以下是本篇笔记全部内容:

  1. 模块总览
  2. Loggers
  3. Handlers
  4. Filters
  5. Formatters
  6. 日志记录方式
  7. logger 参数解析
  8. handler 参数解析
    1. RotatingFileHandler 配置
    2. TimedRotatingFileHandler 配置
    3. HttpHandler 基本配置
    4. SMTPHandler 基本配置
    5. AdminEmailHandler 基本配置
  9. formatter 参数解析
  10. 指定 logger 输出
  11. 日志配置示例

1、模块总览

在 Django 系统中,日志的记录也可以在 setting.py 中配置,key 为 logging,然后下面有几个主要的模块:

loggers、handlers、filters、formatters

系统接收到日志信息后,进入 logger,然后根据指定的 handler 列表发送到 handler 中

根据 handler 的处理方式,将信息写入文件、发送邮件或者其他方式

这些信息可以经过 filter 进行进一步的过滤,根据 formatter 的信息组织形式通过 handler 的处理方式进行处理

2、Loggers

Loggers 是学习日志系统的一个切入点,每个 logger 都是一个命名的桶,处理的信息可以作为日志写入到 logger 里

每一个 logger 都可以被配置一个日志等级,日志等级描述了 logger 记录的信息的严重程度,python 定义了如下几种日志等级:

  • DEBUG:低的、基于调试目的的系统信息
  • INFO:一般系统消息
  • WARNING:发生了小问题的信息
  • ERROR:发生了大问题的信息
  • CRITICAL:发生了严重的问题的信息

每个被写入 logger 的消息都被称为是一个 Log Record(日志记录)。

每个日志记录在被发送到 logger 的时候都有一个日志等级来表示信息的严重程度
比如:

logger.info("xxx")

这些日志记录应该包含一些有用的、包含了问题产生原因的信息

当一条消息被发送到 logger,消息的等级会和 logger 的日志等级做一个比较,只有当消息的等级大于或等于 logger 的记录等级时,消息才会被当前 logger 进行更多的处理

如果这条消息被 logger 接收,那么它会被发送到 Handlers

3、Handlers

我们可以理解 handler 是一个处理器,用来决定每天发送到 logger 的信息应该怎么处理,也就是日志的记录形式

比如说写入一个文件,发送邮件等

跟 Logger 一样,handler也有一个日志等级,只有当发送到 handler 的日志等级大于等于 handler 的日志记录时,handler 才会处理信息

一个 Logger 可以有多个 handler 处理器,每个 handler 都可以有自己的日志等级,因此可以根据信息的重要程度来决定不同的输出

比如你可以用一个 handler 把 ERROR 和 CRITICAL 等级的信息转发到服务页面,另一个 handler 记录所有的信息到一个文件,用作后续的分析

4、Filters

过滤器常被用来提供额外的控制,处理从 logger 到 handler 的日志记录

理论上来说,任何日志消息只要满足了日志等级的要求,都会被发送到 handler 处理,如果加了一个 filter 过滤器,你可以在日志处理上添加额外的标准

比如说你可以添加一个过滤器,只允许某个特定来源的 ERROR 等级的信息被处理

filter 也可以用来修改消息的严重等级,比如一些特定的条件被满足的情况下,你可以将ERROR等级的日志降级为 WARNING

在本篇笔记中,将不介绍 filter 的使用方法,因为能简单就简单一点,暂时不用那么多配置

5、Formatters

格式化,一个日志记录需要被渲染成一个文本,formatter 提供了一些格式器的属性,格式化器由一些 LogRecord 的属性值组成,你也可以自己定义一个属性

6、日志记录方式

当你配置了 loggers,handlers,filters 和 formatters 之后,你可以先获取一个 logger 的实例,然后通过 logger 来记录日志

以下是使用示例:

import logginglogger = logging.getLogger(__name__)def my_view(request):logger.info("this is a log")

这个在调用 my_view 的时候,系统就会记录一条日志

如果是其他等级的日志记录,则会是:

logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()

以下是对日志的记录流程汇总一下:

  • 当有一条日志信息需要被记录,然后会被发送到对应的 logger
  • 然后 logger 根据指定的 handler 被发送到对应的 handler 处理器
  • 在 handler 中会根据日志的等级或者定义的 filter 进行一定的过滤
  • 最终将符合条件的日志信息根据 formatter 的格式定义,将最终形成的日志信息,进行 console 操作、记录到文件、或者发送邮件等操作

在笔记开篇的 logging 示例中,日志的配置在这个 dict 里编写的顺序和消息处理的顺序是相反的

这里没有设置 filter 的操作,所以消息的处理就是从 logger 到 handler 再到 formatter

我们手动在接口里写入一个日志消息,分别在 urls.py 和 views.py 里如下定义:

# blog/urls.py
from django.urls.conf import path
from blog.views import time_viewurlpatterns = [path("curr_time", time_view),
]
# blog/views.py
import datetime
from django.http import HttpResponseimport logginglogger = logging.getLogger(__name__)def time_view(request):now = datetime.datetime.now()html = "<h1>now: %s</h1>" % nowlogger.info("this is a log !")return HttpResponse(html)

启动系统后,在浏览器中访问 http://localhost:9898/blog/curr_time,可以看到定义的日志目录下已经写入了数据:file_1.log 和 file_2.log

打开这两个日志文件,可以看到 loggers 下空字符串指定的 logger 对应的处理器写入的 file_1.log 写入的内容如下:

INFO this is a log ! xxxx
INFO "GET /blog/curr_time HTTP/1.1" 200 40 xxxx

其中包含接口访问信息和我们在接口里自定义的 'this is a log !' 信息

在 file_2.log 中,则只有接口的访问信息:

INFO  200 40 xxxx

在实例化 logger 的时候,如果不指定 logger 的名称,那么则会默认写入我们定义的空字符串下的 logger

不指定 logger 名称的意思即为,getLogger 的时候不指定 logger 的参数:

logger = logging.getLogger(__name__)

7、logger 参数解析

在这里 loggers 里设置两个 key,一个为空字符串,一个是 django。

我们可以理解 key 为 django' 这个 logger 是一个固定的值,会接收到所有来自系统的日志信息,比如一些接口的请求信息,但是不包括用户自定的 logger 输出。

空字符串这里的 logger,可以接收到用户自定义的 logger 输出,也可以接收到一些接口的请求信息,但是这个需要 propagate 的配置

在 loggers 的配置里面:

    'loggers': {'': {'handlers': ['file_1'],'level': 'INFO','propagate': False,},'django': {'handlers': ['file_2'],'level': 'INFO','propagate': True,}}

有如下几个参数:
handlers 是指定消息处理器的,value 是一个列表,可以指定多个处理器,比如说一条消息,你可以同时指定写入文件和发送邮件,或者写入不同的文件

level 参数表示日志的等级,这里设置的是 INFO 等级,如果接收到的消息的等级小于 INFO,那么就会不处理,大于等于 INFO 才会被发送到 handler 处理器中处理

propagate 参数意义可以理解为是否传递传递,在这两个 logger 里,如果 django 这个 logger 的 propagate 的值设为了 True,django 这个 logger 的消息是可以向 空字符串设置的 logger 传递的

换句话说,django 接收到的所有消息都会给空字符串的 logger 再发一遍,使用它的 logger 再进行一遍处理,
如果 propagate 设为了 False,那么空字符串的 logger 仅能接收到用户自定义的消息

8、handler 参数解析

当一条消息从 logger 被发送到 handler,handlers 参数也可以定义多个,通过不同的 key 来区分

在每个 handler 下我们这里设置了四个值:

level 设置了 handler 处理的日志等级,只有当发送过来的日志的等级大于等于该等级时,这个 handler 才会处理

class 设置了日志处理的方式,这里我们的值为 logging.FileHandler,表示是文件处理方式

此外还有比如 StreamHandler 输出到 Stream 打印到标准输出,还有 HttpHandler 通过HTTP 协议向服务器发送 log, 还有 SMTPHandler 会通过 email 发送log

filename 指定输出的日志地址,前面我们的 class 定义为向文件输出,那么这里的 filename 就定义了输出的文件的地址

formatter 则是指定下一级日志文本的输出格式处理的 formatter

日志文件处理策略

对于日志文件,如果系统一直运行,那么则会存在一个问题,那就是日志文件越来越大,这个对于系统的存储和我们查找日志都是不合适的

因此接下来我们新增几个参数用来制定日志文件的处理策略

maxBytes,这个定义了一个日志文件最大的字节数,如果写满了就会新开一个文件继续写而不是继续在原有文件继续增加内容

如果我们需要设置一个文件最大为5M,就可以设为 5 * 1024 * 1024

backupCount,最大的日志文件数量,当文件的个数超出了我们定义的,则会删除最早的日志文件,只保留 backupCount 个日志文件

但是使用上面这两个参数的话,class 的值就得换成 logging.handlers.RotatingFileHandler

接下来介绍几种 handler 的信息处理方式

1.RotatingFileHandler 配置

rotate 的是定期调换位子,轮换的意思

RotatingFileHandler 的作用是根据文件的大小决定是否写入新文件,以下是一个示例:

        'custom_file': {'level': 'INFO','filename': '/home/hunter/python/log_path/custom.log','class': 'logging.handlers.RotatingFileHandler','formatter': 'verbose','maxBytes': 5 * 1024 * 1024,'backupCount': 10}

这个示例表示是将日志写入文件,每个文件最大容量为 5 * 1024 * 1024,即 5M,当日志写入一个文件满了 5M 之后,将会新开一个文件继续写入日志信息,文件夹下保留最新的 10 个文件。

这里新增了两个配置项

backupCount 表示最多保留日志文件的个数

maxBytes 表示每个日志文件最大的存储容量

2.TimedRotatingFileHandler 配置

TimedRotatingFileHandler 表示是根据时间间隔来决定是否写入新文件,以下是示例:

        'time_file': {'level': 'INFO','filename': '/home/hunter/python/log_path/custom.log','class': 'logging.handlers.TimedRotatingFileHandler',  # 记录时间'formatter': 'verbose','backupCount': 3,'when': 'M','interval': 3,}

当 handler 的 class 的值为这个的时候,表示的是根据时间来决定是否写入新文件,上一个是根据文件的容量大小来定的

这里新增了两个配置项,

一个是 when,表示的时间间隔的单位,S为秒,M为分钟,H为小时,D或者 MIDNIGHT为天,W0-W6为从周一到周日某个周几开始间隔一周

另一个是 interval,间隔时间的倍数

日志换新文件继续写入的时间为 when * interval

3.HttpHandler 基本配置

这个配置表示是如果来了需要处理的日志消息就调用一个 HTTP 接口,这里我们可以只做一个示例:

        'http_handler': {'level': 'INFO','class': 'logging.handlers.HTTPHandler','formatter': 'verbose','host': '192.168.1.8:9898','url': '/test_url','method': 'POST',},

这个地方,多了几个配置项

host 表示需要调用接口的 ip 和 端口

url 表示调用的接口路径

method 表示调用的方法

4.SMTPHandler 基本配置

这个配置用于发送邮件,如果日志消息发送到这个配置的 handler,系统会根据邮件的配置系统发送邮件给指定的邮箱

以下是一个使用示例:

        'email': {'level': 'WARNING','class': 'logging.handlers.SMTPHandler','mailhost': ('smtp.163.com', 25),'fromaddr': 'xxxxxxxx@163.com','toaddrs': 'xxxxxxx@qq.com','subject': '系统出错啦!!!','credentials': ('xxxxxxx@163.com', 'JBD******'),'timeout': 20},

在这个配置中,多的配置项的介绍如下:

mailhost 是系统发送邮件的邮箱的主机和端口,这里我们配置的是 163 邮箱

fromaddr 是从哪个邮箱发出来,我们可以创建一个163邮箱然后指定该值

toaddrs 是发送到哪个邮箱,即日志消息的邮件接收地址

subject 是我们发送邮件的标题,而邮件的正文内容即为我们在 logger.warning("报错信息") 中输入的信息

credentials 是163邮箱的验证信息,两个值,前一个值与 fromaddr 保持一致,后面的是一串验证码,是163邮箱开启 SMTP 服务之后163邮箱系统页面给我们的一串授权密码,这个可以自己去了解一下

这样配置好之后,在 logger 的 handler 列表指定这个 handler,然后通过 logger.warning("报错信息") 即可触发这个邮件发送的功能

5.AdminEmailHandler 基本配置

这个配置也是用于日志发送邮件,但是是复用 Django 的默认邮箱的功能

在 logging 中的配置是:

        'mail_admins': {'level': 'WARNING','class': 'django.utils.log.AdminEmailHandler','include_html': True,},

但是这个还需要一些额外的在 settings.py 中的邮箱配置,相当于是复用 Django 系统的功能

以下是 settings.py 中邮箱的配置项:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'   # 163 邮箱的配置地址
EMAIL_PORT = 465  # SMTP 端口
EMAIL_HOST_USER = 'xxxxxx@163.com'   #这个是用来发送邮件的邮箱,与最后一个填写的邮箱地址一致
EMAIL_HOST_PASSWORD = 'JBDM******'  #这里就是前面提到的授权密码
EMAIL_USE_SSL = True
EMAIL_FROM = SERVER_EMAIL = 'xxxxxxx@163.com' # 这个是发送邮件的地址,与上面的 163邮箱相同即可
ADMINS = [['Hunter', 'xxxxxx@qq.com'],
]  # 邮件接收地址

上面的参数都配置好之后也可以日志触发邮件了。

9、formatter 参数解析

formatter 的参数就简单一点,通过不同的 key 来区分不同的 formatter,其下设置一个 format 参数即可对信息进行格式化处理

    'formatters': {'verbose': {'format': '%(levelname)s %(message)s',}},

在示例中只设置了 levelname 和 message 两个参数,levelname 即为该日志消息的等级,message为消息内容

对于请求接口的 message 信息,返回的内容是固定的,比如前面的示例:

"GET /blog/curr_time HTTP/1.1" 200 40

前面是接口的请求方式、接口路径和HTTP协议,然后是接口返回的状态码,这里是 200,后面跟着的 40 这个数字则是接口返回的字符长度

如果是用户在系统里手动写入的 message,则是定义的什么内容,输出的就是什么内容

对于 format 的定义的参数还有很多,以下是几个常用的汇总:

参数名称参数用法含义
levelname%(levelname)s日志等级
message%(message)s消息内容
asctime%(asctime)s时间,格式为'2022-01-01 00:00:00,000'
pathname%(pathname)s日志输出所在文件的全路径
filename%(filename)s日志输出所在的文件名
module%(module)s日志输出所在的模块,可以理解成不带后缀的文件名
name%(name)s调用日志使用的名称,logging.getLogger(name)时为从模块到函数,比如 blog.views
funcName%(funcName)s日志输出的函数名称
lineno%(lineno)d日志输出所在的文件的行数
process%(process)d进程id
processName%(processName)s进程名称
thread%(thread)d线程id
threadName%(threadName)s线程名称

10、指定 logger 输出

之前我们设定的用户手动输入的日志被传送给了 key 为空字符串下的 logger,如果我们想把某一些日志信息专门输出到某个文件怎么处理呢?

在获取 logger 的时候就需要根据 logger 的 key 来指定对应的 logger,比如我们新建一个名为 custom 的 logger 和 对应的 handler,然后输出的地方指定即可,如下:

        'custom': {'handlers': ['custom_file'],'level': 'INFO','propagate': False,}

指定 logger 输出:

import datetime
from django.http import HttpResponseimport loggingcustom_logger = logging.getLogger("custom")  # 对应 logging 配置中的 key 为 custom 的 logger def time_view(request):now = datetime.datetime.now()html = "<h1>now: %s</h1>" % nowcustom_logger.info("this is a custom log")return HttpResponse(html)

这样在对应的地方就可以实现专门的日志输出到专门的文件了。

11、日志配置示例

接下来我们实现这样一个日志配置的功能:

  1. 实现用户所有普通的手动输出都写入一个 manual.log 文件
  2. 所有接口的请求数据都输入到一个 request.log 文件
  3. 设置一个单独的日志输出,可以输出到指定文件
  4. 所有 INFO 级别的日志都输出到文件,高于 INFO 的都发送邮件通知指定联系人
  5. 对于日志文件要求每个文件最大容量为 50M,且文件夹下每个类型的日志最多只有10个
  6. 日志的信息结构为:日志等级-时间-日志输出所在文件名-日志输出所在函数名-日志输出所在文件的行数-消息内容

以下是实现上面这个功能的 logging 配置:

LOGGING = {'version': 1,'disable_existing_loggers': False,'formatters': {'verbose': {'format': '%(levelname)s %(asctime)s %(filename)s %(funcName)s %(lineno)d %(message)s',}},'handlers': {'manual_file': {'level': 'INFO','filename': '/Users/hunter/python/log_path/manual.log','formatter': 'verbose','class': 'logging.handlers.RotatingFileHandler','maxBytes': 5 * 1024 * 1024,'backupCount': 10},'request_file': {'level': 'INFO','filename': '/Users/hunter/python/log_path/request.log','class': 'logging.handlers.RotatingFileHandler','formatter': 'verbose','maxBytes': 5 * 1024 * 1024,'backupCount': 10},'custom_file': {'level': 'INFO','filename': '/Users/hunter/python/log_path/custom.log','class': 'logging.handlers.RotatingFileHandler','formatter': 'verbose','maxBytes': 5 * 1024 * 1024,'backupCount': 10},'email': {'level': 'WARNING','class': 'logging.handlers.SMTPHandler','mailhost': ('smtp.163.com', 25),'fromaddr': 'xxxxxx@163.com','toaddrs': 'xxxxxxx@qq.com','subject': '系统出错啦!!!','credentials': ('xxxxxx@163.com', 'JBD*******'),'timeout': 20},},'loggers': {'': {'handlers': ['manual_file', 'email'],'level': 'INFO','propagate': False,},'django': {'handlers': ['request_file'],'level': 'INFO','propagate': True,},'custom': {'handlers': ['custom_file'],'level': 'INFO','propagate': False,},},
}

然后我们定义一个接口内容:

import datetime
from django.http import HttpResponse, JsonResponseimport logginglogger = logging.getLogger(__name__)
custom_logger = logging.getLogger("custom")def time_view(request):now = datetime.datetime.now()html = "<h1>now: %s</h1>abc\nabc" % nowlogger.info("this is a log !")custom_logger.info("this is a custom log")logger.warning("报错啦!!!")return HttpResponse(html)

调用这个接口即可发现实现了我们想要的功能啦! 

相关文章:

Django笔记之log日志记录详解

以下是一个简单的 logging 模块示例&#xff0c;可以先预览一下&#xff0c;接下来会详细介绍各个模块的具体功能&#xff1a; LOGGING {version: 1,disable_existing_loggers: False,formatters: {verbose: {format: %(levelname)s %(message)s,}},handlers: {file_1: {leve…...

vue局部打印多页面pdf

技术背景 html打印程pdf,使用的官方提供的window.print()打印的样式 media print {} 方法一 const printContent this.$refs.bodyright;var textInput printContent.getElementsByTagName("input");for (var i 0; i < textInput.length; i) {textInput[i].se…...

指定或降低Rust 工具链的版本

要更改 Rust 工具链的版本&#xff0c;您可以使用以下命令之一&#xff1a; rustup default stable&#xff1a;使用 stable 版本的 Rust 工具链作为默认版本。rustup default beta&#xff1a;使用 beta 版本的 Rust 工具链作为默认版本。rustup default nightly&#xff1a;使…...

数据驱动成功:商城小程序分析与改进

在当今数字化时代&#xff0c;商城小程序成为了企业与消费者之间互动的重要途径。然而&#xff0c;一个成功的商城小程序不仅仅是一个购物平台&#xff0c;更需要通过数据分析不断进行改进和优化&#xff0c;以提升用户体验和营销效果。本文将深入探讨如何利用数据驱动的方式进…...

基于GUI的卷积神经网络和长短期神经网络的语音识别系统,卷积神经网的原理,长短期神经网络的原理

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 长短期神经网络的原理 基于GUI的卷积神经网络和长短期神经网络的语音识别系统 代码下载链接:基于MATLABGUI编程的卷积神经网络和长短期…...

Docker环境安装elasticsearch和kibana

一、安装elasticsearch 创建es-network&#xff0c;让es、kibana在同一个网段&#xff1a; docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…...

【剖析STL】vector

vector的介绍及使用 1.1 vector的介绍 cplusplus.com/reference/vector/vector/ vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是…...

Redis、Memcache和MongoDB的区别

>>Memcached Memcached的优点&#xff1a; Memcached可以利用多核优势&#xff0c;单实例吞吐量极高&#xff0c;可以达到几十万QPS&#xff08;取决于key、value的字节大小以及服务器硬件性能&#xff0c;日常环境中QPS高峰大约在4-6w左右&#xff09;。适用于最大程度…...

2023中大ACM游记

游记 中午快十二点时才到了广州六中&#xff0c;在附近吃了塔斯汀汉堡&#xff0c;味道还不错。 十二点半才卡点到了考场&#xff0c;本以为来晚了&#xff0c;但老师说比赛时间延迟&#xff0c;十二点五十才开场。 三个人用一台电脑&#xff0c;这种比赛方式还是第一次遇到…...

记一次线上OOM事故

OOM 问题 linux内核有个机制叫OOM killer(Out-Of-Memory killer)&#xff0c;当系统需要申请内存却申请不到时&#xff0c;OOM killer会检查当前进程中占用内存最大者&#xff0c;将其杀掉&#xff0c;腾出内存保障系统正常运行。 一般而言&#xff0c;一个应用的内存逐渐增加&…...

Learning to Super-resolve Dynamic Scenes for Neuromorphic Spike Camera论文笔记

摘要 脉冲相机使用了“integrate and fire”机制来生成连续的脉冲流&#xff0c;以极高的时间分辨率来记录动态光照强度。但是极高的时间分辨率导致了受限的空间分辨率&#xff0c;致使重建出的图像无法很好保留原始场景的细节。为了解决这个问题&#xff0c;这篇文章提出了Sp…...

怎么使用手机远程控制Win10电脑?

可以使用手机远程控制电脑吗&#xff1f; “近期&#xff0c;我将出差一段时间。问题是&#xff0c;我希望能够从很远的地方浏览家里电脑上的一些东西&#xff0c;但我不会一直随身携带笨重的笔记本电脑。我可以手机远程访问Windows电脑吗&#xff1f; ” 当然&am…...

W6100-EVB-PICO 做UDP Client 进行数据回环测试(八)

前言 上一章我们用开发板作为UDP Server进行数据回环测试&#xff0c;本章我们让我们的开发板作为UDP Client进行数据回环测试。 连接方式 使开发板和我们的电脑处于同一网段&#xff1a; 开发板通过交叉线直连主机开发板和主机都接在路由器LAN口 测试工具 网路调试工具&a…...

Typora 相对路径保存图片以及 Gitee 无法显示图片

目录 Typora 相对路径保存图片 Gitee 无法显示图片 Typora 相对路径保存图片 Step1&#xff1a;修改 Typora 的偏好设置 自动在当前目录创建名为 "./${filename}.assets" 的文件夹粘贴图片到 md 中时&#xff0c;图片会自动另存到 "./${filename}.assets&qu…...

深入探索:Kali Linux 网络安全之旅

目录 前言 访问官方网站 导航到下载页面 启动后界面操作 前言 "Kali" 可能指的是 Kali Linux&#xff0c;它是一种基于 Debian 的 Linux 发行版&#xff0c;专门用于渗透测试、网络安全评估、数字取证和相关的安全任务。Kali Linux 旨在提供一系列用于测试网络和…...

Python 实现语音转文本

Python 实现语音转文本 Python可以使用多种方式来实现语音转文本&#xff0c;下面介绍其中两种。 方法一&#xff1a;使用Google Speech API Google Speech API 是 Google 在 2012 年推出的一个 API&#xff0c;可以用于实现语音转文本。使用 Google Speech API 需要安装 Sp…...

使用DSA、ECDSA、Ed25519 和 rfc6979_rust实现高安全性的数字签名

第一部分&#xff1a;背景和DSA简介 在数字世界中&#xff0c;确保数据的真实性和完整性是至关重要的。一个有效的方法是使用数字签名。在这篇文章中&#xff0c;我们将探讨四种流行的加密签名算法&#xff1a;DSA、ECDSA、Ed25519 和 rfc6979_rust。我们将重点讲解它们的基础…...

“深入探索JVM内部机制:解密Java虚拟机的奥秘“

标题&#xff1a;深入探索JVM内部机制&#xff1a;解密Java虚拟机的奥秘 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;介绍JVM的基本原理、运行时数据区域以及垃圾回收机制&#xff0c;并通过示例代码解释这些概念。 正文&am…...

css3新增属性

文章目录 css3新增属性box-shadowborder-radius设置椭圆 position: sticky;渐变背景线性渐变可重复的渐变背景 径向渐变可重复的渐变背景 过渡分属性 动画关键帧与transition的关系demo 变形平移使用 旋转使用 其他使用立体效果perspective元素位于3D空间还是平面中 缩放变形的…...

自动驾驶港口车辆故障及事故处理机制

1、传感器故障&#xff1a; &#xff08;1&#xff09;单一传感器数据异常处理。自动驾驶电动平板传感方案为冗余设置&#xff0c;有其他传感器能够覆盖故障传感器观测区域&#xff0c;感知/定位模块将数据异常情况发给到规划决策模块&#xff0c;由“大脑”向中控平台上报故障…...

【leetcode 力扣刷题】快乐数/可被k整除的最小整数(可能存在无限循环的技巧题)

可能存在无限循环的技巧题 202. 快乐数数学分析 1015. 可被k整除的最小整数数学分析 202. 快乐数 题目链接&#xff1a;202. 快乐数 题目内容&#xff1a; 理解题意&#xff0c;快乐数就是重复每位数的平方之和得到的新数的过程&#xff0c;最终这个数能变成1。变成1以后&…...

Python 的下一代 HTTP 客户端

迷途小书童 读完需要 9分钟 速读仅需 3 分钟 1 环境 windows 10 64bitpython 3.8httpx 0.23.0 2 简介 之前我们介绍过使用 requests ( https://xugaoxiang.com/2020/11/28/python-module-requests/ ) 来进行 http 操作&#xff0c;本篇介绍另一个功能非常类似的第三方库 httpx&…...

网络安全---webshell实践

一、首先环境配置 1.上传文件并解压 2.进入目录下 为了方便解释&#xff0c;我们只用两个节点&#xff0c;启动之后&#xff0c;大家可以看到有 3 个容器&#xff08;可想像成有 3 台服务器就成&#xff09;。 二、使用蚁剑去连接 因为两台节点都在相同的位置存在 ant.jsp&…...

论AI GPT跨境贸易架构及其应用

摘要 2023年初,我司启动了智慧化跨境贸易供应链一体化平台的建设工作。我在该项目中担任系统架构设计师的职务,主要负责设计平台系统架构和安全体系架构。该平台以移动信息化发展为契机,采用”平台+AI”的模式解决现有应用的集中移动化需求。平台整体的逻辑复杂,对系统的高…...

github的CodeSpace如何对外提供TCP 端口服务?

github提供了codespace&#xff0c;一个IDE环境&#xff0c;可以远程以WEB的形式&#xff0c;运行VS code进行开发。 他会给你提供一个虚拟机&#xff0c;4核16G内存&#xff0c;还是很香的&#xff0c;比普通的VPS性能好多了。 缺点是没有独立的IP地址&#xff0c;无法对外进…...

借助Midjourney创作龙九子图

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; 《西游记》中有这么一段描写&#xff1a; 龙王道&#xff1a;“舍妹有九个儿子。那八个都是好的。第一个小黄龙&#xff0c;见居淮渎&#xff1b;第二个小骊龙&#xff0c;见住济渎&#xff1b;第三个青背龙&#xff0…...

Azure存储访问层

blob数据的热访问层&#xff0c;冷访问层和存档访问层 Azure Blob 存储是一种托管对象存储服务&#xff0c;可用于存储和访问大量非结构化数据&#xff0c;如文本和二进制数据。Azure Blob 存储提供了三个不同层级的访问方式&#xff0c;以适应不同数据的使用模式和成本效益需…...

Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)

文章目录 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)DLc&#xff1a; 消息类和通信类服务器客户端 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五) DLc&#xff1a; 消息类和通信类 Message namespace Net {public class Message{p…...

中间件: Redis安装与部署

单机部署 yum install -y epel-release yum install -y redissed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /etc/redis.conf sed -i "s/# requirepass foobared/requirepass abcd1234/g" /etc/redis.conf systemctl restart redis集群部署 启动6个redis节点…...

Java日志框架-JUL

JUL全称Java util logging 入门案例 先来看着入门案例&#xff0c;直接创建logger对象&#xff0c;然后传入日志级别和打印的信息&#xff0c;就能在控制台输出信息。 可以看出只输出了部分的信息&#xff0c;其实默认的日志控制器是有一个默认的日志级别的&#xff0c;默认就…...

【Java】智慧工地SaaS平台源码:AI/云计算/物联网/智慧监管

智慧工地是指运用信息化手段&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析&#xff0c;提供过程趋势预测及专家预案&#xff0c;实现工程…...

Dodaf架构的学习分享

一.Dodaf的内容 Dodaf的背景 DODAF&#xff08;Department of Defense Architecture Framework&#xff09;起源于美国国防部&#xff0c;是一个用于支持复杂系统设计、规划和实施的架构框架。以下是DODAF的背景和起源&#xff1a; 复杂系统需求&#xff1a;在军事和国防领域&…...

听GPT 讲Prometheus源代码--discovery

Prometheus是一个开源的系统监控和警报工具包&#xff0c;以下是Prometheus源代码中一些主要的文件夹及其作用&#xff1a; cmd/&#xff1a;这个目录包含了Prometheus主要的命令行工具&#xff0c;如prometheus/&#xff0c;promtool/等。每个子目录都代表一个可执行的命令行应…...

HTTP 介绍

HTTP 介绍 HTTP 协议一般指 HTTP&#xff08;超文本传输协议&#xff09;。超文本传输协议&#xff08;英语&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议&#xff0c;是因特网…...

Rust语言深入解析:后向和前向链接算法的实现与应用

内容 - 第一部分 (1/3)&#xff1a; Rust&#xff0c;作为一个旨在提供安全、并行和高性能的系统编程语言&#xff0c;为开发者带来了独特的编程模式和工具。其中&#xff0c;对于数据结构和算法的实现&#xff0c;Rust提供了一套强大的机制。本文将详细介绍如何在Rust中实现后…...

快速提高写作生产力——使用PicGo+Github搭建免费图床,并结合Typora

文章目录 简述PicGo下载PicGo获取Token配置PicGo结合Typora总结 简述PicGo PicGo: 一个用于快速上传图片并获取图片 URL 链接的工具 PicGo 本体支持如下图床&#xff1a; 七牛图床 v1.0腾讯云 COS v4\v5 版本 v1.1 & v1.5.0又拍云 v1.2.0GitHub v1.5.0SM.MS V2 v2.3.0-b…...

Java方法的参数可以有默认值吗?

在日常web开发这种&#xff0c;controller层接受参数时可以通过RequestParam(requiredfalse)设置参数非必填。 所以就想Java的方法可以有非必填这种操作吗&#xff1f;网上搜了一下&#xff0c;发现不支持这种操作。 可以通过方法重载的方式来变相实现。不需要传这个参数就会…...

电子商务的安全防范

(1)安全协议问题&#xff1a;我国大多数尚处在 SSL&#xff08;安全套接层协议&#xff09;的应用上&#xff0c;SET 协议的应用还只是刚刚试验成功&#xff0c;在信息的安全保密体制上还不成熟&#xff0c;对安全协议 还没有全球性的标准和规范&#xff0c;相对制约了国际性…...

STM32开关输入控制220V灯泡亮灭源代码(附带PROTEUSd电路图)

//main.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body************************************************************************…...

Spring Boot配置文件

目录 1.配置文件的作用 2.配置文件的格式 3.properties配置文件说明 3.1 properties基本语法 3.2 读取配置文件信息 3.3 properties 缺点分析 4.yml 配置⽂件说明 4.1 yml 基本语法 4.2 yml 使⽤进阶 4.2.1 yml 配置不同数据类型及 null 4.2.2 配置对象 5.propert…...

函数(2)

6. 函数的声明和定义 6.1 函数声明&#xff1a; 1. 告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么。但是具体是不是存在&#xff0c;函数 声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放…...

Linux笔试题(4)

67、在局域网络内的某台主机用ping命令测试网络连接时发现网络内部的主机都可以连同,而不能与公网连通,问题可能是__C_ A.主机ip设置有误 B.没有设置连接局域网的网关 C.局域网的网关或主机的网关设置有误 D.局域网DNS服务器设置有误 解析&#xff1a;在局域网络内的某台主…...

Selenium的使用:WEB功能测试

Selenium是ThrougthWorks公司一个强大的开源WEB功能测试工具系列&#xff0c;本系统包括多款软件 Selenium语言简单&#xff0c;用(Command,target,value)三种元素组成一个行为&#xff0c;并且有协助录制脚本工具&#xff0c;但Selenese有一些严格的限制&#xff1a; …...

Kubernetes(K8s)从入门到精通系列之十七:minikube启动K8s dashboard

Kubernetes K8s从入门到精通系列之十七:minikube启动K8s dashboard 一、安装minikube的详细步骤二、查看Pod三、启动dashboard四、创建代理访问dashboard五、远程访问dashboard一、安装minikube的详细步骤 Kubernetes(K8s)从入门到精通系列之十六:linux服务器安装minikube的详…...

C++ 网络编程项目fastDFS分布式文件系统(五)--nginx+fastdfs

目录 1. 文件上传下载流程 2. Nginx和fastDFS的整合 3. 数据库表 3.1 数据库操 3.2 数据库建表 1. 文件上传下载流程 fileID 需要是一个哈希来判定。 2. 文件下载流程 3. 优化 优化思路 : 直接让客户端连接 fastDFS 的存储节点 , 实现文件下载 举例 , 访问一个…...

开发者本地搭建性能监测工具(Windows)

ElasticSearch 8.9.0 开发模式安装 JDK安装 官方提供版本与JDK支持关系&#xff1a;https://www.elastic.co/cn/support/matrix#matrix_jvm 我们安装Elasticsearch 8.9.x&#xff0c;看到支持的最低JDK版本是17。 JDK&#xff08;Windows/Mac含M1/M2 Arm原生JDK&#xff09;…...

嵌入式Linux开发实操(八):UART串口开发

串口可以说是非常好用的一个接口,它同USB、CAN、I2C、SPI等接口一样,为SOC/MCU构建了丰富的接口功能。那么在嵌入式linux中又是如何搭建和使用UART接口的呢? 一、Console接口即ttyS0 ttyS0通常做为u-boot(bootloader的一种,像是Windows的BIOS),它需要一个交互界面,一般…...

公告:微信小程序备案期限官方要求

备案期限要求 1、若微信小程序未上架&#xff0c;自2023年9月1日起&#xff0c;微信小程序须完成备案后才可上架&#xff0c;备案时间1-20日不等&#xff1b; 2、若微信小程序已上架&#xff0c;请于2024年3月31日前完成备案&#xff0c;逾期未完成备案&#xff0c;平台将按照…...

cesium中获取高度的误区

this.ellipsoid viewer.scene.globe.ellipsoid; var cartesian viewer.camera.pickEllipsoid(e.position, this.ellipsoid);if(cartesian){// 苗卡尔椭球体的三维坐标 转 地图坐标&#xff08;弧度&#xff09;var cartographic viewer.scene.globe.ellipsoid.cartesianToCa…...

基于Centos:服务器基础环境安装: JDK、Maven、Python、Go、Docker、K8s

创建用户 useradd dev groupadd op chown -R :op /opt chmod -R 770 /opt usermod -aG op devJDK8 yum install -y java-1.8.0-openjdk-devel echo export JAVA_HOME/usr/lib/jvm/java-1.8.0/>> /etc/profilesource /etc/profileJDK11 yum install -y java-11-openjd…...