日志(logging)

news/2025/2/25 0:57:39/文章来源:https://www.cnblogs.com/yexinli/p/18735259

【一】函数式简单配置

import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')

默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为

WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)

默认的日志格式为日志级别:Logger名称:用户输出消息。

【二】灵活配置日志级别,日志格式,输出位置:

import logging file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8', ) logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', handlers=[file_handler, ], level=logging.ERROR ) logging.error('你好')

【三】日志切割

import time import logging from logging import handlers sh = logging.StreamHandler() rh = handlers.RotatingFileHandler('myapp.log', maxBytes=1024, backupCount=5) fh = handlers.TimedRotatingFileHandler(filename='x2.log', when='s', interval=5, encoding='utf-8') logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', handlers=[fh, sh, rh], level=logging.ERROR ) for i in range(1, 100000): time.sleep(1) logging.error('KeyboardInterrupt error %s' % str(i))

【四】配置参数

  • logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为
    • 可用参数有:
filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 format:指定handler使用的日志显示格式。 datefmt:指定日期时间格式。 level:设置rootlogger(后边会讲解具体概念)的日志级别 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
  • format参数中可能用到的格式化串:
%(name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名 %(funcName)s 调用日志输出函数的函数名 %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s用户输出的消息

【五】logger对象配置

import logging logger = logging.getLogger() # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log',encoding='utf-8') # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setLevel(logging.DEBUG)fh.setFormatter(formatter) ch.setFormatter(formatter) logger.addHandler(fh) #logger对象可以添加多个fh和ch对象 logger.addHandler(ch) logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message')
  • logging库提供了多个组件:
    • Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口
      • Handler发送日志到适当的目的地
      • Filter提供了过滤日志信息的方法
      • Formatter指定日志显示格式。
    • 另外,可以通过:
      • logger.setLevel(logging.Debug)设置级别,
      • 当然,也可以通过fh.setLevel(logging.Debug)单对文件流设置某个级别。

【六】日志详细使用

【1】logger对象:负责产生日志

import logging logger = logging.getLogger('转账记录')

【2】filter对象:负责过滤日志(直接忽略)

【3】handler对象:负责日志产生的位置

import logging # 产生到文件的 hd1 = logging.FileHandler('a1.log',encoding='utf8') # 产生到文件的 hd2 = logging.FileHandler('a2.log',encoding='utf8') # 产生在终端的 hd3 = logging.StreamHandler()

【4】formatter对象:负责日志的格式

import logging fm1 = logging.Formatter( fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', ) fm2 = logging.Formatter( fmt='%(asctime)s - %(name)s %(message)s', datefmt='%Y-%m-%d', )

【5】绑定handler对象

import logging logger.addHandler(hd1) logger.addHandler(hd2) logger.addHandler(hd3)

【6】绑定formatter对象

import logging hd1.setFormatter(fm1) hd2.setFormatter(fm2) hd3.setFormatter(fm1)

【7】设置日志等级

import logging logger.setLevel(30)

【8】记录日志

import logging logger.debug('写了半天 好累啊 好热啊')

【七】配置成字典格式

import logging import logging.config standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ '[%(levelname)s][%(message)s]' # 其中name为getlogger指定的名字 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' test_format = '%(asctime)s] %(message)s' logfile_path = 'a3.log' # log配置字典 LOGGING_DIC = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': standard_format }, 'simple': { 'format': simple_format }, 'test': { 'format': test_format }, }, 'filters': {}, # 过滤日志 'handlers': { # 打印到终端的日志 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', # 打印到屏幕 'formatter': 'simple' }, # 打印到文件的日志,收集info及以上的日志 'default': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 'formatter': 'standard', 'filename': logfile_path, # 日志文件 'maxBytes': 1024 * 1024 * 5, # 日志大小 5M 'backupCount': 5, 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 }, 'other': { 'level': 'DEBUG', 'class': 'logging.FileHandler', # 保存到文件 'formatter': 'test', 'filename': 'a2.log', 'encoding': 'utf-8', }, }, 'loggers': { # logging.getLogger(__name__)拿到的logger配置 空字符串作为键 能够兼容所有的日志 '': { 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 'level': 'DEBUG', 'propagate': True, # 向上(更高level的logger)传递 }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置 'other': { 'handlers': ['other', ], 'level': 'DEBUG', 'propagate': False, }, }, } # 使用配置字典 logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置 logger1 = logging.getLogger('xxx') logger1.debug('好好的 不要浮躁 努力就有收获')

【八】日志终极版

import logging # 一:日志配置 logging.basicConfig( # 1、日志输出位置:1、终端 2、文件 # filename='access.log', # 不指定,默认打印到终端 # 2、日志格式 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', # 3、时间格式 datefmt='%Y-%m-%d %H:%M:%S %p', # 4、日志级别 # critical => 50 # error => 40 # warning => 30 # info => 20 # debug => 10 level=30, ) # 二:输出日志 logging.debug('调试debug') logging.info('消息info') logging.warning('警告warn') logging.error('错误error') logging.critical('严重critical') ''' # 注意下面的root是默认的日志名字 WARNING:root:警告warn ERROR:root:错误error CRITICAL:root:严重critical '''

【九】logging模块处理流程

img

  • logger: 最高层模块,用来输出log
    • logger.level来筛选log
    • logger.debug()/info()/warning()/error()等输出log
  • handler:
    • 经过logger过滤后log会分发给所有handler处理。
    • 每个handler有自己的level, formatter, 以及输出流
    • handler.level 过滤log
    • handler.formatter 决定log输出的样式
  • StreamHandler:
    • 常见的StreamHandler输出到标准流,FileHandler,输出到文件
  • level的排序:NOTSET < DEBUG < INFO < WARNING < ERROR
    • 只有大于level的才会被处理
  • 注意:
    • 一条log会经历两次过滤
      • 一次是logger.level
      • 一次是handler.level
    • 被前者过滤掉的log不会进入handler处理流程。
    • handler的level和logger的level没有什么必然关系。

【十】日志模板

# -*-coding: Utf-8 -*- # @File : 03 .py # author: Chimengmeng # blog_url : https://www.cnblogs.com/dream-ze/ # Time:2023/6/4 import logging import logging.config import os import sys try: # 想要给日志上色就安装这个模块 import coloredlogs except Exception as e: if str(e) == "No module named 'coloredlogs'": pass # 自定义日志级别 CONSOLE_LOG_LEVEL = "INFO" FILE_LOG_LEVEL = "DEBUG" # 自定义日志格式 # 打印在文件里的格式:时间戳 + 线程名 + 线程ID + 任务ID + 发出日志调用的源文件名 + 发出日志调用的源代码行号 + 日志级别 + 日志消息正文 # [2023-06-04 15:16:05][MainThread:22896][task_id:root][调用.py:12][INFO][这是注册功能] STANDARD_FORMAT = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d][%(levelname)s][%(message)s]' # 打印在控制台的格式:日志级别 + 时间戳 + 发出日志调用的源文件名 + 发出日志调用的源代码行号 + 日志消息正文 # [INFO][2023-06-04 15:37:28,019][调用.py:12]这是注册功能 SIMPLE_FORMAT = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' ''' 参数详解: -1.%(asctime)s: 时间戳,表示记录时间 -2.%(threadName)s: 线程名称 -3.%(thread)d: 线程ID -4.task_id:%(name)s: 任务ID,即日志记录器的名称 -5.%(filename)s: 发出日志调用的源文件名 -6.%(lineno)d: 发出日志调用的源代码行号 -7.%(levelname)s: 日志级别,如DEBUG、INFO、WARNING、ERROR、CRITICAL等 -8.%(message)s: 日志消息正文 ''' # 日志文件路径 # os.getcwd() : 获取当前工作目录,即当前python脚本工作的目录路径 # 拼接日志文件路径 : 当前工作路径 + “logs”(日志文件路径) LOG_PATH = os.path.join(os.getcwd(), "Activity_logs") # OS模块 : 创建多层文件夹 # exist_ok=True 的意思是如果该目录已经存在,则不会抛出异常。 os.makedirs(LOG_PATH, exist_ok=True) # log日志文件路径 : 路径文件夹路径 + 日志文件 LOG_FILE_PATH = os.path.join(LOG_PATH, 'Logs.log') # 日志配置字典 LOGGING_DIC = { # 日志版本 'version': 1, # 表示是否要禁用已经存在的日志记录器(loggers)。 # 如果设为 False,则已经存在的日志记录器将不会被禁用,而是可以继续使用。 # 如果设为 True,则已经存在的日志记录器将会被禁用,不能再被使用。 'disable_existing_loggers': False, # 格式化程序:用于将日志记录转换为字符串以便于处理和存储。 # 格式化程序定义了每个日志记录的输出格式,并可以包括日期、时间、日志级别和其他自定义信息。 'formatters': { # 自定义格式一:年-月-日 时:分:秒 'standard': { # 自定义日志格式 :时间戳 + 线程名 + 线程ID + 任务ID + 发出日志调用的源文件名 + 发出日志调用的源代码行号 + 日志级别 + 日志消息正文 # 这里要对应全局的 STANDARD_FORMAT 配置 'format': STANDARD_FORMAT, # 时间戳格式:年-月-日 时:分:秒 'datefmt': '%Y-%m-%d %H:%M:%S' # 时间戳格式 }, # 自定义格式二: 'simple': { # 自定义日志格式:# 日志级别 + 时间戳 + 发出日志调用的源文件名 + 发出日志调用的源代码行号 + 日志消息正文 # 这里要对应全局的 SIMPLE_FORMAT 配置 'format': SIMPLE_FORMAT }, }, # 过滤器 'filters': {}, # 日志处理器 'handlers': { # 自定义处理器名称 - 输出到控制台屏幕 'console': { # 设置日志等级 为INFO 'level': CONSOLE_LOG_LEVEL, # 表示该处理器将输出日志到流(stream):日志打印到控制台 'class': 'logging.StreamHandler', # 日志打印格式:日志级别 + 时间戳 + 发出日志调用的源文件名 + 发出日志调用的源代码行号 + 日志消息正文 # 这里的配置要对应 formatters 中的 simple 配置 'formatter': 'simple' }, # 自定义处理器名称 - 输出到文件 'default': { # 自定义日志等级 'level': FILE_LOG_LEVEL, # 标准输出到文件 'class': 'logging.handlers.RotatingFileHandler', # 日志打印格式:年-月-日 时:分:秒 # 这里的配置要对应 formatters 中的 standard 配置 'formatter': 'standard', # 这里 要注意声明配置文件输出端的文件路径 'filename': LOG_FILE_PATH, # 限制文件大小:1024 * 1024 * 5 = 5242880,意味着这个变量的值是 5MB(兆字节) 'maxBytes': 1024 * 1024 * 5, # 表示保留最近的5个日志文件备份。 # 当日志文件达到最大大小限制时,将会自动轮转并且保留最新的5个备份文件,以便查看先前的日志记录。 # 当日志文件达到最大大小限制时,会自动进行轮转,后续的文件名将会以数字进行命名, # 例如,第一个备份文件将被重命名为原始日志文件名加上".1"的后缀, # 第二个备份文件将被重命名为原始日志文件名加上“.2”的后缀, # 以此类推,直到保留的备份数量达到设定的最大值。 'backupCount': 5, # 日志存储文件格式 'encoding': 'utf-8', }, }, # 日志记录器,用于记录应用程序的运行状态和错误信息。 'loggers': { # 空字符串作为键 能够兼容所有的日志(当没有找到对应的日志记录器时默认使用此配置) # 默认日志配置 '': { # 日志处理器 类型:打印到控制台输出 + 写入本地日志文件 'handlers': ['default', 'console'], # 日志等级 : DEBUG 'level': 'DEBUG', # 默认情况下,当一个日志消息被发送到一个Logger对象且没有被处理时,该消息会被传递给它的父Logger对象,以便在更高层次上进行处理。 # 这个传递过程称为“传播(propagation)”,而propagate参数指定了是否要使日志消息向上传播。 # 将其设置为True表示应该传播消息到上一级的Logger对象;如果设置为False则不传播。 # 表示异常将会在程序中继续传播 # 也就是说,如果一个异常在当前的代码块中没有被处理,它将会在上级代码块或调用函数中继续向上传递,直到被某个代码块捕获或者程序退出。 # 这是 Python 中异常处理机制的默认行为。 # 如果将 'propagate' 设置为 False,则异常不会被传播,即使在上级代码块中没有处理异常的语句,程序也会忽略异常并继续执行。 'propagate': True, }, }, } def set_logging_color(name='', ): # 初始化日志处理器 - 使用配置字典初始化日志处理器(将自定义配置加载到日志处理器中) # logging.basicConfig(level=logging.WARNING) logging.config.dictConfig(LOGGING_DIC) # 实例化日志处理器对象 - 并赋予日志处理器等级 logger = logging.getLogger(name) # 将logger对象传递给coloredlogs.install()函数,并执行该函数以安装彩色日志记录器,使日志信息在控制台上呈现为带有颜色的格式。 # 具体来说,该函数会使用ANSI转义序列在终端上输出日志级别、时间戳和消息等信息,并按日志级别使用不同的颜色来区分它们。这可以让日志信息更易于阅读和理解。 coloredlogs.install(logger=logger) # 禁止日志消息向更高级别的父记录器(如果存在)传递。 # 通常情况下,当一个记录器发送一条日志消息时,该消息会被传递给其所有祖先记录器,直到传递到根记录器为止。但是,通过将logger.propagate设置为False,就可以阻止该记录器的消息向上层传递。 # 换句话说,该记录器的消息只会被发送到该记录器的处理程序(或子记录器)中,而不会传递给祖先记录器,即使祖先记录器的日志级别比该记录器要低。 # 这种方法通常适用于需要对特定记录器进行控制,并希望完全独立于其祖先记录器的情况。 # 确保 coloredlogs 不会将我们的日志事件传递给根 logger,这可以防止我们重复记录每个事件 logger.propagate = False # 配置 日志颜色 # 这段代码定义了一个名为coloredFormatter的变量,并将其赋值为coloredlogs.ColoredFormatter。 # 这是一个Python库中的类,用于创建带有彩色日志级别和消息的格式化器。 # 该变量可以用作日志记录器或处理程序的格式化程序,以使日志输出更易于阅读和理解。 coloredFormatter = coloredlogs.ColoredFormatter( # fmt表示格式字符串,它包含了一些占位符,用于在记录日志时动态地填充相关信息。 # [%(name)s]表示打印日志时将记录器的名称放在方括号内,其中name是一个变量名,将被记录器名称所替换。 # %(asctime)s表示打印日志时将时间戳(格式化为字符串)插入到消息中,其中asctime是时间的字符串表示形式。 # %(funcName)s表示打印日志时将函数名插入到消息中,其中funcName是函数的名称。 # %(lineno)-3d表示打印日志时将行号插入到消息中,并且将其格式化为3位数字,其中lineno表示行号。 # %(message)s表示打印日志时将消息本身插入到消息中。 # 综合起来,这个格式字符串将在记录日志时输出以下信息:记录器名称、时间戳、函数名称、行号和日志消息。 # 记录器名称 + 时间戳 + 函数名称 + 行号 + 日志消息 # [root] 2023-06-04 16:00:57 register 15 this is an info message fmt='[%(name)s] %(asctime)s %(funcName)s %(lineno)-3d %(message)s', # 级别颜色字典 level_styles=dict( # debug 颜色:白色 debug=dict(color='white'), # info 颜色:蓝色 info=dict(color='blue'), # warning 颜色:黄色 且 高亮 warning=dict(color='yellow', bright=True), # error 颜色:红色 且 高亮 且 加粗 error=dict(color='red', bold=True, bright=True), # critical 颜色:灰色 且 高亮 且 背景色为红色 critical=dict(color='black', bold=True, background='red'), ), # 这段代码定义了一个名为field_styles的字典 , 其中包含四个键值对。 # 每个键代表日志记录中的不同字段,而每个值是一个字典,它指定了与该字段相关联的样式选项。 # 具体来说,这些字段和样式选项如下: # name:指定记录器的名称,将使用白色颜色。 # asctime:指定日志记录的时间戳,将使用白色颜色。 # funcName:指定记录消息的函数名称,将使用白色颜色。 # lineno:指定记录消息的源代码行号,将使用白色颜色。 field_styles=dict( name=dict(color='white'), asctime=dict(color='white'), funcName=dict(color='white'), lineno=dict(color='white'), ) ) ## 配置 StreamHandler:终端打印界面 # 这行代码定义了一个名为ch的日志处理器。 # 具体来说,它是logging.StreamHandler类的一个实例,用于将日志输出到标准输出流(即控制台)中。 # 在创建StreamHandler对象时,需要指定要使用的输出流 # 因此stream=sys.stdout参数指定了该对象将把日志写入到标准输出流中. ch = logging.StreamHandler(stream=sys.stdout) # 这段代码是 Python 中用于设置日志输出格式的语句。 # 它使用了一个名为 coloredFormatter 的格式化器对象,并将其传递给 ch.setFormatter() 方法来指定输出日志的样式。 # 具体来说,ch 是一个 Logger 对象,它代表了整个日志系统中的一个记录器。 # 可以通过该对象来控制日志的级别、输出位置等行为。而 setFormatter() 方法则用于设置该 Logger 输出日志的格式化方式 # 这里传递的是 coloredFormatter 格式化器对象。 # 在实际应用中,coloredFormatter 可以是自定义的 Formatter 类或者已经存在的 Formatter 对象。 # 这里 将 coloredFormatter - 彩色输出日志信息的格式化器 传入进去。 ch.setFormatter(fmt=coloredFormatter) # 这段代码是在Python中添加一个日志记录器(logger)的处理器(handler)。其中,hdlr参数是指定要添加到记录器(logger)中的处理器(handler)对象,ch是一个代表控制台输出的处理器对象。 # 这行代码的作用是将控制台输出的信息添加到日志记录器中。 logger.addHandler(hdlr=ch) # 这段代码用于设置日志级别为DEBUG,也就是最低级别的日志记录。 # 意思是在程序运行时,只有DEBUG级别及以上的日志信息才会被记录并输出,而比DEBUG级别更低的日志信息则不会被记录或输出。 # DEBUG(调试)、INFO(信息)、WARNING(警告)、ERROR(错误)和CRITICAL(严重错误)。 logger.setLevel(level=logging.DEBUG) # 返回日志生成对象 return logger def get_logger(name='', ): ''' :param name: 日志等级 :return: ''' # 初始化日志处理器 - 使用配置字典初始化日志处理器(将自定义配置加载到日志处理器中) logging.config.dictConfig(LOGGING_DIC) # 实例化日志处理器对象 - 并赋予日志处理器等级 logger = logging.getLogger(name) # 返回日志生成对象 return logger if __name__ == "__main__": # # 示例: # # (1)初始化日志处理器 - 使用配置字典初始化日志处理器(将自定义配置加载到日志处理器中) # logging.config.dictConfig(LOGGING_DIC) # # (2)实例化日志处理器对象 - 并赋予日志处理器等级 # # # logger1 = logging.getLogger('') # 默认为 '' 即以默认配置进行实例化 # logger1 = logging.getLogger('') # # (3)当日志发生时,打印的提示语 # logger1.debug('这是日志生成语句') logger_nor = get_logger() logger_nor.info(msg="this is a debug message") logger_col = set_logging_color() logger_col.debug(msg="this is a debug message")

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Docker连接XQuartz报错

背景 打开XQuartz,在桌面右上角菜单栏中的XQuartz偏好设置中的安全性中启用 "允许从网络客户端连接",并重启XQuartz生效,后续操作中要保持XQuartz为打开状态,不要退出XQuartz报错内容: root@9b90039a4d17:~# ros2 run turtlesim turtlesim_node Authorization r…

MySQL的四种事务隔离级别

一.MySQL四大隔离级别 事务隔离级别 1.读未提交 (Read Uncommitted) 允许一个事务读取另一个事务未提交的数据。 2.读已提交 (Read Committed) 一个事务只能读取另一个事务已经提交的数据。 3.可重复读 (Repeatable Read) 保证在一个事务内多次读取同一数据时,其结果是一致的。…

持续分享干货!清华出品《DeepSeek如何赋能职场》PDF可下载

🔥今天分享的是清华出品《DeepSeek如何赋能职场》的PPT,内容涵盖了DeepSeek运行模式的讲解,如何向DeepSeek提问,如何构建提示词,结合实际多个实际应用场景,详细的介绍了DeepSeek结合其他多模态AI模型持续赋能职场的方法。提示词框架如何使用DeepSeek制作可视化图表如何使…

「跟着渡一学前端」并发请求实现

学习资源 并发请求 【渡一教育】 完整代码 function concurRequest(urls, maxNum) {if (urls.length === 0) {return Promise.resolve([]);}return new Promise((resolve) => {let nextIndex = 0;let finishCount = 0;const result = [];async function _request() {if (nex…

软工作业1

作业相关信息这个作业属于哪个课程 软件工程 这个作业要求在哪里 自我介绍+软工5问 这个作业的目标 自我介绍,了解软件工程基本概念个人介绍 Im YiLaiL YiLaiL/YiLaiL is a ✨ special ✨ repository because its README.md (this file) appears on your GitHub profile.🔭 …

EmEdit设置缓存目录临时文件夹

前言全局说明一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737 EmEditor Professional (64-bit) Version 17.2.4二、打开大文本控制器三、点击右边大文本控制器上 自定义四、选择比较大的磁盘空间作为缓存空间免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他…

谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇

上一篇咱们了解了 ES 7.10 相较于 ES 6.8 新增的字段类型,这一篇我们继续了解新增的查询方法。 Interval 间隔查询: 功能介绍 Interval 查询,词项间距查询,可以根据匹配词项的顺序、间距和接近度对文档进行排名。主要解决的查询场景“创建一个多搜索词匹配的查询,同时保留…

【蓝牙小程序】在微信小程序中使用 ECharts

echarts-for-weixin 项目提供了一个小程序组件,用这种方式可以方便地使用 ECharts。 使用方式下载该项目 如有必要,将 ec-canvas 目录下的 echarts.js 替换为最新版的 ECharts。如果希望减小包体积大小,可以使用自定义构建生成并替换 echarts.js pages 目录下是使用的示例文…

Virtual Box设置双网卡

一、硬件 1.为虚拟机添加网卡2.配置网卡二、软件 3.获取mac地址 命令:ip link [root@vbox network-scripts]# ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd…

简单逆向Java程序

前置 来源 这个程序是我同学编写的一个学生分数管理系统,我将对这个已经编译的程序进行测试、逆向,找出其中的问题,并进行改进。 运行环境macOS 15.4 IntelliJ IDEA 2024.2.3 OpenJDK 23.0.2 TomCat 11.0.4 Safari 15.4运行结果主要问题 在使用了这个程序之后,我发现了以下…

信息论概述

1 信息与消息 1.1 信息 1.1.1 信息的定义 信息是信息论中最基本、最重要的概念 香农信息的定义:信息是事物运动状态或存在方式的不确定描述 1.1.2 (香农)信息的度量样本空间:对于我们需要描述的事物中,事物可能存在不同的状态,即事物展现出来的多种状态。那么为了便于形容事…

JUC并发—12.ThreadLocal源码分析

大纲 1.ThreadLocal的特点介绍 2.ThreadLocal的使用案例 3.ThreadLocal的内部结构 4.ThreadLocal的核心方法源码 5.ThreadLocalMap的核心方法源码 6.ThreadLocalMap的原理总结1.ThreadLocal的特点介绍 (1)ThreadLocal的注释说明 (2)ThreadLocal的常用方法 (3)ThreadLocal的使用…