Python 常用模块Logging

Python 常用模块Logging

【序言】

  • logging模块是专门用来做日志记录的模块

【一】日志等级

  • 默认打印结果到终端上
CRITICAL = 50 	# 致命错误
ERROR = 40		# 错误
WARNING = 30 	# 警告
INFO = 20		# 消息
DEBUG = 10		# 调试
NOTSET = 0 		# 不设置
  • 示例:
    • 默认级别为WANING,只有大于等于这个级别的日志才会输出或者保存
import logging
logging.debug("调试")
logging.info("消息")
logging.warning("警告")
logging.error("错误")
logging.critical("致命错误")# WARNING:root:警告
# ERROR:root:错误
# CRITICAL:root:致命错误

【二】基本配置参数basicConfig

【1】配置参数

(1)日志文件输出位置filename
  • 不指定,默认输出打印到终端
  • 无法同时输出到终端保存日志文件
  • 无法指定保存文件的日志编码格式windows默认GBK
  • 打开文件默认追加a模式, filemode
(2)日志消息格式format
(3)时间格式datefmt
  • 用于修改format中的asctime的具体格式
(4)日志级别level

【2】简单使用

import logginglogging.basicConfig(# 日志输出位置filename='access.log',# 日志文件打开方式filemode="w",# 日志消息格式format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',# 时间格式datefmt='%Y-%m-%d %H:%M:%S %p',# 日志级别level=logging.DEBUG,
)logging.debug("调试")
logging.info("消息")
logging.warning("警告")
logging.error("错误")
logging.critical("致命错误")
  • 输出结果。(access.log文件)(gbk格式)
2023-12-27 15:10:41 PM - root - DEBUG -test:  调试
2023-12-27 15:10:41 PM - root - INFO -test:  消息
2023-12-27 15:10:41 PM - root - WARNING -test:  警告
2023-12-27 15:10:41 PM - root - ERROR -test:  错误
2023-12-27 15:10:41 PM - root - CRITICAL -test:  致命错误

【3】格式化格式

# 时间格式和日志消息格式 格式化%(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				# 用户输出的消息

【三】高级配置字典格式dictConfig

【1】模块简介

(1)记录器Logger
  • Loggerlogging 模块中的核心组件之一,用于向应用程序代码提供日志记录的接口。
  • 通过 logging.getLogger(name) 方法获取或创建 Logger 实例,可以为不同的模块、子系统或应用程序组件创建独立的记录器。
  • 默认name="root"
import logging# 实例化一个叫做my_logger的处理器
logger = logging.getLogger(name="my_logger")
logger.setLevel(logging.DEBUG)
(2)处理器handler
  • Handler 用于指定日志的输出目标,可以是控制台文件网络等。

  • 常用handler有:StreamHandlerFileHandler

# 文件处理器
file_handler = logging.FileHandler(filename="my_logger.log")
file_handler.setLevel(logging.INFO)# 控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
(3)格式化器formatter
  • Formatter 定义了日志输出的格式,包括时间、日志级别、消息等信息的排列方式。
# 文件格式化器
file_formatter = logging.Formatter("%(asctime)s-%(levelname)s-%(name)s-%(message)s", datefmt="%Y-%m-%d %H:%M:%S")# 控制台格式化器
console_formatter = logging.Formatter("%(levelname)s-%(name)s-%(message)s")
(4)过滤器filter(跳过)
  • 负责过滤日志
(5)创建模块关联
  • 建议先handler绑定formatter
  • 然后logger绑定handler
  • 会先使用logger记录器的level日志等级过滤,在分别使用handler处理器的level日志等级过滤
# handler绑定formatter
file_handler.setFormatter(file_formatter)
console_handler.setFormatter(console_formatter)# logger绑定handler
logger.addHandler(file_handler)
logger.addHandler(console_handler)

请添加图片描述

(6)直接使用
logger.debug('调试')
logger.info('消息')
logger.warning('警告')
logger.error('错误 ')
logger.critical('致命错误')
  • 输出结果
# 控制台
# DEBUG-my_logger-调试日志
# INFO-my_logger-消息日志
# WARNING-my_logger-警告日志
# ERROR-my_logger-错误日志 
# CRITICAL-my_logger-严重错误日志# 文件my_logger.log
# 2023-12-27 16:12:32-INFO-my_logger-消息
# 2023-12-27 16:12:32-WARNING-my_logger-警告
# 2023-12-27 16:12:32-ERROR-my_logger-错误 
# 2023-12-27 16:12:32-CRITICAL-my_logger-致命错误

【2】配置成字典格式

import logging.config# log配置字典
LOGGING_DIC = {'version': 1,'disable_existing_loggers': False,'formatters': {'file_formatter': {'format': "%(asctime)s-%(levelname)s-%(name)s-%(message)s",'datefmt': "%Y-%m-%d %H:%M:%S"},'console_formatter': {'format': "%(levelname)s-%(name)s-%(message)s"},},'filters': {},  # 过滤日志'handlers': {# 打印到终端的日志'console_handler': {'level': 'DEBUG','class': 'logging.StreamHandler',  # 打印到屏幕'formatter': 'console_formatter'},# 打印到文件的日志,收集info及以上的日志'file_handler': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler',  # 保存到文件'formatter': 'file_formatter','filename': "my_logger.log",  # 日志文件'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M'backupCount': 5,'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了},},'loggers': {# logging.getLogger(__name__)拿到的logger配置  空字符串作为键 能够兼容所有的日志'': {'handlers': ['console_handler', 'file_handler'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕'level': 'DEBUG','propagate': True,  # 向上(更高level的logger)传递},},
}# 使用配置字典
logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
logger = logging.getLogger()
logger.debug('调试')
logger.info('消息')
logger.warning('警告')
logger.error('错误 ')
logger.critical('致命错误')

【四】logging模板

【1】专业模板

  • 模板作者:Chimengmeng
  • 模板链接:https://www.cnblogs.com/dream-ze/p/17856108.html
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 messagefmt='[%(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 loggerdef get_logger(name='', ):''':param name: 日志等级:return:'''# 初始化日志处理器 - 使用配置字典初始化日志处理器(将自定义配置加载到日志处理器中)logging.config.dictConfig(LOGGING_DIC)# 实例化日志处理器对象 - 并赋予日志处理器等级logger = logging.getLogger(name)# 返回日志生成对象return loggerif __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")

【2】个人模板

  • 可以根据不同的记录器名称保存不同的日志文件
import logging
import logging.config
import os# 自定义日志级别
LOGGER_LEVEL = "DEBUG"
CONSOLE_LOG_LEVEL = "DEBUG"
FILE_LOG_LEVEL = "INFO"# 文件格式化
FILE_FORMAT = "%(asctime)s-%(levelname)s-%(name)s-%(message)s"
# 文件时间格式化
FILE_DATEFMT = "%Y-%m-%d %H:%M:%S"
# 控制台格式化
CONSOLE_FORMAT = "%(name)s-%(message)s"# 日志配置字典
LOGGING_DIC = {# 日志版本'version': 1,# 禁用久的避免影响'disable_existing_loggers': True,'formatters': {# 文件格式化'file_formatter': {# 文件格式'format': FILE_FORMAT,# 时间格式'datefmt': FILE_DATEFMT},# 控制台格式化'console_formatter': {# 控制台格式'format': CONSOLE_FORMAT},},# 过滤器'filters': {},# 日志处理器'handlers': {# 控制台处理器'console_handler': {# 日志等级'level': CONSOLE_LOG_LEVEL,# 日志打印到控制台'class': 'logging.StreamHandler',# 控制台格式化'formatter': 'console_formatter'},# 文件处理器'file_handler': {# 日志等级'level': FILE_LOG_LEVEL,# 输出到文件'class': 'logging.handlers.RotatingFileHandler',# 文件格式化'formatter': 'file_formatter',# 文件路径'filename': "",# 限制文件大小'maxBytes': 1024 * 1024 * 5,# 保留最近的5个日志文件备份。'backupCount': 5,# 日志存储文件格式'encoding': 'utf-8',},},'loggers': {'': {# 日志处理器'handlers': ['file_handler', 'console_handler'],# 日志等级'level': LOGGER_LEVEL,'propagate': True,},},
}def get_logger(name=''):# name处理name = name if name else "root"# 日志文件路径LOG_PATH = os.path.join(os.getcwd(), "Activity_logs")os.makedirs(LOG_PATH, exist_ok=True)LOG_FILE_PATH = os.path.join(LOG_PATH, f'{name}.log')# 修改路径LOGGING_DIC["handlers"]["file_handler"]["filename"] = LOG_FILE_PATH# 初始化配置文件logging.config.dictConfig(LOGGING_DIC)# 实例化日志处理器logger = logging.getLogger(name)# 返回日志生成对象return loggerif __name__ == "__main__":# 实例化日志处理器对象logger = get_logger("bruce")logger.debug("注册成功")logger.info("登陆成功")

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

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

相关文章

Unity引擎有哪些优点

Unity引擎是一款跨平台的游戏引擎,拥有很多的优点,如跨平台支持、强大的工具和编辑器、灵活的脚本支持、丰富的资源库和强大的社区生态系统等,让他成为众多开发者选择的游戏开发引擎。下面我简单的介绍一下Unity引擎的优点。 跨平台支持 跨…

自动化网络故障修复管理

什么是故障管理 故障管理是网络管理的组成部分,涉及检测、隔离和解决问题。如果实施得当,网络故障管理可以使连接、应用程序和服务保持在最佳水平,提供容错能力并最大限度地减少停机时间。专门为此目的设计的平台或工具称为故障管理系统。 …

WPF实战项目二十二(客户端):首页添加备忘录与待办事项

1、在View文件夹下新建文件夹Dialog&#xff0c;新建View&#xff1a;AddMemoView、AddToDoView <UserControlx:Class"WPFProject.Views.Dialogs.AddToDoView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://s…

推荐五款简洁而实用的工具,值得你尝试

​ 分享快乐是生活中美好的瞬间&#xff0c;而分享简单巧妙的工具也能令我愉悦。这五款工具简洁而实用&#xff0c;值得你尝试。 1.视频播放器——Potplayer Potplayer是一款视频播放器&#xff0c;支持DXVA、CUDA和QuickSync等硬件加速技术&#xff0c;提供高效的视频播放性…

关于Java并发、JVM面试题

前言 之前为了准备面试&#xff0c;收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文&#xff1a;https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 并发 进程与线程的区别 线程属于进程&#xff0c;进程可以拥有多个线程。进程独享…

【论文阅读】Resource Allocation for Text Semantic Communications

这是一篇关于语义通信中资源分配的论文。全文共5页&#xff0c;篇幅较短。 目录在这里 摘要关键字引言语义通信资源分配贡献公式符号 系统模型DeepSC TransmitterTransmission ModelDeepSC Receiver 语义感知资源分配策略Semantic Spectral Efficiency &#xff08;S-SE&#…

C++初阶(十七)模板进阶

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、非类型模板参数二、模板的特化1、概念2、函数模板特化3、类模板特化1、全特化2、偏特化 三…

Python爬虫篇(四):京东数据批量采集

京东数据批量采集 ●前言 一年一度的端午节又到了&#xff0c;甜咸粽子之争也拉开了帷幕&#xff0c;它价格高昂&#xff0c;它味道鲜美&#xff0c;然而&#xff0c;默默无名的它却备受广大民众喜爱&#xff01;好家伙&#xff0c;一看就是老qq看点了 &#xff0c;那咱们能做…

Flink1.17实战教程(第七篇:Flink SQL)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

聚焦亚马逊云科技 re:Invent re:Cap专场,重构生成式AI的无限可能!

摘要&#xff1a;12月14日至17日&#xff0c;第十二届全球软件案例研究峰会(简称TOP100summit)在北京国际会议中心成功举办&#xff0c;亚马逊云科技资深开发者布道师郑予彬、亚马逊云科技解决方案研发中心应用科学家肖宇、可以科技产品负责人曹临杰、亚马逊云科技解决方案架构…

Hive实战:统计总分与平均分

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据文件1、在虚拟机上创建文本文件2、将文本文件上传到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、创建Hive表&#xff0c;加载HDFS数据文件…

PO 发布SAP SProxy->外围系统 WebService

通信概览图 外围系统与PO、SAP的请求响应通信过程大致可以用下图描述 &#xff08;个人整理所得&#xff0c;可能有误&#xff0c;欢迎指正&#xff09; 1. 前期准备 1.1 外围系统提供WebService接口 以A系统的RFC发布WebService接口 RFC发布WebService接口 获取到WSDL地…

什么是MLOps?

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;应用激动人心的发展浪潮也许会让人相信&#xff0c;企业交付ML产品的能力也在迅速提高。但现实情况是&#xff0c;ML内部流程很难跟上行业的整体发展……但若以MLOps的形式则有希望解决此问题&#xff…

一文让你读懂Python中的Response对象

目录 引言 一、Response对象简介 二、Response对象的组成 三、Response对象的创建 1、使用内置的http.client模块&#xff1a; 2、使用requests库&#xff1a; 3、使用Django框架&#xff1a; 四、Response对象的处理 1、发送给客户端&#xff1a; 2、设置响应头&…

来看看这个技术,这才是UPS监控的最好方式!

在现代社会中&#xff0c;信息技术的持续发展使得机房UPS监控变得至关重要。机房是企业信息系统的核心&#xff0c;UPS监控系统能够确保在电力故障或其他问题发生时&#xff0c;机房设备能够持续稳定运行&#xff0c;从而保障数据的安全性和可用性。 客户案例 金融机构 河北某…

fork函数详解【Linux】

fork函数详解【Linux】 fork函数的概念fork调用后的底层细节解释fork学习中的一些笔记和问题fork的写实拷贝深拷贝的策略 fork调用失败的原因 fork函数的概念 调用fork函数可以在已存在的进程中创建一个子进程&#xff0c;此时&#xff0c;新进程叫做子进程&#xff0c;原进程叫…

Spring Boot 入参校验及全局异常处理

版本依赖 JDK 17 Spring Boot 3.2.0 源码地址&#xff1a;Gitee Spring Boot validation spring-boot-starter-validation是基于hibernate-validator的实现&#xff0c;在Spring Boot项目中直接导入spring-boot-starter-validation即可。 Valid 和 Validated 的区别 适用范围…

《对话品牌》——活到老“养”到老

本期节目《对话品牌》栏目组邀请到了深圳壹常青健康管理有限公司董事长邬锡娣女士参加栏目录制&#xff0c;分享其企业故事&#xff0c;树立品牌形象&#xff0c;提升品牌价值&#xff01; 节目嘉宾&#xff1a;邬锡娣女士 节目主持人&#xff1a;董倩 节目播出平台&#xf…

在线教育系统源码解读:定制化企业培训APP的开发策略

当下&#xff0c;企业培训正经历着一场数字化的迭代&#xff0c;定制化企业培训APP应运而生&#xff0c;成为提升员工技能、推动企业发展的重要工具。下文小编将与大家一同深入了解在线教育系统的源码&#xff0c;探讨开发定制化企业培训APP的策略&#xff0c;以满足不同企业的…

C#获取windows系统资源使用情况

1.前言 之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源&#xff08;内存、负载、磁盘容量&#xff09;》&#xff0c;这里介绍如何通过C#获取Window系统的资源使用。 2.获取服务器资源 2.1.内存 [DllImport("kernel32.dll")][retu…