日志服务管理
系统日志管理
sysklogd 系统日志服务
在 CentOS5 以及之前的发行版中,其采用的 sysklogd 服务来记录和管理系统日志的。
sysklogd 服务有两个模块:
-
klogd: 用于记录 linux kernel 相关的日志
-
syslogd:用于记录用户空间应用日志
rsyslog 系统日志服务
RSYSLOG is the rocket-fast system for log processing.
rsyslog 是 CentOS6 以后的版本中使用的日志管理程序,是一个默认安装的服务,并且默认开机启动。
rsyslog 特性
支持输出日志到各种数据库,如 MySQL,PostgreSQL,MongoDB ElasticSearch,实现使用第三方服 务对日志进行存储和分析;
精细的输出格式控制以及对日志内容的强大过滤能力,可实现过滤记录日志信息中的指定部份;
通过 RELP + TCP 实现数据的可靠传输
支持数据的加密和压缩传输等
多线程
ELK 日志服务
ELK 是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。在后续 发展的过程中增加了一个 FileBeat,这几款软件通常在一起配合使用,各司其职。ELK 主要用于部署在 企业架构中,收集多台设备上多个服务的日志信息,并将其统一整合后提供给用户。我们后面的课程中 会有专门的章节讲解 ELK 服务。
rsyslog 日志服务与 ELK 日志服务的区别:
rsyslog 主要用于单机日志管理,ELK 主要用于分布式集群环境中的日志管理。
rsyslog 日志管理
系统日志相关概念
facility: 设施,从功能或程序上对日志进行归类
在一台主机上会同时运行多个服务和软件,每个服务或软件都有可能会产生大量的日志,如果每个服务 或软件产生的日志都独立存放管理,那文件数量就太多了,如果都放到一个文件中,似乎也不是很合 适,所以 rsyslog 将日志进行了分类,相同类型的日志放一个文件,这样便于管理。
#syslog 内置分类
LOG_AUTH #auth 安全和认证相关的日志
LOG_AUTHPRIV #authpriv 安全和认证相关的日志,私有
LOG_CRON #cron 系统定时任务 crontab 与 at 产生的相关日志
LOG_DAEMON #daemon 各守护进程产生的日志
LOG_FTP #ftp ftp守护进程产生的日志
LOG_KERN #kern 内核产生的日志
LOG_LOCAL0 -- LOG_LOCAL7 #local0-local7 自定义分类
LOG_LPR #lpr 打印服务日志
LOG_MAIL #mail 邮件服务日志
LOG_NEWS #news 网络新闻服务产生的日志
LOG_SYSLOG #syslog syslogd 服务自己的日志
LOG_USER #user 用户等级
LOG_UUCP #uucp uucp子系统的日志信息
* #通配符,代表所有分类
Priority: 优先级别,从高到低排序
rsyslog 在记录日志的时候,将各种产生日志的事件和行为进行了优先级的排序,使用者可以根据不同环 境(测试/生产)和需求,设置不同的级别来记录日志,这样可以保证,记录下来的内容都是是我们想要 的。
#syslog 内置优先级分类,从高到低,如果在记录日志时,设置了优先级,则只会记录设定的优先级和高于设定优先级的日志
LOG_EMERG #emerg/panic 紧急,致命错误
LOG_ALERT #alert 告警,当前状态必须立即进行纠正
LOG_CRIT #crit 关键状态的警告,例如 硬件故障
LOG_ERR #err/error 其它错误
LOG_WARNING #warning/warn 警告级别的信息
LOG_NOTICE #notice 通知级别的信息
LOG_INFO #info 通告级别的信息
LOG_DEBUG #debug 调试程序时的信息
* #所有级别的日志
none #不需要任何日志#panic,error,warn在新版中被弃,不建议使用
rsyslog 服务组成
#查看所有 rsyslog 包中的文件
[root@ubuntu ~]# dpkg -L rsyslog
/usr/sbin/rsyslogd #主程序
/lib/systemd/system/rsyslog.service #服务脚本
/etc/rsyslog.conf #主配置文件
/etc/rsyslog.d/*.conf #配置文件目录中的配置文件
/usr/lib/x86_64-linux-gnu/rsyslog/*.so #库文件#查看syslogd程序打开的文件
lsof -c rsyslogd
rsyslog 配置文件
[root@ubuntu ~]# ls /etc/rsyslog.conf
/etc/rsyslog.conf[root@ubuntu ~]# ls /etc/rsyslog.d/
20-ufw.conf 21-cloudinit.conf 50-default.conf#在主配置文件中,将配置分为三个部份,分别是模块(MODULES),全局配置(GLOBAL DIRECTIVES), 日志记录规则配置(RULES)
[root@ubuntu ~]# cat /etc/rsyslog.conf# ubuntu 系统中,默认 rule 规则是单独放在一个文件中的
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
#################
#### MODULES ####
#################
#rsyslog 在安装是有很多支持模块,但默认不是所有模块都开启,如果有需要,写在此处即可
module(load="imuxsock")
#module(load="immark")
#UDP模块,默认没有启用
#module(load="imudp")
#input(type="imudp" port="514")
#TCP 模块,默认没有启用
#module(load="imtcp")
#input(type="imtcp" port="514")
#内核日志需要的模块
module(load="imklog" permitnonkernelfacility="on")###########################
#### GLOBAL DIRECTIVES ####
###########################
#默认日志模板
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
#默认开启重复过滤
$RepeatedMsgReduction on
#创建日志文件的默认权限和属主属组
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
#工作目录,默认目录为空
$WorkDirectory /var/spool/rsyslog
#独立配置文件引用目录
$IncludeConfig /etc/rsyslog.d/*.conf
rule 配置规则
每一行 rule 由两列组成,分别是选择器和处理动作,选择器将过滤后的日志交由处理动作处理;
选择器可以同时有多个,用分号分隔,处理动作也可以同时有多个,用 & 分隔,处理动作中可以指定模 板,不同的模板会生成不同的日志内容,模板可以自定义。
选择器有以下几种定义方式:
-
用分类和优先级来过滤,同一条 rule 中,分类和优先级都可以有多个,用逗号分隔
-
基于日志内容中的指定字段来过滤
-
基于表达式构建脚本来过滤
处理动作有以下几种:
-
输出到日志文件或某个特定设备
-
保存到数据库
-
发送给指定用户,该用户必须己登录,可以同时指定多个用户,用逗号分隔
-
传送到远程主机
-
通过管道传送给其它命令
-
丢弃日志,不处理
#selector-分类和优先级
facility.priority[;facility.priority;...] action#facility# * 所有 facility#priority# * 所有 priority
# none 没有任何 priority,即不记录
# priority 具体的 priority,处理指定级别和指定级别以上的所有级别日志
# =priority 仅处理指定级别日志
# !priority 排除指定的 priority,这种写法不能单独使用#selector-基于日志内容指定字段过滤#字段,比较表达式,要比较的值
:property, [!]compare-operation, "value" action#所有可用 property
https://www.rsyslog.com/doc/master/configuration/properties.html#比较表达式
#contains 字段是否包含 value 的内容
#contains_i 字段是否包含 value 的内容,不区分大小写
#isequal 字段的内容是否与 value 相等
#startswith 是否以 value 开头
#startswith_i 是否以 value 开头,不区分大小写
#regex 基本正则
#ereregex 扩展正则
#isempty 是否为空,不需要后面的 value#selector-基于RainerScript设置更复杂的日志过滤
https://www.rsyslog.com/doc/v8-stable/rainerscript/index.html#action-输出到日志文件或设备
# /path/file 将日志内容写到指定文件
# -/path/file 将日志内容写到指定文件,异步写入
# /dev/null 将日志内容输出到指定设备#action-保存到数据库,保存到数据库要开启相应模块
module (load="ommysql")
*.* action(type="ommysql" server="10.0.0.210" db="rsyslog" uid="rsysloger"pwd="123456")#action-发送给指定用户
# root 将日志内容发送给用户 root
# root,tom 将日志内容发送给用户 root 和 tom
# * 将日志内容发送给所有己登录用户#action-发送到远程主机# @192.168.2.123 使用 UDP 协议发送到远程主机,默认端口514
# @@log.magedu.com:256 使用 TCP 协议发送到远程主机 256 端口,默认端口514
# @(z6)[fe80::20c:29ff:fe7e:ce82] 使用 UDP 协议发送到远程主机(IPV6地址),启用zlib压缩,压缩级别为6#action-通过管道传送给其它命令,管道必须有名管道,要事先创建,此功能在 rsyslog8 版本后才支持
#action-不处理
# stop 不处理,丢弃
#ubuntu 系统中默认 rule 配置
root@ubuntu:~# cat /etc/rsyslog.d/50-default.confauth,authpriv.* /var/log/auth.log #登录验证相关的日志记录在auth.log 中
*.*;auth,authpriv.none -/var/log/syslog #除了登录校验之外的日志,都记录在 syslog 中,异步写
#cron.* /var/log/cron.log
#daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log #内核所有日志都记录在kern.log 中,异步写
#lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log #邮件相关日志记录在 mail.log 中,异步写
#user.* -/var/log/user.log#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info -/var/log/mail.info
#mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err #邮件服务 err 及以上的日志记录在 mail.err 中 #
# Some "catch-all" log files.
#
#*.=debug;\
# auth,authpriv.none;\
# news.none;mail.none -/var/log/debug
#*.=info;*.=notice;*.=warn;\
# auth,authpriv.none;\
# cron,daemon.none;\
# mail,news.none -/var/log/messages#
# Emergencies are sent to everybody logged in.
#
*.emerg :omusrmsg:* #所有致命错误信息,调用omusrmsg 模块发给所有登录用户#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
# news.=crit;news.=err;news.=notice;\
# *.=debug;*.=info;\
# *.=notice;*.=warn /dev/tty8
rsyslog 日志内容和模板
Ubuntu 中日志内容
[root@ubuntu22:~]# tail /var/log/syslog
Sep 6 13:22:22 ubuntu22 systemd[1134]: Listening on GnuPG cryptographic agent and passphrase cache.
Sep 6 13:22:22 ubuntu22 systemd[1134]: Listening on debconf communication socket.
Sep 6 13:22:22 ubuntu22 systemd[1134]: Listening on REST API socket for snapd user session agent.
...
Rocky 中日志内容
[root@Rocky-9 ~]# tail /var/log/messages
Sep 6 21:13:43 Rocky-9 chronyd[861]: Selected source 139.199.214.202 (2.rocky.pool.ntp.org)
Sep 6 21:13:43 Rocky-9 chronyd[861]: System clock TAI offset set to 37 seconds
Sep 6 21:16:30 Rocky-9 systemd[1]: packagekit.service: Deactivated successfully.
...
[root@Rocky-9 ~]# tail /var/log/secure
Sep 6 21:11:19 Rocky-9 polkitd[830]: Finished loading, compiling and executing 12 rules
Sep 6 21:11:19 Rocky-9 polkitd[830]: Acquired the name org.freedesktop.PolicyKit1 on the system bus
Sep 6 21:11:20 Rocky-9 sshd[1040]: Server listening on 0.0.0.0 port 22.
Sep 6 21:11:20 Rocky-9 sshd[1040]: Server listening on :: port 22.
...
日志内容由 template 决定,如果没有显式指定,默认使用 RSYSLOG_TraditionalFileFormat,其具体 内容如下:
template(name="RSYSLOG_TraditionalFileFormat" type="string"string="%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1stsp%%msg:::drop-last-lf%\n")
rsyslog 中有13个内置的模板,我们可以在配置文件中直接使用,其名称如下,具体定义的内容需要查 询相关文档
RSYSLOG_TraditionalFileFormat
RSYSLOG_FileFormat
RSYSLOG_TraditionalForwardFormat
RSYSLOG_SysklogdFileFormat
RSYSLOG_ForwardFormat
RSYSLOG_SyslogProtocol23Format
RSYSLOG_DebugFormat
RSYSLOG_WallFmt
RSYSLOG_StdUsrMsgFmt
RSYSLOG_StdDBFmt
RSYSLOG_StdPgSQLFmt
RSYSLOG_spoofadr
RSYSLOG_StdJSONFmt
除了使用内置模板外,我们还可以自定义模板。
自定义模板可以直接写在配置文件中
生成的日志内容模板决定,而模板是由 rsyslog 中的相关属性组成,这些属性在生成日志内容时会被替 换成具体内容。所谓属性是指 rsyslog 中的一些特殊关键字,在模板语法中,使用 %属性名% 来表示一 个字段。
常见日志及相关工具
Rocky 中常见日志说明
[root@rocky ~]# cat /etc/rsyslog.conf | grep -Ev "^#|^$"*.info;mail.none;authpriv.none;cron.none /var/log/messages #除了mail,authpriv,cron 之外都记录
authpriv.* /var/log/secure #安全认证相关日志
mail.* -/var/log/maillog #邮件服务相关日志
cron.* /var/log/cron #定时任务相关日志
*.emerg :omusrmsg:* #所有致命错误信息,调用omusrmsg发给所有登录用户
uucp,news.crit /var/log/spooler #uucp,新闻相关日志
local7.* /var/log/boot.log #操作系统启动流程日志
ubuntu 中常见日志说明
[root@ubuntu ~]# cat /etc/rsyslog.d/*conf | grep -Ev "^#|^$"
:msg,contains,"[UFW " /var/log/ufw.log #ufw 服务日志
:syslogtag, isequal, "[CLOUDINIT]" /var/log/cloud-init.log #cloud-init 服务日志
& stop #其它不处理
auth,authpriv.* /var/log/auth.log#auth,authpriv 的日志
*.*;auth,authpriv.none -/var/log/syslog #除了auth,authpriv之外的日志
kern.* -/var/log/kern.log #内核产生的日志
mail.* -/var/log/mail.log #邮件服务日志
mail.err /var/log/mail.err #邮件服务err(含)以上日志
*.emerg :omusrmsg:* #所有致命错误信息,调用omusrmsg发给所有登录用户
btmp,lastlog,wtmp
除了在 rsyslog 中定义的日志之外,系统中默认还有 btmp, lastlog, wtmp 三个日志文件,这三个文件都 是非文本格式,无法直接打开
日志文件 | 相关指令 | 备注 |
---|---|---|
/var/log/btmp | lastb | 当前系统上,用户的失败尝试登录相关的日志 ( bad logins ),二 进制格式 |
/var/log/lastlog | lastlog | 每一个用户最近一次的登录信息,二进制格式 |
/var/log/wtmp | last | 当前系统上,用户正常登录系统的相关日志信息 ( who was logged in ),二进制格式 |
#在 rocky 中查看
[root@Rocky-9 ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw-rw----. 1 root utmp 0 Sep 2 19:11 /var/log/btmp
-rw-rw-r--. 1 root utmp 292292 Sep 6 21:12 /var/log/lastlog
-rw-rw-r--. 1 root utmp 67584 Sep 6 21:12 /var/log/wtmp
[root@Rocky-9 ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp: empty
/var/log/lastlog: data
/var/log/wtmp: data#在 ubuntu 中查看
[root@ubuntu24 ~]# ll /var/log/{btmp,lastlog,wtmp}
-rw-rw---- 1 root utmp 0 Sep 2 09:01 /var/log/btmp
-rw-rw-r-- 1 root utmp 292292 Sep 6 21:22 /var/log/lastlog
-rw-rw-r-- 1 root utmp 85632 Sep 6 21:22 /var/log/wtmp
[root@ubuntu24 ~]# file /var/log/{btmp,lastlog,wtmp}
/var/log/btmp: empty
/var/log/lastlog: data
/var/log/wtmp: data
dmesg 命令
dmesg 命令用来查看主机硬件相关日志
logger 命令
logger 命令可以手动生成相关日志
logger [options] [<message>]
#常用选项
-p|--priority #指定优先级
-f|--file #从文件中读取日志内容
-t|--tag #指定日志tag
-n|--server #指定远程主机IP或主机名
-P|--port #指定远程主机端口
-T|--tcp #指定使用TCP协议传输
-d|--udp #指定使用UDP协议传输#示例
#无选项
[root@ubuntu24 ~]# logger "hello world"
[root@ubuntu24 ~]# tail -n 1 /var/log/syslog
2024-09-06T21:35:40.001750+08:00 ubuntu24 root: hello world
在本机自定义服务日志
#sshd服务日志默认是归属于 AUTH 分类,默认级别是 INFO
[root@ubuntu ~]# cat /etc/ssh/sshd_config | grep -i log
# Logging
#SyslogFacility AUTH
#LogLevel INFO#根据配置,此日志记录在 /var/log/auth.log 中
[root@ubuntu ~]# cat /etc/rsyslog.d/50-default.conf | grep "^auth"
auth,authpriv.* /var/log/auth.log#重启服务
[root@ubuntu ~]# systemctl restart sshd
#查看日志,能看到相关内容
[root@ubuntu ~]# tail -n 3 /var/log/auth.log
Jun 28 20:00:35 ubuntu2204 sshd[920]: Received signal 15; terminating.
Jun 28 20:00:35 ubuntu2204 sshd[3431]: Server listening on 0.0.0.0 port 22.
Jun 28 20:00:35 ubuntu2204 sshd[3431]: Server listening on :: port 22.#修改 sshd 服务日志的配置项,分类改到 LOCAL6,级别不改
[root@ubuntu ~]# cat /etc/ssh/sshd_config | grep -i log
# Logging
#SyslogFacility AUTH
#LogLevel INFO
SyslogFacility LOCAL6#新增配置文件,local6 分类的日志都写到 sshd.log 文件中
[root@ubuntu ~]# cat /etc/rsyslog.d/sshd.conf
local6.* /var/log/sshd.log#当前还没有日志文件
[root@ubuntu ~]# ll /var/log/sshd.log
ls: cannot access '/var/log/sshd.log': No such file or directory#重启服务
[root@ubuntu ~]# systemctl restart rsyslog
[root@ubuntu ~]# systemctl restart sshd[root@ubuntu ~]# ll /var/log/sshd.log
-rw-r----- 1 syslog adm 139 Jun 28 20:03 /var/log/sshd.log#测试
[root@ubuntu ~]# ssh 127.1
root@127.0.0.1's password:#查看日志
[root@ubuntu ~]# tail /var/log/sshd.log
Jun 28 20:04:02 ubuntu sshd[3561]: Disconnected from user root 127.0.0.1 port
52866
Jun 28 20:04:07 ubuntu sshd[3655]: Accepted password for root from 127.0.0.1
port 38968 ssh2
Jun 28 20:04:08 ubuntu sshd[3655]: Received disconnect from 127.0.0.1 port
38968:11: disconnected by user
Jun 28 20:04:08 ubuntu sshd[3655]: Disconnected from user root 127.0.0.1 port
38968
Jun 28 20:04:23 ubuntu sshd[3714]: Connection closed by authenticating user root
127.0.0.1 port 54338 [preauth]#测试
[root@ubuntu ~]# logger -p local6.info "hello sshd"
#查看日志
[root@ubuntu ~]# tail -1 /var/log/sshd.log
Jun 28 20:26:53 ubuntu root: hello sshd
使用网络转发日志
可以使用 rsyslog 服务中的远程转发功能,通过 TCP 或 UDP 协议将当前主机的日志转发到远程日志服 务器上,进行集中存储,方便统一管理。
主机IP | 操作系统 | 角色 |
---|---|---|
10.0.0.157 | ubuntu 24 | log-server |
10.0.0.158 | rocky9 | client-1 |
10.0.0.151 | ubuntu22 | client-2 |
配置 server log 主机,开启 TCP, UDP 相关功能
#启用相关模块, 去掉 UDP,TCP 模块的注释
[root@ubuntu24 ~]# vim /etc/rsyslog.conf
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")#重启服务
[root@ubuntu24 ~]# systemctl restart rsyslog.service
[root@ubuntu24 ~]# ss -tunlp | grep 514
udp UNCONN 0 0 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=2058,fd=6))
udp UNCONN 0 0 [::]:514 [::]:* users:(("rsyslogd",pid=2058,fd=7))
tcp LISTEN 0 25 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=2058,fd=8))
tcp LISTEN 0 25 [::]:514 [::]:* users:(("rsyslogd",pid=2058,fd=9))
配置 ubuntu22 主机日志远程转发
#配置远程转发,转发到 10.0.0.157 的 udp 协议514端口,默认514 可以省略
[root@ubuntu22:~]# vim /etc/rsyslog.d/50-default.conf
#配置远程转发,转发到服务器514端口
*.info @10.0.0.157:514
#本机查看
[root@ubuntu22:~]# logger "hello world"
[root@ubuntu22:~]# tail -1 /var/log/syslog
Sep 6 13:55:25 ubuntu22 root: hello world#服务端查看
[root@ubuntu24 ~]# tail -1 /var/log/syslog
2024-09-06T13:55:25+08:00 ubuntu22 root: hello world
配置 rocky9主机日志远程转发
#配置远程转发,转发到 10.0.0.157 的 udp 协议514端口,默认514 可以省略
[root@Rocky-9 ~]# vim /etc/rsyslog.conf
#配置远程转发,转发到服务器514端口
*.info @10.0.0.157:514
#本机查看
[root@Rocky-9 ~]# tail -1 /var/log/messages
Sep 7 09:19:17 Rocky-9 root[2424]: hello world#服务端查看
[root@ubuntu24 ~]# tail -1 /var/log/syslog
2024-09-07T09:19:17+08:00 Rocky-9 root[2424]: hello world
使用MySQL 数据库转储日志
将日志转储到 MySQL 数据库中
在添加一台mysql-server 主机IP:10.0.0.161
配置 server log 主机
#在 log-server 上安装 rsyslog 的 mysql 包
[root@ubuntu24 ~]# apt install rsyslog-mysql
#查看包文件
[root@ubuntu24 ~]# dpkg -L rsyslog-mysql
...
/usr/lib/x86_64-linux-gnu/rsyslog/ommysql.so #库文件
/usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql #mysql 数据表文件
/usr/share/rsyslog-mysql/rsyslog-mysql.conf.template #rsyslog 配置文件模板
...#将MySQL表文件发送到mysql-server服务器上建表
[root@ubuntu24 install]# scp /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql 10.0.0.161:/root/#等待mysql-server 服务器上配置好相关配置(创建数据库用户,修改配置文件,开放监听IP)
#在 log-server 服务器上配置 mysql 转发
[root@ubuntu24 ~]# vim /etc/rsyslog.d/mysql.conf
#如果没有上述文件执行cp /usr/share/rsyslog-mysql/rsyslog-mysql.conf.template /etc/rsyslog.d/mysql.conf#重启服务
[root@ubuntu24 install]# systemctl restart rsyslog.service
配置mysql-server 服务器(此服务器为克隆ubuntu24所以主机名相同)
#安装数据库
[root@ubuntu24 ~]# apt install mysql-server
#查看3306端口
[root@ubuntu24 ~]# ss -tnlp
LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=3310,fd=23))
#创建数据库
[root@ubuntu24 mysql.conf.d]# mysql
mysql> create database rsyslog;#导入SQL文件建表
mysql> use rsyslog;
mysql> source /root/mysql;#查看表
mysql> show tables-> ;
+------------------------+
| Tables_in_rsyslog |
+------------------------+
| SystemEvents |
| SystemEventsProperties |
+------------------------+
2 rows in set (0.00 sec)#两张表都为空
mysql> select count(*) from SystemEvents;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)#创建用户并授权
mysql> create user 'rsysloger'@'10.0.0.%' identified by '123456';
mysql> grant all on rsysloger.* to 'rsysloger'@'10.0.0.%';
mysql> flush privileges;#修改配置文件注释两行,不能只监听127.1
[root@ubuntu24 mysql.conf.d]# vim /etc/mysql/mysql.conf.d/mysqld.cnf
...
#bind-address = 127.0.0.1
#mysqlx-bind-address = 127.0.0.1
...#再查看3306端口
LISTEN 0 151 *:3306 *:* users:(("mysqld",pid=3632,fd=23))#重启服务
[root@ubuntu24 mysql.conf.d]# systemctl restart mysql.service#重新进入到MySQL中查看
[root@ubuntu24 mysql.conf.d]# mysql
mysql> use rsyslog;
mysql>select count(*) from SystemEvents;
+----------+
| count(*) |
+----------+
| 75 |
+----------+
1 row in set (0.01 sec)
服务日志管理工具 journalctl
在 systemd 为 1号进程的系统版本中,systemd 提供了一个集中的方式来处理所有来自进程,应用程序 等的操作系统日志,所有这些日志事件都由 systemd 的 journald 守护进程来处理。journald 守护进程 收集所有来自 Linux 操作系统的各种日志,并将其作为二进制数据存储在文件中。
以二进制数据集中记录事件、系统问题的好处有很多。例如,由于系统日志是以二进制而不是文本形式 存储的,你可以以文本、JSON 对象等多种方式进行转译,以满足各种需求。另外,由于日志是按顺序存 储的,通过对日志的日期/时间操作,超级容易追踪到单个事件。
#配置文件
[root@ubuntu24 ~]# cat /etc/systemd/journald.conf
#日志数据存储目录,非文本文件,无法用文本工具打开
[root@ubuntu24 ~]# tree /var/log/journal/
/var/log/journal/
└── ef062b5ca3e947e38a03f0477da3ced5
├── system@00061fb2a837443f-1a959f1e7613ccef.journal~├── system@00061fd6afc350ba-a58a7dce4cdb1dc2.journal~├── system@0006203fbeefdf75-8a3e46d9b778480b.journal~├── system@00062094d731b92d-7ca4f1336fdb6d6e.journal~├── system@00062149912d8e25-854281d11074fd6e.journal~├── system@0006217326e5d2e7-404d9c9781881e81.journal~├── system@0d1266e161c946ac9be424f9b40d474b-00000000000036b9-00061fcb26f31429.journal├── system@0d7a0408f84841d7b8eba3dcafa48f23-0000000000004868-00061fd6afc0aa2f.journal├── system@0d7a0408f84841d7b8eba3dcafa48f23-0000000000005061-00061fd6b1b39a24.journal├── system@2d186199ca944069ac41e9a9ecf69aa9-0000000000013bce-0006212...journalctl格式 journalctl [OPTIONS...] [MATCHES...]#常用选项
--system #显示系统服务和内核相关日志
--user #显示来自当前用户的服务日志
-M|--machine=CONTAINER #显示本地容器中的日志
-S|--since=DATE #显示从指定时间之后的日志,YYYY-MM-DD HH:MM:SS|yesterday|today|tomorrow|now
-U|--until=DATE #显示从指定时间之前的日志
-c|--cursor=CURSOR #从指定 cursor 开始显示
--after-cursor=CURSOR #从指定 cursor 之后开始显示
--show-cursor #在最后一条日志之后显示 cursor 值
-b|--boot[=ID] #查看详细启动日志
--list-boots #列出系统启动日志
-k|--dmesg #仅显示内核日志,包含了 -b 及 "_TRANSPORT=kernel" 选项
-u|--unit=UNIT #根据单元查看日志
--user-unit=UNIT #仅显示属于特定用户会话单元的日志,相当于同时添加了_SYSTEMD_USER_UNIT= _UID= 两个条件
-p|--priority=RANGE #跟据日志等级查看 0 emerg 1 alert 2 crit 3 err 4 warning 5 notice # 6 info 7 debug--facility=FACILITY... #根据分类查看
-g|--grep=PATTERN #根据正则表达式过滤
--case-sensitive[=BOOL] #模式匹配时是否区分大小写
-e|--pager-end #直接定位到最后
-f|--follow #实时查看最新日志
-n|--lines[=INTEGER] #指定行数,从最近的日志开始算,后面不跟数字,默认10行
--no-tail #显示所有的行,配合 -f 使用
-r|--reverse #反转输出,最新的在最上面显示
-o|--output=STRING #指定输出格式,默认 short
--output-fields=LIST #仅显示指定字段,在 -o 选项为verbose/export/json/json-pretty/json-sse/json-seq
#时有效,__CURSOR,__REALTIME_TIMESTAMP,__MONOTONIC_TIMESTAMP,_BOOT_ID 字段总是会显示--utc #使用 utc 时区显示时间
-x|--catalog #在日志的输出中增加一些解释性的短文本,以帮助进一步说明日志的含义,并不是所有都有
--no-full #如果内容超长,则以省略号代替
-a|--all #完整显示所有字段内容,即使其中包含不可打印字符或内容超长-q|--quiet #安静模式,不显示任何告警信息
--no-pager #不分页,一次显示全部
--no-hostname #不显示来源于本机的日志消息的主机名字段。 此选项仅对short 输出格式有效
-m|--merge #混合模式包括远程日志在内的所有可见日志
-D|--directory=PATH #显示来自于特定目录中的日志,
--root=ROOT #指定日志服务的根目录,指定后服务将以此目录为根目录 -h|--help #显示帮助
--version #显示版本信息
-N|--fields #列出所有可用字段
-F|--field=FIELD #去重显示指定字段
--disk-usage #显示日志占用了多少磁盘空间
--vacuum-size=BYTES #指定日志能占用的最大空间,K/M/G/T
--vacuum-files=INT #指定该服务最大日志文件数量
--vacuum-time=TIME #用于清除指定时间之前的日志s/m/h/days/weeks/months/years
--verify #检查日志文件的内在一致性,要求日志有FSS属性
--sync #将守户进程中没落盘的数据进行落盘
--flush #将 /run/log/journal/ 中的日志数据转储到/var/log/journal/ 中,此操作会阻塞
--rotate #滚动日志文件,此操作会阻塞
--header #显示日志元数据
--list-catalog #简略显示日志分类信息
--dump-catalog #详细显示日志分类信息
--update-catalog #更新日志分类索引二进制文件#输出格式说明
short #默认值,每行一条日志
short-precise #时间精确到微秒显示
short-iso #以ISO 8601格式显示时间
short-iso-precise #将时间戳字段的零值从内核启动时开始计算
short-full #与 short 内容相同,但时间显示更详细
short-monotonic #将时间戳字段的零值从内核启动时开始计算
short-unix #将时间戳字段显示为从"UNIX时间原点"(1970-1-1 00:00:00UTC)以来的秒数。 精确到微秒级别
verbose #以结构化的格式显示每条日志的所有字段
export #将日志序列化为二进制字节流(大部分依然是文本) 以适用于备份与网络传输
json #将日志项按照JSON数据结构格式化, 每条日志一行
json-pretty #将日志项按照JSON数据结构格式化, 但是每个字段一行, 以便于人类阅读
json-sse #将日志项按照JSON数据结构格式化,每条日志一行,但是用大括号包围
json-seq #将日志项按照JSON数据结构格式化,每条日志前面加上ASCII记录分隔符,后面加上ASCII换行符
cat #仅显示日志的实际内容, 而不显示与此日志相关的任何元数据(包括时间戳)
with-unit #类似于 short-full,前缀以unit 名来显示,而不是syslog标识符#示例
#查看启动信息
#第一列是每次启动序号
#第二列是启动ID,32位
#第三列是启动后的系统运行时长
#最后一条是最新的数据
[root@ubuntu24 ~]# journalctl --list-boots
IDX BOOT ID FIRST ENTRY LAST ENTRY
-32 9247d7ea4552436abd7faf288631af92 Thu 2024-08-15 09:57:01 CST Thu 2024-08-15 10:09:48 CST
-31 3d0d379374744cada4fd267813a9a140 Thu 2024-08-15 10:10:59 CST Thu 2024-08-15 10:14:13 CST
-30 61dfaef522da45e7a1e188a4b1eac684 Thu 2024-08-15 10:14:44 CST Thu 2024-08-15 10:21:44 CST
-29 7700fa638c204957976422b46eaaeec0 Thu 2024-08-15 10:56:10 CST Thu 2024-08-15 12:17:01 CST
-28 151b6d4f445644cc84d4a144fd0281ad Thu 2024-08-15 14:07:26 CST Thu 2024-08-15 21:02:22 CST
...##查看本次启动日志
[root@ubuntu24 ~]# journalctl -b 0#查看内核日志
[root@ubuntu24 ~]# journalctl -k#根据PID查看
[root@ubuntu24 ~]# journalctl _PID=1
Logrotate 日志转储
**Logrotate 介绍**
在 Linux 系统中,能够帮助使用者定位问题的有效手段之一就是查日志。
如果一个服务或一个程序的日志,一直只写一个文件,则会导致该日志文件越来越大,无论是查看还是 搜索内容,备份等,都会特别不方便,而且如果服务器数量较多,日志文件大小增长较快,也会很容易 触发告警。
为了解决这种情况,我们可以使用日志转储服务,对服务日志进行分割,按照一定的规则将日志保存在 不同的文件中,这样更便于管理和归档。
当前服务器上的日志转储
[root@ubuntu24 ~]# ll /var/log/dmesg*
-rw-r----- 1 root adm 140133 Sep 7 08:56 /var/log/dmesg
-rw-r----- 1 root adm 140956 Sep 6 21:12 /var/log/dmesg.0
-rw-r----- 1 root adm 27251 Sep 6 10:31 /var/log/dmesg.1.gz
-rw-r----- 1 root adm 27464 Sep 5 09:36 /var/log/dmesg.2.gz
-rw-r----- 1 root adm 26989 Sep 4 19:35 /var/log/dmesg.3.gz
-rw-r----- 1 root adm 27265 Sep 3 10:54 /var/log/dmesg.4.gzs
logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转 储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执 行。
相关文件
/etc/cron.daily/logrotate #定时任务脚本,放在 cron.daily 目录中,默认系统会每天执行一次
/etc/logrotate.conf #主配置文件,定义日志转储策略
/etc/logrotate.d/ #配置文件目录,定义日志转储策略
/usr/sbin/logrotate #主程序
/var/lib/logrotate/status #logrotate服务的日志文件
工作原理:系统计划任务每天执行一次脚本文件,在脚本中再执行 /usr/sbin/logrotate /etc/logrotate.conf ,即调用 logrotate 程序再配合定义好的转储规则对日志文件进行转储。
Logrotate 配置
在配置文件中定义转储规则,配置文件中的主要配置项
#主配置文件
[root@ubuntu24 ~]# cat /etc/logrotate.conf
# see "man logrotate" for details# global options do not affect preceding include directives# rotate log files weekly
weekly #默认每周一次转储
# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm #默认使用 adm 组
# keep 4 weeks worth of backlogs
rotate 4 #默认保留最近4周的文件(4个文件)
# create new (empty) log files after rotating old ones
create #转储完成后生成新的空文件
# use date as a suffix of the rotated file
#dateext #默认不使用日期后缀
# uncomment this if you want your log files compressed
#compress #默认不启用文件压缩
# packages drop log rotation information into this directory
include /etc/logrotate.d #包含的子目录
# system-specific logs may also be configured here.
#每个服务单独的配置文件,如果在单独配置文件中没有定义的配置项,则使用主配置文件中的配置项或默认配置
[root@ubuntu24 ~]# ls /etc/logrotate.d/
alternatives apport apt bootlog btmp chrony cloud-init dbconfig-common dpkg ppp rsyslog ubuntu-pro-client ufw unattended-upgrades wtmp[root@ubuntu24 ~]# cat /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/cron.log
{ #上述所有日志文件都适用于此转储规则rotate 4 #保留最近4个文件,加上当前使用的,一个5个weekly #每周转储missingok #如果要转储的日志文件不存在,不提示错误,继续下一个notifempty #如果是空文件,不转储compress #启用gzip压缩转储后的日志文件delaycompress #和 compress 一起使用时,转储的日志文件到下一次转储时才压缩sharedscripts #运行脚本,分别是转储前和转储后脚本postrotate #转储后脚本/usr/lib/rsyslog/rsyslog-rotateendscript
}#常用配置项
compress #通过gzip压缩转储以后的日志
nocompress #不压缩
copytruncate #用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate #用于还在打开中的日志文件,把当前日志备份并不截断
create mode owner group #转储文件,使用指定的权限,所有者,所属组创建新的日志文件
nocreate #不建立新的日志文件
su user group #指定转储的用户和组,如果日志文件的父目录属组或other 具有写权限,则要指定此处
delaycompress #和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress #覆盖 delaycompress 选项,转储同时压缩
errors address #转储时的错误信息发送到指定的Email 地址
ifempty #即使是空文件也转储,此为默认选项
notifempty #如果是空文件的话,不转储
mail address #把转储的日志文件发送到指定的E-mail 地址
nomail #转储时不发送日志文件
olddir directory #转储后的日志文件放入指定目录,必须和当前日志文件在同一个文件系统
noolddir #转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript #在转储以前需要执行的命令,这两个关键字必须单独成行,日志文件路径是第一个参数
postrotate/endscript #在转储以后需要执行的命令,这两个关键字必须单独成行,日志文件路径是第一个参数
daily #指定转储周期为每天
weekly #指定转储周期为每周
monthly #指定转储周期为每月
rotate count #指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5个备份
tabooext [+] list #让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig,.rpmsave, v, 和 ~
size size #当日志文件到达指定的大小时才转储,默认单位是bytes,也可以指明KB或MB
sharedscripts #对每个转储日志运行prerotate和postrotate脚
nosharedscripts #针对每一个转储的日志文件,都执行一次prerotate 和postrotate脚本,此为默认值
missingok #如果日志不存在,不提示错误,继续处理下一个
nomissingok #如果日志不存在,提示错误,此为默认值
Logrotate 自定义规则实现
logrotate [OPTION...] <configfile>
#常用选项
-?|--help #显示帮助信息
-d|--debug #不执行任何操作,仅显示错误信息,类似于测试
-f|--force #强制执行
-m|--mail=command #指定执行邮件发送的命令,默认 /usr/bin/mail
-s|--state=statefile #指定服务日志文件,默认 /var/lib/logrotate/status
-v|--verbose #显示详细信息
-l|--log=logfile #指定详细信息日志,加上此选项,会将详细信息写到指定文件
--version #显示版本信息
--skip-state-lock #不给 statefile 文件加锁
示例
#创建测试日志文件
[root@log-server ~]# dd if=/dev/zero of=/var/log/test1.log bs=2M count=1
[root@log-server ~]# dd if=/dev/zero of=/var/log/test2.log bs=2M count=1[root@log-server ~]# ll -h /var/log/test*
-rw-r--r-- 1 root root 2.0M Jul 4 17:51 /var/log/test1.log
-rw-r--r-- 1 root root 2.0M Jul 4 17:52 /var/log/test2.log#定义转储规则
[root@log-server ~]# cat /etc/logrotate.d/test{1,2}
/var/log/test1.log {dailyrotate 5su root rootcompressdelaycompressmissingoksize 1Mnotifemptycreate 0640 syslog admpostrotateecho `date +%F_%T` >> /tmp/test1.logendscript
}
/var/log/test2.log {dailyrotate 5su root rootdateextcompressdelaycompressmissingoksize 1Mnotifemptycreate 644 root rootpostrotateecho `date +%F_%T` >> /tmp/test2.logendscript
}#手动执行转储
[root@log-server ~]# logrotate /etc/logrotate.d/test1#查看日志,生成新的空文件,权限,属主属组都符合预设
[root@log-server ~]# ls -lh /var/log/test1*
-rw-r----- 1 syslog adm 0 Jul 5 22:58 /var/log/test1.log
-rw-r--r-- 1 root root 2.0M Jul 5 21:05 /var/log/test1.log.1#再次转储,先保证日志达到转储条件
[root@log-server ~]# dd if=/dev/zero of=/var/log/test1.log bs=3M count=1
[root@log-server ~]# logrotate /etc/logrotate.d/test1
[root@log-server ~]# ls -lh /var/log/test1*
-rw-r----- 1 syslog adm 0 Jul 5 23:16 /var/log/test1.log
-rw-r----- 1 syslog adm 3.0M Jul 5 23:03 /var/log/test1.log.1 #最新的转储
-rw-r--r-- 1 root root 2.1K Jul 5 21:05 /var/log/test1.log.2.gz #前一个被转储的日志被压缩#查看日志文件,转储成功后命令被执行
[root@log-server ~]# cat /tmp/test1.log
2023-08-05_22:58:11
2023-08-05_23:16:12#调用主配置文件进行转储,主配置文件中包含了 test1 test2 配置,所以都会被转储
[root@log-server ~]# logrotate /etc/logrotate.conf#test1 没有达到转储条件
[root@log-server ~]# ls -lh /var/log/test1*
-rw-r----- 1 syslog adm 0 Jul 5 23:16 /var/log/test1.log
-rw-r----- 1 syslog adm 3.0M Jul 5 23:03 /var/log/test1.log.1
-rw-r--r-- 1 root root 2.1K Jul 5 21:05 /var/log/test1.log.2.gz
#test2 达到条件,且有日期后缀
[root@log-server ~]# ls -lh /var/log/test2*
-rw-r--r-- 1 root root 0 Jul 5 23:26 /var/log/test2.log
-rw-r--r-- 1 root root 2.0M Jul 4 17:52 /var/log/test2.log-20230705
相关文章:

日志服务管理
系统日志管理 sysklogd 系统日志服务 在 CentOS5 以及之前的发行版中,其采用的 sysklogd 服务来记录和管理系统日志的。 sysklogd 服务有两个模块: klogd: 用于记录 linux kernel 相关的日志 syslogd:用于记录用户空间应用日志…...

ROS 工具箱系统要求
ROS 工具箱系统要求 要为 ROS 或 ROS 2 生成自定义消息,或从 MATLAB 或 Simulink 软件中部署 ROS 或 ROS 2 节点,您必须构建必要的 ROS 或 ROS 2 软件包。要构建这些软件包,您必须具备 Python 软件、CMake 软件以及适用于您的平台的 C 编译器…...

CSS解析:定位和层叠上下文
许多开发人员对定位的理解很粗略,如果不完全了解定位,就很容易给自己挖坑。有时候可能会把错误的元素放在其他元素前面,要解决这个问题却没有那么简单。 一般的布局方法是用各种操作来控制文档流的行为。定位则不同:它将元素彻底…...

无名管道与有名管道的区别(C语言)
目录 一、引言 二、无名管道(匿名管道) 1.概念 2.特点 3.使用方法 三、有名管道(命名管道) 1.概念 2.特点 3.使用方法 四、总结 本文将详细介绍在C语言中无名管道(匿名管道)与有名管道(命名…...

Vue+Nginx前端项目多种方式部署一文搞定(练习源码自取)
目录 介绍 本地项目部署 nginx部署 云端服务器部署 介绍 对于Vue项目而言,Nginx可以轻松地配置来处理SPA的路由问题,即对于所有未定义的路径请求返回index.html,这样前端路由机制就可以接管URL的处理。此外,Nginx支持反向代理设…...

MATLAB 中双引号 ““ 和单引号 ‘‘ 的区别详解
在 MATLAB 中,双引号 "" 和单引号 都可以用来表示字符串,但它们的作用和底层类型是不同的。理解它们之间的区别,对于正确使用字符串处理功能非常重要。本文将深入探讨 MATLAB 中 "" 和 的区别,以及在实际编…...

Linux概述、远程连接、常用命令
Linux介绍 Linux操作系统介绍 Linux操作系统的特点 开源免费安全稳定可移植性好 Linux可以安装在不同的设备上 高性能 Linux的使用领域 应用服务器数据库服务器网络服务器虚拟化云计算嵌入式领域个人PC移动手机 Linux文件系统和目录 /:根目录,唯一/h…...

闯关leetcode——1.Two Sum
大纲 题目地址内容 解题 题目 地址 https://leetcode.com/problems/two-sum/description/ 内容 Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target. You may assume that each input would hav…...

02 Shell Script注释和debug
Shell Script注释和debug 一、ShellScript注释 # 代表不解释不执行 语法:# # 创建myshell.sh文件 [rootlocalhost ~]# vi myshell.sh # 写入内容 #!/bin/bash# 打印hello world(正确) echo "hello world" echo "he…...

如何设计项目架构
设计项目架构是软件开发过程中的关键步骤之一,它涉及到如何组织系统的各个部分以及它们之间的交互方式。良好的架构设计能够提高系统的可维护性、扩展性和性能。以下是设计C项目架构的一些基本原则和步骤: 1. 明确需求 在设计任何系统之前,…...

OTG配置为USB盘之二
在前面一节中,描述了otg配置U盘时涉及到的知识点,本篇用统一的脚本完成。 目标 将3588开发板子配置为一个U盘。 配置文件和脚本 配置文件 说明: 1)USB_FUNCS是将开发板配置为什么类型的设备,例如u盘,配置um…...

如何使用 PHP 函数与其他 Web 服务交互?
在 PHP 中,我们可以使用 cURL 或者 file_get_contents 函数与其他 Web 服务进行交互。 使用 cURL 函数 cURL 是一个库,它允许你使用各种类型的协议来发送数据,并从服务器获取数据。 $curl curl_init(‘http://example.com/api’); curl_s…...

.NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
实现目标。点击图片上传头像 效果图 前端部分图片上传关键代码 <div class"avatar-wrap"><el-imagestyle"width: 154px; height: 154px":src"form.headPic":fit"fit"/></div><div class"upload-box"…...

机器学习如何用于音频分析?
机器学习如何用于音频分析? 一、说明 近十年来,机器学习越来越受欢迎。事实上,它被用于医疗保健、农业和制造业等众多行业。随着技术和计算能力的进步,机器学习有很多潜在的应用正在被创造出来。由于数据以多种格式大量可用&…...

适合程序员在周末阅读的历史书籍:理解人性和世界
一、《人类简史:从动物到上帝》 这本书提供了对人类历史和社会发展的深刻洞察,帮助读者理解人类过去、现在和可能的未来。 《人类简史:从动物到上帝》是以色列历史学家尤瓦尔赫拉利(Yuval Noah Harari)创作的一部极具影…...

探索Mem0:下一代人工智能与机器学习内存管理基础设施(二)Mem0+Ollama 部署运行
探索Mem0:下一代人工智能与机器学习内存管理基础设施(二) Mem 0(发音为“mem-zero”)通过智能记忆层增强AI助手和代理,实现个性化的AI交互。Mem 0会记住用户偏好,适应个人需求,并随着时间的推移不断改进,使其成为客户支持聊天机器人,AI助手和自治系统的理想选择。 …...

C++入门10——stack与queue的使用
目录 1.什么是stack? stack的使用 2.什么是queue? queue的使用 3.priority_queue 3.1 什么是priority_queue? 3.2 priority_queue的使用 1.什么是stack? 在官网中,对stack有这样的介绍: Stacks are a type o…...

詳細解析軟路由與代理爬蟲池-okeyproxy
什麼是軟路由? 軟路由,顧名思義,就是通過軟體實現的路由器功能。與傳統的硬體路由器不同,軟路由通常是基於PC或單板電腦(如樹莓派)運行的路由器軟體。 靈活性高:可以根據需求安裝各種插件和服…...

视频监控管理平台LntonAIServer视频智能分析噪声检测应用场景
在视频监控系统中,噪声问题常常影响到视频画面的清晰度和可用性。噪声可能由多种因素引起,包括但不限于低光环境、摄像机传感器灵敏度过高、编码压缩失真等。LntonAIServer通过引入噪声检测功能,旨在帮助用户及时发现并解决视频流中的噪声问题…...

技术分享-商城篇-用户中心-注销修改(二十三)
前言 上一篇文章技术分享-商城篇-用户中心(二十二)在构建高效、安全的商城用户中心时,确保用户账户的安全性与便捷性至关重要。本文将重点阐述三大核心功能——修改密码、协议授权及注销账户的业务逻辑、设计思路及注意事项,旨在…...

Linux-实用指令
目录 前言 指定运行级别 基本介绍 切换运行级别 指令类 帮助指令 man 获得帮助信息 help指令 文件目录类 pwd指令 ls指令 cd指令 mkdir命令 rmdir指令删除空目录 touch指令 cp指令 rm指令 mv指令 cat指令 more指令 less指令 echo指令 head指令 tail指令…...

【MySQL00】【 杂七杂八】
文章目录 一、前言二、MySQL 文件1. 参数文件2. 日志文件3. 套接字文件4. pid 文件5. 表结构定义文件6. InnoDB 存储引擎文件 二、BTree 索引排序三、InnoDB 关键特性1. 插入缓冲1.1 Insert Buffer 和 Change Buffer1.1 缓冲合并 2. 两次写2. 自适应哈希索引3. 异步IO4. 刷新邻…...

计算机网络 第2章 物理层
文章目录 通信基础基本概念信道的极限容量编码与调制常用的编码方法常用的调制方法 传输介质双绞线同轴电缆光纤以太网对有限传输介质的命名规则无线传输介质物理层接口的特性 物理层设备中继器集线器一些特性 物理层任务:实现相邻节点之间比特(0或1&…...

解决:Module build failed (from ./node_modules/sass-loader/dist/cjs.js)问题
一、问题 Module build failed (from ./node_modules/sass-loader/dist/cjs.js): Error: Cannot find module sass 二、解决方法 1.清除缓存 npm cache clean --force2.重构项目 npm install 3.更新(获取最新的)node-sass和sass-loader依赖包 npm …...

【 html+css 绚丽Loading 】 000041 三才移形三角
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕…...

ASP.NET Core 入门教学十六 防止常见的Web攻击
在ASP.NET Core中,防止常见的Web攻击是非常重要的,以确保应用程序的安全性。以下是一些常见的Web攻击类型及其防范措施: 1. 跨站脚本攻击(XSS) 跨站脚本攻击(XSS)是一种通过在网页中注入恶意脚…...

单刀直入@ComponentScan之 资源加载
欢迎大家入坑,所谓师傅领进坑爬出去靠个人,首先我要说的是这个是上一篇《单刀直入ComponentScan》的姊妹篇哈,接着把没聊透的事说明白,咱不是虎头蛇尾的人。 资源加载是啥意思 scan ,都认识吧,小学词汇连…...

SAPUI5基础知识25 - 聚合绑定(Aggregation Binding)
1. 背景 Aggregation Binding 是 SAPUI5 中的一种数据绑定方式,用于将数据模型中的集合(如数组)绑定到 UI 控件的聚合(如列表项、表格行等)。 常见的场景包括将一个数组绑定到 sap.m.List 的 items 聚合,…...

【Python 千题 —— 算法篇】寻找两个正序数组的中位数
Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在处理大规模数据时,我们经常需要对数据进行排序和分析。一个常见问题是如何高效地从两个正序数组中找出它们的中位数。…...

Autoware 定位之初始姿态输入(九)
0. 简介 这一讲按照《Autoware 技术代码解读(三)》梳理的顺序,我们来说一说Autoware中的初始化操作,这个软件包当中完成了ekf_localizer发送初始姿态的包。它接收来自GNSS/用户的粗略估计的初始姿态。将姿态传递给ndt_scan_match…...