Python运维-日志记录、FTP、邮件提醒


本章目录如下:

五、日志记录

5.1、日志模块简介

5.2、logging模块的配置与使用

六、搭建FTP服务器与客户端

6.1、FTP服务器模式

6.2、搭建服务器

6.3、编写FTP客户端程序

七、邮件提醒

7.1、发送邮件

7.2、接收邮件

7.3、实例:将报警信息实时发送至邮箱


五、日志记录

通过Python的标准库logging模块定制自己多样化的记录日志需求

5.1、日志模块简介

日志模块的第一个例子:简单将日志打印到屏幕:

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

默认只显示大于等于WARNING级别的日志,日志级别等级:CRITICAL>ERROR>WARNING>INFO>DEBUG。默认的日志格式:日志级别为Logger,名称为用户输出消息。

各日志级别代表的含义:

  • DEBUG调试时的信息打印
  • INFO正常的日志信息记录
  • WARNING:发生了警告信息,但程序仍能正常工作
  • ERROR:发生了错误,部分功能已不正常
  • CRITICAL:发生严重错误,程序可能已崩溃

第二个例子:将日志信息记录至文件:

 import logginglogging.basicConfig(filename='./lx_log1.log')logging.debug('debug message')logging.info('info message')logging.warning('warning message')logging.error('error message')logging.critical('critical message')​# 默认的写log文件的方式是追加

5.2、logging模块的配置与使用

5.2.1、logging模块

通过logging模块的配置改变log文件的写入方式、日志级别、时间戳等信息。例:

 logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',# 日志的格式datefmt="%Y-%m-%d %H:%M:S",     # 时间格式 filename='./lx_log1.log',       # 指定文件位置filemode='w')                   # 指定写入方式

可在logging.basicConfig()函数中通过具体参数来更改logging模块的默认行为:

参数行为
filename用指定的文件名创建FileHandler,这样日志会被存储在指定的文件中
filemode文件打开方式,在指定了filename时用这个参数,默认为a(追加)
format指定handler使用的日志显示格式
datefmt指定日期时间格式
level设置rootlogger的日志级别
stream用指定的stream创建StreamHandler。

format参数中可能用到的格式化串:

参数功能
%(name)sLogger的名字
%(levelno)s数字形式的日志级别
%(levelname)s文本形式的日志级别
%(pathname)s调用日志输出函数的模块的完整路径名,可能没有
%(filename)s调用日志输出函数的模块的文件名
%(module)s调用日志输出函数的模块名
%(funcName)s调用日志输出函数的函数名
%(lineno)d调用日志输出函数的语句所在代码行
%(created)f当前时间,用UNIX标准表示时间的浮点数
%(relativeCreated)d输出日志信息时,自Logger创建以来的毫秒数
%(asctime)s字符串形式的当期时间
%(thread)d线程ID,可能没有
%(threadName)s线程名,可能没有
%(process)d进程ID,可能没有
%(message)s用户输出的消息

实例:

import logginglogging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',# 日志的格式datefmt="%Y-%m-%d %H:%M:S",     # 时间格式filename='./lx_log1.log',       # 指定文件位置filemode='w')                   # 指定写入方式logging.debug('debug message')logging.info('info message')logging.warning('warning message')logging.error('error message')logging.critical('critical message')

5.2.2、四个器

  • logger记录器,应用程序代码能直接使用的接口
  • handler处理器,将(记录器产生的)日志记录发送至合适的目的地
  • filter过滤器,提供了更好的粒度控制,可以决定输出哪些日志记录
  • formatter格式化器,指明了最终输出中日志记录的布局

日志时间信息在记录器、处理器、过滤器、格式化器之间通过一个日志记录实例来传递。通过调用记录器实例的方法来记录日志,每一个记录器实例都有一个名字,名字相当于命名空间,是一个树状结构。

例如,一个记录器叫scan,记录器scan,tex、scan.html、scan.pdf的父节点。比较好的是:

 logger = logging.getLogger(__name__)

logger和handler的工作流程

实例:将日志信息显示在终端的同时也在文件中记录

 import logging​def my_logger(log_file):# 实例化记录器,__name__:获取当前文件的名称,名称为任意,也可为空logger = logging.getLogger(__name__)print(logger.name)      # 打印logger的名称logger.setLevel(logging.INFO)   # 设置logger的日志级别为DEBUG,以便记录所有级别的日志​# 创建两个处理器,一个负责将日志输出到终端,一个负责输出到文件,并分别设置它们的日志级别ch = logging.StreamHandler()    # 终端(控制台)ch.setLevel(logging.DEBUG)fh = logging.FileHandler(filename=log_file,mode="a",encoding="utf-8")   # 文件fh.setLevel(logging.WARNING)​# 创建一个格式化器,可以创建不同的格式化器用于不同的handler,这里我们使用一个formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")​# 设置两个handler的格式化器ch.setFormatter(formatter)fh.setFormatter(formatter)​# 为logger添加两个handlerlogger.addHandler(ch)logger.addHandler(fh)​# 在程序中记录日志if __name__ == '__main__':logger = my_logger("test1.log")logger.debug("这是一个debug日志")logger.info("这是一个info日志")logger.warning("这是一个warning日志")logger.error("这是一个error日志")

handler的日志级别logger的日志级别为基础,logger的日志级别为INFO,低于INFO级别的(如DEBUG)不会出现在handler中。handler中的日志级别高于logger,则只显示更高级别的日志信息。如低于或等于logger的日志级别,则显示logger的日志级别及以上信息。

除了StreamHandler(终端处理器)FileHandler(文件处理器)外,还有其他Handler子类(了解):

Handler子类说明
BaseRotatingHandler循环日志处理器的基类,不能被直接实例化,可使用RotatingFileHandler和TimeRotatingFileHandler
RotatingFileHandler将日志文件记录至磁盘文件,可以设置每个日志文件的最大占用空间
TimeRotatingFileHandler将日志文件记录至磁盘文件,按固定的时间间隔来循环记录日志
SocketHandler可以将日志信息发送到TCP/IP套接字
DatagramHandler可以将日志信息发送到UDP套接字
SMTPHandler可以将日志文件发送至邮箱
SysLogHandler系统日志记录器,可以将日志文件发送至UNIX系统日志,也可以是一个远程机器
NTEventLogHandlerWindows系统事件日志处理器,可以将日志文件发送到Windows系统事件日志
MemoryHandler实例向内存中的缓冲区发送消息,只要满足特定条件,缓冲区就会被刷新
HTTPHandler使用GET或POST方法向HTTP服务器发送消息
WatchedFileandlerWatchedFileandler实例监视它们登录到的文件,如果文件发生更改,则使用文件名关闭并重新打开,只适用unix系统
QueueHandlerQueueHandler实例向队列发送消息,比如在队列或多处理模块中实现的消息
NullHandlerNullHandler实例不适用错误信息,库开发人员使用日志记录,但希望避免在库用户未配置日志记录时显示“日志记录器XXX无法找到任何处理程序”信息

日志的配置信息也可以源于配置文件:示例:

 import loggingimport logging.config​logging.config.fileConfig('logging.conf')​# 创建一个loggerlogger = logging.getLogger('simpleExample')​# 日志记录logger.debug("debug message")logger.info("info message")logger.warning('warning message')logger.error('error message')logger.critical('critical message')

下面是配置文件信息logging.conf:

 [loggers]keys=root,simpleExample​[handlers]keys=consoleHandler​[formatters]keys=simpleFormatter​[logger_root]level=DEBUGhandlers=consoleHandler​[logger_simpleExample]level=DEBUGhandlers=consoleHandlerqualname=simpleExamplepropagate=0​[handler_consoleHandler]class=StreamHandlerlevel=DEBUGformatters=simpleFormatterargs=(sys.stdout,)​[formatter_simpleFormatter]format = %(asctime)s -%(name)s -%(levelname)s - %(message)sdatefmt=%Y-%m-%d %H:%M:%S

六、搭建FTP服务器与客户端

6.1、FTP服务器模式

FTP(File Transfer Protocal,文件传输协议)运行在TCP协议上,使用两个端口,即数据端口命令端口,也称控制端口。默认20是数据端口,21是命令端口

FTP有两种传输模式:主动模式被动模式

6.1.1、主动模式

客户端首先从任意的非特殊端口n(大于1023的端口,也就是客户端的命令端口)连接FTP服务的命令端口(21),向服务器发出命令PORT n+1,告诉服务器使用n+1端口作为数据端口进行数据传输,然后在n+1端口监听

服务器收到PORT n+1后向客户端返回一个“ACK”,然后服务器从它自己的数据端口(20)到客户端先前指定的数据端口(n+1)端口的连接,最后客户端向服务器返回一个‘ACK’,过程结束,如图:

6.1.2、被动模式

服务端发起到客户端的连接,为被动模式,又称PASV,当客户端通知服务器处于被动模式才启用。命令连接和数据连接都是由客户端发起。当开启一个FTP连接时,客户端打开任意两个的非特权本地端口(大于1023)。

第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连接数据端口,而是提交PASV命令。这会使服务器开启一个任意的非特权端口,并发送PORT P命令给客户端,然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据,如图:

6.2、搭建服务器

Python使用pyftpdlib模块进行搭建

 pip install pyftpdlib

6.2.1、快速搭建一个简单的FTP服务器

 python -m pyftpdlib -p 21

执行该命令所在的目录下建立一个端口为21的供下载文件的FTP服务器(Linux系统需要root用户才能使用21端口,windows系统可能是乱码,解决方法:

 # 首先找到pyftpdlib来源:import pyftpdlibprint(pyftpdlib.__path__)​# 打开filesystems.py文件,找到yield line.encode('utf-8',self.cmd_channel.unicode_errors)# 将utf-8修改为gbk​# 打开handlers.py,找到:return bytes.decode('utf-8',self.unicode_errors)# 同样修改为 gbk

6.2.2、搭建一个具有访问权限。可配置相关信息的FTP服务器

from pyftpdlib.authorizers import DummyAuthorizerfrom pyftpdlib.handlers import FTPHandler,ThrottledDTPHandlerfrom pyftpdlib.servers import FTPServerfrom pyftpdlib.log import LogFormatterimport logging​# 记录日志,默认情况下日志仅输出到屏幕(终端),这里既输出到屏幕又输出到文件,方便日志查看logger = logging.getLogger()logger.setLevel(logging.INFO)ch = logging.StreamHandler()fh = logging.FileHandler(filename='myftpserver.log',encoding='utf-8')ch.setFormatter(LogFormatter())fh.setFormatter(LogFormatter())logger.addHandler(ch)logger.addHandler(fh)​# 实例化虚拟用户,这是FTP验证的首要条件authorizer = DummyAuthorizer()# 添加用户权限和路径,括号内的参数是(用户名、密码、用户目录、权限),可以为不同的用户添加不同的目录和权限authorizer.add_user("user","12345","d:/",perm="elradfmw")# 添加匿名用户,只需要路径authorizer.add_anonymous("d:/")​# 初始化ftp句柄handler = FTPHandlerhandler.authorizer = authorizer​# 添加被动端口范围handler.passive_ports = range(2000,2333)​# 下载上传速度设置dtp_handler = ThrottledDTPHandlerdtp_handler.read_limit = 300 * 1024 # 300kb/sdtp_handler.write_limit = 300 * 1024 # 300kb/shandler.dtp_handler = dtp_handler​# 监听ip和端口,linux里需要root用户才能使用21端口server = FTPServer(("0.0.0.0",21),handler)​# 最大连接数server.max_cons = 150server.max_cons_per_ip = 15​# 开启服务,自带日志打印信息server.serve_forever()

该目录下会生成一个myftpserver.log日志文件,windows进入cmd输入ftp [主机IP]登录该FTP服务器并列出目录(dir命令)进行测试。成功!!说明搭建完成,可自行修改用户权限:

读权限说明写权限说明
e改变文件目录a文件上传
l列出文件d删除文件
r从服务器接收文件f文件重命名
m创建文件
w写权限
M文件传输方式

6.3、编写FTP客户端程序

 from ftplib import FTP# 登录FTPftp = FTP(host='localhost',user='user',passwd='12345')# 设置编码方式,由于在windows系统上,设置编码为gbkftp.encoding='gbk'# 切换目录ftp.cwd('test')# 列出文件夹的内容ftp.retrlines('LIST')   # ftp.dir()# 下载文件 note.txtftp.retrbinary('RETR note.txt',open('note.txt','wb').write)# 上传文件 server.pyftp.storbinary('STOR server.py',open('server.py','rb'))# 查看目录下的文件详情for f in ftp.mlsd(path='/test'):print(f)

七、邮件提醒

7.1、发送邮件

目前发送邮件的协议是SMTPSimple Mail Transfer Protocal,简单邮件传输协议),是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python内置的smtplib提供了一种很方便的途径发送电子邮件,可以发送纯文本邮件。HTML邮件及带附件的邮件。Python对SMTP支持有smtplib和email两个模块,email负责构造邮件smtplib负责发送邮件

Python创建SMTP对象语法:

 import smtplibsmtpObj = smtplib.SMTP([host[,port[,local_hostname]]])​# 参数说明host:SMTP服务器主机,可以指定主机的IP地址或域名,是可选参数port:如果提供了host参数,就需要指定SMTP服务器使用的端口号,一般为25local_hostname:如果SMTP在本主机上,那么只需要指定服务器地址为localhost即可

Python SMTP对象使用sendmail方法发送邮件,其语法:

 SMTP.sendmail(from_addr,to_addrs,msg[,mail_options,rcpt_options])# 参数说明from_addr:邮件发送者地址to_addrs:字符串列表,邮件发送地址msg:发送消息

构造简单的文本邮件:

使用SMTP发送邮件之前,确保所用邮箱的SMTP服务已开启:例如QQ邮箱:

 from email.mime.text import MIMETextmessage = MIMEText('Python 邮件发送测试...','plain','utf-8')​# 第一个参数是邮箱正文# 第二个参数是MIME的subtype,传入plain,最终的MIME就是'text/plain'# 最后一定要用UTF-8编码保证多语言兼容性

7.1.1、一封简单的邮件

示例:发送第一封简单的邮件(可以自行将重要信息放置在配置文件进行读取):

 import smtplibfrom email.mime.text import MIMEText​# 第三方SMTP服务mail_host = 'smtp.qq.com'  # 设置服务器mail_user = '你的邮箱用户名'  # 用户名mail_pass = '你的邮箱口令密码'  # 口令​# 发件人sender = 'XXX@qq.com'# 接收者列表receivers = ["XXX@qq.com","XXX@qq.com"]​# 构造正文message = MIMEText("这是正文:邮件正文...","plain","utf-8")message["From"] = sender    # 发件人。必须构造message["To"] = ";".join(receivers) # 收件人列表,不是必须的message["Subject"] = "这是主题:SMTP邮件测试"​try:smtpObj = smtplib.SMTP()smtpObj.connect(mail_host,587)  # 587为QQ邮箱发送的端口号,163邮箱为25smtpObj.login(mail_user,mail_pass)smtpObj.sendmail(sender,receivers,message.as_string())print("发送成功!!")except smtplib.SMTPException as e:print(f"发送失败,错误原因:{e}")

HTML格式的邮件例子如下:

 # 修改上述正文部分message = MIMEText('<html><body><h1>这是正文标题</h1> \<p>正文内容 <a href="#">超链接</a>...</p> \</body></html>',"plain","utf-8")

7.1.2、带图片及附件的邮件

 import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.image import MIMEImagefrom email.header import Header​# 第三方SMTP服务mail_host = 'smtp.qq.com'  # 设置服务器mail_user = '你的邮箱用户名'  # 用户名mail_pass = '你的邮箱口令密码'  # 口令​# 发件人sender = 'XXX@qq.com'# 接收者receivers = ["XXX@qq.com",""]message = MIMEMultipart()​message["From"] = sender    # 发件人。必须构造message["To"] = ";".join(receivers) # 收件人列表,不是必须的message["Subject"] = "这是主题:SMTP邮件测试"​# 构造正文message.attach(MIMEText('<p>这是正文:图片及附件发送测试</p><p>图片演示</p><p><img src="cid:image1"></p>',"html","utf-8"))​# 指定图片为当前目录fp = open("XXX.jpg","rb")msgImage = MIMEImage(fp.read())fp.close()​# 定义图片ID,在HTML文本中引用msgImage.add_header("Content-ID","<image1>")message.attach(msgImage)​# 添加附件1,当前目录下的simple.logatt1 = MIMEText(open("simple.log","rb").read(),"base64","utf-8")att1["Content-Type"] = "application/octet-stream"# 这里的filename可以随便写,写什么名字,邮件中就显示什么名字att1["Content-Disposition"] = 'attachment;filename="simple.log"'    # 法1message.attach(att1)​# 添加附件2,当前目录下的test.txtatt2 = MIMEText(open("test.txt","rb").read(),"base64","utf-8")att2["Content-Type"] = "application/octet-stream"# 这里的filename可以随便写,写什么名字,邮件中就显示什么名字att2.add_header("Content-Disposition","attachment",filename=("gbk","","测试.txt"))    # 法2message.attach(att2)​try:smtpObj = smtplib.SMTP()smtpObj.connect(mail_host,587)smtpObj.login(mail_user,mail_pass)smtpObj.sendmail(sender,receivers,message.as_string())print("发送成功!!")except smtplib.SMTPException as e:print(f"发送失败,错误原因:{e}")

7.2、接收邮件

接收邮件的协议有POP3(Post Office Protocal)和IMAP(Internet Message Access Protocal),Python内置poplib模块实现了POP3协议。

收取邮件分以下两步:

  • 用poplib模块把邮件的原始文本下载到本地
  • 用email模块解析原始文本,还原为邮件对象

示例:

 import poplibfrom email.parser import Parserfrom email.header import decode_headerfrom email.utils import parseaddr​# 输入邮件地址、口令和POP3服务器地址email = "邮件地址"password = "口令"pop3_server = "pop.qq.com"​# 连接到POP3服务器,如果开启ss1,就使用poplib.POP3_SSLserver = poplib.POP3_SSL(pop3_server)# 可以打开或关闭调试信息server.set_debuglevel(1)# 可选:打印POP3服务器的欢迎文字print(server.getwelcome().decode("utf-8"))​# 身份认证server.user(email)server.pass_(password)​# stat()返回邮件数量和占用空间print("邮件数量:%s个。大小:%.2fMB" % (server.stat()[0],server.stat()[1] / 1024 / 1024))​# list()返回所有邮件的编号resp, mails, octets = server.list()# 可以查看返回的列表,类似[b'1 8293',b'2 2184',...]​# 获取最新一封邮件,注意索引号从1开始,最新的邮件索引即为邮件的总个数index = len(mails)resp, lines, octets = server.retr(index)​# lines存储了邮件的原始文本的每一行可以获得整个邮件的原始文本msg_content = b"\r\n".join(lines).decode("utf-8")# 稍后解析出邮件msg = Parser().parsestr(msg_content)​def decode_str(s):value,charset = decode_header(s)[0]if charset:value = value.decode(charset)return valuedef print_address(address_header):name, addr = parseaddr(decode_str(address_header))print(f"{name} <{addr}>")​print("解析获取到的邮件内容如下:\n-------------------begin-----------------")# 打印发件人信息print_address(msg.get('From', ''))# 打印收件人信息print_address(msg.get('To', ''))# 打印主题信息print(decode_str(msg["Subject"]))# 打印第一条正文信息if msg.is_multipart():part0 = msg.get_payload(0)content = part0.get_payload(decode=True)print(content.decode(part0.get_content_charset()) if part0.get_content_charset() else content.decode())else:print(msg.get_payload(decode=True).decode(msg.get_content_charset()) if msg.get_content_charset() else msg.get_payload(decode=True))​print("------------------end------------------")​server.quit()

7.3、实例:将报警信息实时发送至邮箱

相比短信报警,邮件报警是一个非常低成本的解决办法。

报警信息实时发送至邮箱,需求说明如下:

  • 文本文件txt约定格式:第一行为收件人,以逗号分隔;第二行为主题,第三行至最后一行为正文内容,最后一行若是文件,则以附件发送,支持多个附件,以逗号分隔:例如

     xxx@163.com,yyy@163.com xxx程序报警... /home/log/xxx.log,/tmp/yyy/log
  • 持续监控目录A下的txt文件,如果有新增或修改,则读取文本中的内容并发送邮件

  • 有报警需求的程序可生成第一点中格式的文本文件并传送至目录A即可

涉及Python知识点:文件编码、读文件操作、watchdog模块应用及邮件发送

相关代码已上传资源中

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一、Redis五种常用数据类型

Redis优势&#xff1a; 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用&#xff0c;3种高级 3、原子—redis的所有单个操作都是原子性&#xff0c;即要么成功&#xff0c;要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点&#xff1a; 1、支持…

Vscode 实现代码跳转功能

随笔 目录 1. 安装Python 2. 安装Pylance 3. 选择解释器 1. 安装Python 2. 安装Pylance 3. 选择解释器 到此即可实现跳转功能

鸿蒙开发接口Ability框架:【@ohos.application.missionManager (missionManager)】

missionManager missionManager模块提供系统任务管理能力&#xff0c;包括对系统任务执行锁定、解锁、清理、切换到前台等操作。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 impo…

W801学习笔记二十二:英语背单词学习应用——下

续上篇&#xff1a; W801学习笔记二十一&#xff1a;英语背单词学习应用——上 五、处理用户交互 由于英语也是采用了和唐诗一样的《三分钟限时挑战》《五十题竞速挑战》《零错误闯关挑战》&#xff0c;所以用户交互的逻辑和唐诗是一样的。所以&#xff0c;我们抽一个基类&a…

关于2024年东北教育装备展示会(沈阳)参展通知

2024年东北教育装备展示会 邀请函 数字赋能新时代 共创教育新未来 时间&#xff1a;2024年6月28-30日 地点&#xff1a;沈阳国际展览中心&#xff08;沈阳市苏家屯-会展路9号&#xff09; 展览面积&#xff1a;30000平方米 参展商数&#xff1a;260家 预计观众&#xff1…

SpringBoot+Vue+Element-UI实现医患档案管理系统

目录 前言介绍 系统展示 管理员页面 患者管理 诊疗信息管理 病历信息管理 处方信息管理 患者页面 医生页面 部分核心代码 病历信息 上传文件 数据库配置 前言介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技…

【Toritoise SVN】SVN 怎么忽略文件夹下的所有文件但是不忽略文件夹本身

比如&#xff1a;忽略 Assets\StreamingAssets\LocalAsset文件夹下的所有文件但是不忽略LocalAsset这个文件夹 在TortoiseSVN中&#xff0c;你可以通过以下步骤来修改文件夹的svn:ignore属性&#xff1a; 打开Windows资源管理器&#xff0c;导航到你的工作副本中的Assets\Stre…

TCN合集(TCN、TCN-GRU、TCN--GRU--Attention、TCN-Bigru、TCN-BiGRU-Attention)

TCN、TCN-GRU、TCN-GRU-Attention、TCN-BiGRU、TCN-BiGRU-Attention&#xff09;在结构原理上既有相似之处&#xff0c;也存在一些关键的不同点。以下是对这些模型的异同点以及它们之间优劣性的对比&#xff1a; TCN合集&#xff08;TCN-GRU、TCN--GRU--Attention、TCN-Bigru等…

TinyXML-2介绍

1.简介 TinyXML-2 是一个简单、小巧的 C XML 解析库&#xff0c;它是 TinyXML 的一个改进版本&#xff0c;专注于易用性和性能。TinyXML-2 用于读取、修改和创建 XML 文档。它不依赖于外部库&#xff0c;并且可以很容易地集成到项目中。 tinyXML-2 的主要特点包括&#xff1a…

设置多用户远程登录windows server服务器

##设置多用户远程登录windows server服务器 ###1、远程登录windows server 2016 运行—>mstsc—>远程IP地址—>用户和密码 2、远程windows服务器设置多用户策略 运行—>gpedit.msc->计算机配置—管理模板—windows组件—远程桌面服务—远程桌面会话主机----连…

计算机考研|今年这么多高校改考408,该怎么择校呢?

25年改考408院校名单 考研第一重要的事情并不是分要多高&#xff0c;而是要能考得上&#xff01; 尤其是408&#xff0c;绝对是选择大于努力的典范。方向不对&#xff0c;努力作废&#xff01; 就看我22年的分数线吧&#xff0c;最炸的就属上海交大了&#xff0c;大旱区结果…

二进制,八进制,十六进制转十进制 c++

紧接着十进制转二进制&#xff0c;八进制&#xff0c;十六进制-CSDN博客这篇文章 输入一个二进制&#xff0c;八进制的数&#xff0c;怎样能转化为十进制呢&#xff1f; 原理如下&#xff1a; K进制转十进制 按权相加法展开成一个多项式&#xff0c;每项是该位的数码与相应…

抖音小店怎么快速出体验分?分享三种不花一分钱,就能出分的技巧

哈喽~我是电商月月 才做抖音小店&#xff0c;新开的店铺是没有体验分的 没有体验分就没法用猜你喜欢和搜索流量&#xff0c;也没法持续做精选联盟&#xff0c;没体验分店铺就不好出单 于是很多朋友就去网上选择找S分机构&#xff0c;想快速出体验分&#xff0c;但这种方式我…

2019年CSP-J入门级第一轮初赛真题

一&#xff0e;单项选择题(共 15 题&#xff0c;每题 2 分&#xff0c;共计 30 分&#xff1b;每题有且仅有一个正确选项) 中国的国家顶级域名是&#xff08; &#xff09; A. .cnB. .chC. .chnD. .china 二进制数 11 1011 1001 0111 和 01 0110 1110 1011 进行逻辑与运算的结果…

搭建父模块和工具子模块

第一章 项目父模块搭建 1.1 nancal-idsa 作为所有工程的父工程&#xff0c;用于管理项目的所有依赖版本。 1.2 指定 pom 类型模块&#xff0c;删除 src 目录&#xff0c;点击Reload project 1.3 添加依赖 pom.xml <parent> <groupId>org.springframework.…

TitanIDE安装常见问题解答

在软件开发和编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;扮演着至关重要的角色。TitanIDE作为一款功能强大的开发工具&#xff0c;深受广大开发者的喜爱。然而&#xff0c;在安装和使用TitanIDE的过程中&#xff0c;开发者们往往会遇到一些问题和挑战。针…

phpstudy靶场访问显示404 Not Found

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 一、检查phpstduy设置 localhost——管理——修改 1、根目录&#xff08;默认设置&#xff0c;不要改&#xff09; localhost这个域名必须保留&#xff0c;并且把根目录设置为phpstudy的WWW文…

Go语言的包管理工具go mod与之前的GOPATH有什么区别?

在深入探讨Go语言的包管理工具go mod与之前的GOPATH之间的区别之前&#xff0c;我们首先需要理解这两个概念各自的作用和背景。 GOPATH时代 在Go语言早期版本中&#xff0c;GOPATH是一个非常重要的环境变量。它告诉Go工具链在哪里查找你的Go代码、第三方库以及编译后的二进制…

​Web服务器

代码: WebServer 介绍 HTTP层 POST请求一般会包含Content-Length字段, 告诉服务器请求主体的长度GET请求一般不会包含Content-Length字段, 它一般不含请求正文POST响应: Content-Type字段, 根据请求资源的后缀填写 编写 1.读取请求与分析请求 2.根据不同请求方法构建不同的响…

使用curl命令查看服务器端口开放情况

目录 1.ssh端口 22 2.mysql数据库端口 3306 3.web应用端口 &#xff08;Jellyfin 8082&#xff09; &#xff08;wordpress 8088&#xff09; &#xff08;tomcat 8080&#xff09; 4.不存在的端口 5.被防火墙阻挡的端口 1.ssh端口 22 curl -v 10.10.10.205:22 curl…