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

Linux journalctl命令详解

文章目录

  • 1.介紹
  • 2.概念
  • 设置system time
  • 基本的日志查阅方法
    • 按时过滤日志(by Time)
    • 显示本次启动以来的日志(Current Boot)
    • 按Past Boots
    • 按时间窗口
    • 按感兴趣的消息筛选
      • 按unit
      • 按进程、用户、Group ID
      • 按组件路径
      • 显示内核消息
      • 按消息优先级
  • 修改Journal输出格式
    • 截断或扩展输出
    • 输出日志到标准输出
    • 输出格式
  • 主动进程监控
    • 显示最近的日志
    • Follow日志
  • Journal维护
    • 查找当前磁盘空间使用量
    • 删除旧的日志
    • 限制日志扩展

1.介紹

systemd
systemd 的一些最瞩目的优点是涉及进程和系统日志记录。 使用其他工具时,日志通常分散在整个系统中,由不同的守护程序和进程处理,并且当它们跨越多个应用程序时可能相当难以解释。 systemd 试图通过提供一个集中管理解决方案来记录所有内核和用户态进程来解决这些问题。 收集和管理这些日志的系统称为journal.
日志是通过journald守护进程实现的,它处理内核、initrd、服务等产生的所有消息

2.概念

systemd journal背后的推动力之一是集中管理日志,无论消息源自何处。 由于大部分启动过程和服务管理都是由 systemd 进程处理的,因此标准化日志收集和访问的方式是有意义的。 journal守护进程从所有可用来源收集数据,并将其以二进制格式存储,以便于动态操作。
通过使用单个工具与数据进行交互,管理员可以根据自己的需要动态显示日志数据。 或者按顺序组合来自两个相关服务的日志条目以调试通信问题。

以二进制格式存储log数据还意味着数据可以根据当前的需要以任意输出格式显示。 例如,对于日常日志管理,可能习惯于以标准syslog格式查看日志,但如果以后决定用图形方式显示服务中断情况,则可以将每个条目输出为 JSON 对象,以使其可供图表服务使用。 由于数据不是以纯文本形式写入磁盘,因此当需要不同的按需格式时无需转换。
systemd journal可以与现有的 syslog 实现一起使用,也可以替换 syslog 功能,具体取决于需求。 虽然 systemd journal将满足大多数管理员的日志记录需求,但它也可以补充现有的日志记录机制。 例如,可能有一个集中式 syslog 服务器,用于编译来自多个服务器的数据,但您也可能希望将来自单个系统上多个服务的日志与 systemd 日志交错。 可以通过组合这些技术来实现这两个目标。

设置system time

使用二进制日志进行日志记录的好处之一是能够随意查看 UTC 或本地时间的日志记录。 默认情况下,systemd 将按当地时间显示结果。
因此,在开始使用journal之前,我们将确保时区设置正确。 systemd 套件实际上附带了一个名为 timedatectl 的工具,可以帮助解决此问题。
First, see what timezones are available with the list-timezones option:
首先,通过 list-timezones 选项查看哪些时区可用:

timedatectl list-timezones

这将列出系统上可用的时区。 当找到与服务器位置匹配的时区时,可以使用 set-timezone 选项进行设置:

sudo timedatectl set-timezone zone

要确保计算机现在使用正确的时间,单独使用 timedatectl 命令,或与 status 选项一起使用。 显示将是相同的:

timedatectl status

Output
Local time: Fri 2024-02-09 14:44:30 EDT
Universal time: Fri 2024-02-09 18:44:30 UTC
RTC time: Fri 2024-02-09 18:44:31
Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

第一行应显示正确的时间。

基本的日志查阅方法

要查看journald守护程序收集的日志,请使用journalctl 命令。
单独使用时,系统中的每个日志条目都会显示在一页内(通常less)中供浏览。 最旧的条目将位于顶部:

journalctl

Output
– Logs begin at Tue 2015-02-03 21:48:52 UTC, end at Tue 2015-02-03 22:29:38 UTC. –
Feb 03 21:48:52 localhost.localdomain systemd-journal[243]: Runtime journal is using 6.2M (max allowed 49.
Feb 03 21:48:52 localhost.localdomain systemd-journal[243]: Runtime journal is using 6.2M (max allowed 49.
Feb 03 21:48:52 localhost.localdomain systemd-journald[139]: Received SIGTERM from PID 1 (systemd).
Feb 03 21:48:52 localhost.localdomain kernel: audit!: type=1404 audit(1423000132.274:2): enforcing=1 old_en
Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 2048 avtab hash slots, 104131 rules.
Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 2048 avtab hash slots, 104131 rules.
Feb 03 21:48:52 localhost.localdomain kernel: input: ImExPS/2 Generic Explorer Mouse as /devices/platform/
Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 8 users, 102 roles, 4976 types, 294 bools, 1 sens,
Feb 03 21:48:52 localhost.localdomain kernel: SELinux: 83 classes, 104131 rules
. . .

可能需要滚动一页又一页的数据,如果 systemd 已在系统上运行很长时间,那么这些数据可能长达数万或数十万行。

对于那些习惯于标准syslog记录的人来说,这种格式会很熟悉。 然而,这实际上从比传统系统日志实现更多的来源收集数据。 它包括来自早期boot过程、内核、initrd 以及应用程序标准错误和标准输出的日志。 这些都可以在journal中找到。

您可能会注意到显示的所有时间戳都是当地时间。 现在我们已经在系统上正确设置了本地时间,这对于每个日志条目都是可用的。 所有日志均使用此新信息显示。

如果您想显示 UTC 时间戳,可以使用 --utc 标志:

journalctl --utc

按时过滤日志(by Time)

虽然访问如此大量的数据集合绝对有用,但手动检查和处理如此大量的信息可能很困难或不可能。 因此,journalctl 最重要的功能之一就是它的过滤选项。

显示本次启动以来的日志(Current Boot)

每天可能会使用的最基本的标志是 -b 选项。 这将显示自最近重新启动以来收集的所有日记条目。

journalctl -b

这将帮助识别和管理与当前环境相关的信息。

如果没有使用此功能并且显示超过一天的启动时间,则只要系统出现宕机重启,您就会看到journalctl 插入了如下所示的一行:

Output
. . .

– Reboot –

. . .

这可用于帮助您在逻辑上将信息分离到boot会话中。

按Past Boots

虽然通常希望显示当前启动的信息,但有时过去的启动也会有所帮助。 journal可以保存许多以前启动的信息,因此可以使journalctl轻松显示信息。

某些发行版默认启用保存以前的boot信息,而其他发行版则禁用此功能。 要启用持久化boot信息,可以通过键入以下内容来创建存储日志的目录:

sudo mkdir -p /var/log/journal

或者可以编辑日志配置文件:

sudo nano /etc/systemd/journald.conf

Under the [Journal] section, set the Storage= option to “persistent” to enable persistent logging:
在 [Journal] 部分下,将 Storage= 选项设置为“persistent”以启用持久日志记录:

/etc/systemd/journald.conf
. . .
[Journal]
Storage=persistent

当您的服务器上启用保存之前的boot信息时,journalctl 会提供一些命令来帮助您将boot作为划分单位。 要查看journald保存的“boot”,在journalctl中使用–list-boots选项:

journalctl --list-boots

Output:

-2 caf0524a1d394ce0bdbcff75b94444fe Tue 2024-02-03 21:48:52 UTC—Tue 2024-02-03 22:17:00 UTC
-1 13883d180dc0420db0abcb5fa26d6198 Tue 2024-02-03 22:17:03 UTC—Tue 2024-02-03 22:19:08 UTC0 bed718b17a73415fade0e4e7f4bea609 Tue 2024-02-03 22:19:12 UTC—Tue 2024-02-03 23:01:01 UTC

This will display a line for each boot. The first column is the offset for the boot that can be used to easily reference the boot with journalctl. If you need an absolute reference, the boot ID is in the second column. You can tell the time that the boot session refers to with the two time specifications listed towards the end.
这将为每个boot显示一行。 第一列是系统启动的偏移量,可用于通过journalctl轻松引用每个boot。 如果您需要绝对引用,boot ID 位于第二列中。 可以通过最后列出的两个时间字段来判断boot会话所指的时间。

要显示这些boot的信息,可以使用第一列或第二列中的信息。

例如,要查看上次启动的日志,请使用 -1 相对指针和 -b 标志:

journalctl -b -1

还可以使用boot ID 回调启动数据:

journalctl -b caf0524a1d394ce0bdbcff75b94444fe

按时间窗口

虽然通过boot查看日志条目非常有用,但有时只希望查询某一段时间窗口的日志条目。 在处理显著uptime时间的长时间运行的服务器时尤其如此。

这种情况可以考虑使用 --since 和 --until 选项按任意时间限制进行​​过滤,这分别将显示的条目限制为给定时间之后或之前的条目。

时间值可以有多种格式。 对于绝对时间值,应该使用以下格式:

YYYY-MM-DD HH:MM:SS

例如,我们可以通过输入以下命令查看自 2024年 1 月 10 日下午 5:15 以来的所有条目:

journalctl --since "2024-01-10 17:15:00"

如果省略上述格式的组成部分则将应用一些默认值。 例如,如果省略日期,则将假定当前日期。 如果时间部分缺失,则将替换为“00:00:00”(午夜)。 秒字段也可以省略,默认为“00”:

journalctl --since "2024-01-10" --until "2024-01-11 03:00"

Journal还使用一些相对值和命名的快捷方式。 例如,可以使用“yesterday”、“today”、“tomorrow”或“now”等词。 可以通过在数值前添加“-”或“+”或在句子结构中使用“ago”等单词来计算相对时间。
要获取昨天的数据,可以输入:

journalctl --since yesterday

如果您收到从上午 9:00 开始并持续到一小时前的服务中断报告,可以输入:

journalctl --since 09:00 --until "1 hour ago"

正如上面所看到的,定义灵活的时间窗口使得过滤希望查看的条目变得相对简单。

按感兴趣的消息筛选

上面,我们了解了一些使用时间限制过滤日志数据的方法。 接下来,我们将讨论如何根据您感兴趣的服务或组件进行过滤。systemd 日志提供了多种执行此操作的方法。

按unit

如果要查看某个服务相关的日志,则unit应该是最有效的方式。我们可以使用 -u 选项以这种方式进行过滤。

例如,要查看系统上 Nginx 单元的所有日志,我们可以输入:

journalctl -u nginx.service

通常,可能还希望按时间进行过滤,以便显示感兴趣的行。例如,要检查服务今天的运行情况,您可以键入:

journalctl -u nginx.service --since today

当利用journal整合来自不同unit的日志记录的能力时,这种类型的专注类型变得非常有用。 例如,如果有一个Nginx 进程连接到 PHP-FPM 单元来处理动态内容,则可以通过指定两个unit来按时间顺序合并两个unit中的条目:

journalctl -u nginx.service -u php-fpm.service --since today

这可以更容易地发现不同程序和调试系统之间的交互,而不是单个进程之间的交互。

按进程、用户、Group ID

某些服务会产生各种子进程来完成工作。 如果您已经找出了感兴趣的进程的确切 PID,也可以根据它进行过滤。

为此,可以通过指定 _PID 字段进行过滤。 例如,如果想了解 PID 是 8088的进程,可以输入:

journalctl _PID=8088

有时,可能希望显示从特定用户或组记录的所有条目。 这可以通过 _UID 或 _GID 过滤器来完成。 例如,如果有web服务器在 www-data 用户下运行,可以通过键入以下内容找到用户 :

id -u www-data

Output
33

之后,可以使用返回的 ID 来过滤日志结果:

journalctl _UID=33 --since today

systemd journal有许多可用于过滤的字段。 其中一些是从正在记录的进程传递的,另一些是由journald在日志记录时,使用从系统收集的信息应用的。
Q
前导下划线表示 _PID 字段属于后一种类型。 journal自动记录并索引正在记录的进程的 PID,以供以后过滤。 您可以通过键入以下内容了解所有可用的日记字段:

man systemd.journal-fields

我们稍后将讨论其中的一些内容。 现在,我们先看看一个与按这些字段进行过滤有关的更有用的选项。 -F 选项可用于显示给定journal字段的所有可用值。
例如,要查看 systemd journal有哪些Group ID 的条目,可以输入:

journalctl -F _GID

Output
32
99
102
133
81
84
100
0
124
87

这将显示日journal为Group ID 字段存储的所有值。 这可以帮助您构建过滤。

按组件路径

我们还可以通过提供路径位置进行过滤。
如果路径指向可执行文件,journalctl 将显示涉及相关可执行文件的所有条目。 例如,要查找涉及 bash 可执行文件的条目,您可以输入:

journalctl /usr/bin/bash

通常,如果一个unit可用于可执行文件,则-u或–unit方法更干净并提供更好的信息(有来自于关联子进程的日志条目等等好处)。 否则,by path就能够提供必要的帮助给我们。

显示内核消息

内核消息(通常在 dmesg 输出中找到)也可以从journal中检索。

要仅显示这些消息,我们可以在命令中添加 -k 或 --dmesg 标志:

journalctl -k

默认情况下,这将显示当前boot的内核消息。也可以使用先前讨论过的boot选择标志指定替代boot。例如,要获取五次启动之前的消息,您可以输入:

journalctl -k -b -5

按消息优先级

系统管理员经常感兴趣的过滤器之一是消息优先级。 虽然以非常详细的级别记录信息通常很有用,但在实际消化可用信息时,低优先级日志可能会分散注意力和令人困惑。
可以使用journalctl 通过使用-p 选项仅显示指定优先级或更高优先级的邮件。 这将过滤掉优先级较低的消息。
例如,要仅显示错误级别或更高级别记录的条目,您可以键入:

journalctl -p err -b

这将显示所有标记为 error, critical, alert, 或者emergency的消息。 journal实现标准的系统日志消息级别。 可以使用优先级名称或其相应的数值。 按照优先级从高到低的顺序,这些是:

  • 0: emerg
  • 1: alert
  • 2: crit
  • 3: err
  • 4: warning
  • 5: notice
  • 6: info
  • 7: debug
    上述数字或名称可以与 -p 选项互换使用。 选择优先级将显示标记为指定级别及其之上的消息

修改Journal输出格式

上面演示了通过过滤输出我们想要的日志条目。 不过,还有其他方法可以修改输出。 我们可以调整 Journalctl 显示以满足不同的需求。

截断或扩展输出

我们可以通过告诉journalctl缩小或扩展输出来调整journalctl显示数据的方式。
默认情况下,journalctl 将在分页器中显示整个条目,从而使条目逐渐显示到屏幕右侧。 按向右箭头键可以访问此信息。
如果您希望输出被截断,在删除信息的地方插入省略号,您可以使用 --no-full 选项:

journalctl --no-full

Output
. . .
Output:

Output
. . .Feb 04 20:54:13 journalme sshd[937]: Failed password for root from 83.234.207.60...h2
Feb 04 20:54:13 journalme sshd[937]: Connection closed by 83.234.207.60 [preauth]
Feb 04 20:54:13 journalme sshd[937]: PAM 2 more authentication failures; logname...ot

我们也可以采取相反的方向,告诉journalctl显示其所有信息,无论它是否包含不可打印的字符。
可以使用 -a 标志来做到这一点:

journalctl -a

输出日志到标准输出

默认情况下,journalctl 在分页器中显示输出以便于使用。 但是,如果计划使用文本操作工具处理数据,可能希望能够输出到标准输出。

您可以使用 --no-pager 选项来执行此操作:

journalctl --no-pager

这可以立即通过管道传输到处理实用工具或重定向到磁盘上的文件,具体取决于需要。

输出格式

如果正在处理日志条目,如上所述,假如数据采用更易于使用的格式,能帮助我们更轻松地解析数据。 journal可以根据需要以多种格式显示。可以使用 -o 选项指定输出格式执行此操作。
例如,通过输入以下内容以 JSON 格式输出日记条目:

journalctl -b -u nginx -o json

Output:

Output
{ "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : "6", "_UID" : "0", "_GID" : "0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : "3", "CODE_FILE" : "src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading", "SYSLOG_IDENTIFIER" : "systemd", "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5", "_TRANSPORT" : "journal", "_PID" : "1", "_COMM" : "systemd", "_EXE" : "/usr/lib/systemd/systemd", "_CMDLINE" : "/usr/lib/systemd/systemd", "_SYSTEMD_CGROUP" : "/", "UNIT" : "nginx.service", "MESSAGE" : "Starting A high performance web server and a reverse proxy server...", "_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973" }. . .

这对使用工具进行解析很有用。可以使用 json-pretty 格式来更好地了解数据结构,然后将其传递给 JSON 使用者。

journalctl -b -u nginx -o json-pretty

Output:

Output
{"__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635","__REALTIME_TIMESTAMP" : "1422990364739502","__MONOTONIC_TIMESTAMP" : "27200938","_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d","PRIORITY" : "6","_UID" : "0","_GID" : "0","_CAP_EFFECTIVE" : "3fffffffff","_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee","_HOSTNAME" : "desktop","SYSLOG_FACILITY" : "3","CODE_FILE" : "src/core/unit.c","CODE_LINE" : "1402","CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading","SYSLOG_IDENTIFIER" : "systemd","MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5","_TRANSPORT" : "journal","_PID" : "1","_COMM" : "systemd","_EXE" : "/usr/lib/systemd/systemd","_CMDLINE" : "/usr/lib/systemd/systemd","_SYSTEMD_CGROUP" : "/","UNIT" : "nginx.service","MESSAGE" : "Starting A high performance web server and a reverse proxy server...","_SOURCE_REALTIME_TIMESTAMP" : "1422990364737973"
}. . .

可以使用以下格式进行显示:

  • cat:仅显示消息字段本身。
  • export:适合传输或备份的二进制格式。
  • json:标准 JSON,每行一个条目。
  • json-pretty:格式化JSON 以便于人类可读性
  • json-sse:JSON 格式的输出,经过包装以使其与服务器推送事件兼容。
  • short:默认的系统日志样式输出
  • short-iso:默认格式,增加了显示 ISO 8601 wallclock时间戳的功能。
  • short-monotonic:具有monotonic时间戳的默认格式。
  • short-precise:具有微秒精度的默认格式。
  • verbose:显示条目中可用的每个日志字段,包括通常在内部隐藏的字段

这些选项允许以最适合您当前需求的任何格式显示journal条目。

主动进程监控

journalctl命令模仿了管理员使用tail来监视活动或最近活动的方式。这种功能内置在journalctl中,使我们能够访问这些功能,而无需将其管道传输到另一个工具。

显示最近的日志

要显示一定数量的记录,可以使用 -n 选项,其作用与 tail -n 完全相同。
默认情况下,它将显示最近的 10 个条目:

journalctl -n

您可以使用 -n 后面指定想要查看的条目数:

journalctl -n 20

Follow日志

主动跟踪正在写入的日志,可以使用 -f 标志。 同样,如果您有使用 tail -f 的经验,这正如所期望的那样:

journalctl -f

退出按 CTRL+C。

Journal维护

有时候可能想知道存储到目前为止我们所看到的所有数据的成本。 此外,也可能会对清理一些较旧的日志并释放空间感到有性趣。

查找当前磁盘空间使用量

journalctl --disk-usage

Output
Archived and active journals take up 8.0M in the file system.

删除旧的日志

如果想缩小日志,可以通过两种不同的方式来实现(systemd 版本 218 及更高版本提供)。

如果使用 --vacuum-size 选项,您可以通过指定大小来缩小日志。 这将删除旧条目,直到磁盘上占用的总日志空间达到请求的大小:

sudo journalctl --vacuum-size=1G

缩小日志的另一种方法是使用 --vacuum-time 选项提供截止时间。超过该时间的任何条目都将被删除。这允许保留在特定时间之后创建的条目。
例如,要保留去年的条目,可以输入:

sudo journalctl --vacuum-time=1years

限制日志扩展

可以配置服务器以限制日志占用的空间。这可以通过编辑 /etc/systemd/journald.conf 文件来完成。
以下项目可用于限制日志增长:

  • SystemMaxUse=:指定journal在持久存储中可使用的最大磁盘空间。
  • SystemKeepFree=: 指定将日志条目添加到持久存储时,日志应保留的空闲空间量。
  • SystemMaxFileSize=:控制单个日志文件在rotation(轮换)之前在持久存储中可以增长到多大。
  • RuntimeMaxUse=:指定易失性存储(/run 文件系统内)中可使用的最大磁盘空间。
  • RuntimeKeepFree=: 指定在将数据写入易失性存储(位于/run文件系统内)时,应留出用于其他用途的空间量。
  • RuntimeMaxFileSize=: 指定在将日志文件进行轮换之前,单个日志文件可以占用的易失性存储空间量(位于/run文件系统内)。

通过设置这些值,可以控制 journald 如何消耗和保留服务器上的空间。SystemMaxFileSize 和 RuntimeMaxFileSize 将会使得归档文件的大小与限制值一致。在vacuum操作后解释文件计数时,记住这一点很重要

相关文章:

Linux journalctl命令详解

文章目录 1.介紹2.概念设置system time基本的日志查阅方法按时过滤日志(by Time)显示本次启动以来的日志(Current Boot)按Past Boots按时间窗口按感兴趣的消息筛选按unit按进程、用户、Group ID按组件路径显示内核消息按消息优先级…...

恢复MySQL!是我的条件反射,PXB开源的力量...

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...

Storm详细配置

一、认识Storm Apache Storm是个实时数据处理的“大能”,它可以实时接收、处理并转发大量数据流,就像一个高速运转的物流中心,确保数据及时、准确地到达目的地。我们要做的,就是把这个物流中心搭建起来,并且根据我们的…...

linux redis部署教程

单节点部署: 单节点部署 Redis 非常简单,只需要在一台服务器上安装 Redis 服务即可。以下是在 Linux 环境下的单节点部署步骤: 安装 Redis:打开终端,并执行以下命令来更新软件包列表并安装 Redis 服务器:…...

【Java】隐式锁(synchronized):如何解决餐厅等座的并发难题

当你走进一家熙熙攘攘的餐厅,准备享受一顿美味的晚餐时,你是否曾想过,这里正上演着一场场微观的线程战争?在这个场景中,每一张桌子都代表着珍贵的共享资源,而每一位顾客(线程)都在争…...

科技论文和会议录制高质量Presentation Video视频方法

一、背景 机器人领域,许多高质量的期刊和会议(如IEEE旗下的TRO,RAL,IROS,ICRA等)在你的论文收录后,需要上传一个Presentation Video材料,且对设备兼容性和视频质量有较高要求&#…...

Spring高手之路17——动态代理的艺术与实践

文章目录 1. 背景2. JDK动态代理2.1 定义和演示2.2 不同方法分别代理2.3 熔断限流和日志监控 3. CGLIB动态代理3.1 定义和演示3.2 不同方法分别代理(对比JDK动态代理写法)3.3 熔断限流和日志监控(对比JDK动态代理写法) 4. 动态代理…...

如何在Unity中使用设计模式

在 Unity 环境中,设计模式是游戏开发人员遇到的常见问题的通用解决方案。将它们视为解决游戏开发中特定挑战的经过验证的模板或蓝图。以下是一些简单易懂的设计模式: 1. 单例=> 单例模式确保一个类只有一个实例,并提供对该实例的全局访问点。在 Unity 中,可以使用单例模…...

基于springboot+vue+Mysql的旅游管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

vue3+ts中判断输入的值是不是经纬度格式

vue3ts中判断输入的值是不是经纬度格式 vue代码&#xff1a; <template #bdjhwz"{ record }"><a-row :gutter"8" v-show"!record.editable"><a-col :span"12"><a-input placeholder"经度" v-model:v…...

python常用知识总结

文章目录 1. 常用内置函数1. ASCII码与字符相互转换 1. 常用内置函数 1. ASCII码与字符相互转换 # 用户输入字符 c input("请输入一个字符: ")# 用户输入ASCII码&#xff0c;并将输入的数字转为整型 a int(input("请输入一个ASCII码: "))print( c &qu…...

常用的启发式算法

A算法&#xff1a;在电子地图导航软件中&#xff0c;当你输入目的地时&#xff0c;软件就会利用A算法来计算从现在的位置到目的地的最佳路径。该算法兼顾了路径的优化以及计算速度&#xff0c;保证了结果的准确性以及反馈的实时性。 模拟退火算法&#xff1a;模拟退火算法常被…...

应该如何进行POC测试?—【DBA从入门到实践】第三期

在数据库选型过程中&#xff0c;为确保能够灵活应对数据规模的不断扩大和处理需求的日益复杂化&#xff0c;企业和技术人员会借助POC测试来评估不同数据库系统的性能。在测试过程中&#xff0c;性能、并发处理能力、存储成本以及高可用性等核心要素通常会成为大家关注的焦点&am…...

通过Clojure中的集合与序列谈谈抽象的重要

与君共勉&#xff1a;生命不息&#xff0c;学习不止&#xff0c;切忌浮躁&#xff0c;静下心来&#xff0c;每天进步一点点。 Clojure简介 Clojure是一门运行在JVM上面的Lisp方言&#xff0c;其它的Lisp方言还有Scheme、Common Lisp等。Lisp相关的著名书籍有《计算机程序的构…...

Rust---模式(Pattern)匹配

目录 模式是什么它用来做什么模式匹配和赋值为什么会有模式匹配模式匹配用在什么地方match 表达式if let表达式while let表达式for 循环let 语句函数参数不可驳模式匹配和可驳模式匹配模式是什么 在Rust中,模式(Pattern)是一种用于匹配和解构数据的语法结构。模式匹配中常用…...

MATLAB 计算点投影到平面上的坐标(59)

MATLAB 计算点投影到平面上的坐标(59) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 点投影到平面,计算投影点的坐标,下面提供MATLAB版本的计算程序,直接运行即可,内有验证数据,具体看代码即可。 二、算法实现 1.代码 代码如下(示例): % 平面上的三个点分…...

2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现&#xff1a; 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值&#xff0c;不仅对中国文…...

嵌入式与移动物联网开发教程和案例

一、嵌入式与移动物联网概述 嵌入式系统是指嵌入到设备中的专用计算机系统&#xff0c;用于控制、监视或辅助设备操作。而移动物联网则是指通过物联网技术将各种智能设备与互联网连接起来&#xff0c;实现设备之间的互联互通和智能化管理。嵌入式与移动物联网技术的结合&#…...

AttachVoExample

目录 1、 AttachVoExample 1.1、 GeneratedCriteria 1.2、 addCriterion 1.3、 andFnameGreaterThanOrEqualTo 1.4、 GeneratedCriteria Atta...

图像处理特征提取

图像处理中的特征提取是指从图像数据中提取出具有区分性和代表性的特征&#xff0c;以用于图像分类、目标检测、图像匹配等任务。下面介绍几种常见的图像处理特征提取方法&#xff1a; 颜色特征&#xff1a;颜色是图像中最直观且重要的特征之一。常见的颜色特征提取方法包括颜色…...

前端大屏适配几种方案

一、方案一&#xff1a;remfont-size 动态设置HTML根字体大小和body字体大小&#xff0c;会使用到lib-flexible.js插件lib-flexible.js (function flexible(window, document) {var docEl document.documentElementvar dpr window.devicePixelRatio || 1// adjust body font…...

2011年认证杯SPSSPRO杯数学建模B题(第一阶段)生物多样性的评估全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 B题 生物多样性的评估 原题再现&#xff1a; 2010 年是联合国大会确定的国际生物多样性年。保护地球上的生物多样性已经越来越被人类社会所关注&#xff0c;相关的大规模科研和考察计划也层出不穷。为了更好地建立国际交流与专家间的合作&…...

AcWing 793. 高精度乘法——算法基础课题解

AcWing 793. 高精度乘法 题目描述 给定两个非负整数&#xff08;不含前导 00&#xff09; A 和 B&#xff0c;请你计算 AB 的值。 输入格式 共两行&#xff0c;第一行包含整数 A&#xff0c;第二行包含整数 B。 输出格式 共一行&#xff0c;包含 AB 的值。 数据范围 1≤…...

【一刷《剑指Offer》】面试题 3:二维数组中的查找

力扣对应题目链接&#xff1a;240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; 核心考点&#xff1a;数组相关&#xff0c;特性观察&#xff0c;时间复杂度把握。 一、《剑指Offer》对应内容 二、分析题目 正常查找的过程本质就是排除的过程&#xff0c;谁排除…...

Linux下静态库与动态库使用总结

区别 使用静态库占用的磁盘空间相对比动态库要大。 如果多个可执行程序使用库中同一个函数&#xff0c;那么链接静态库时同一个函数的代码会被复制多份&#xff0c;而链接动态库只复制一份。动态库可共享且版本更新方便 静态链接库在程序编译的时候就被加载进来&#xff0c;不…...

分布式任务调度:架构、原理与实践

引言 在当今快速发展的科技领域中&#xff0c;任务调度作为管理和优化计算资源的重要工具&#xff0c;扮演着至关重要的角色。从单机环境到分布式系统&#xff0c;任务调度的演进不仅跟随着计算机技术的进步&#xff0c;更是为了应对日益复杂的应用场景和需求。本博客将深入探…...

ping命令返回无法访问目标主机和请求超时浅析

在日常经常用ping命令测试网络是否通信正常&#xff0c;使用ping命令时也经常会遇到这两种情况&#xff0c;那么表示网络出现了问题。 1、请求超时的原因 可以看到“请求超时”没有收到任何回复。要知道&#xff0c;IP数据报是有生存时间的&#xff0c;当其生存时间为零时就会…...

地球上的七大洲介绍

地球上的七大洲示意图&#xff1a; 1. 亚洲&#xff08;Asia&#xff09;&#xff1a;世界上最大的洲&#xff0c;面积约为44579000平方公里。亚洲地域辽阔&#xff0c;包括从北极圈到赤道的各种气候和地形。它拥有世界上最多的人口&#xff0c;也是世界上一些最古老文明的发源…...

IntelliJ IDEA 2024 for Mac/Win:引领Java开发新纪元的高效集成环境

在日新月异的软件开发领域&#xff0c;一款高效、智能的集成开发环境&#xff08;IDE&#xff09;无疑是程序员们不可或缺的神兵利器。今天&#xff0c;我要为大家介绍的&#xff0c;正是这样一款集大成之作——IntelliJ IDEA 2024。无论是Mac用户还是Windows用户&#xff0c;只…...

Java 中命令模式,请用代码具体举例

在Java中&#xff0c;命令模式是一种行为设计模式&#xff0c;它允许将请求封装成一个对象&#xff0c;从而使得可以参数化其他对象对请求进行调用、队列化请求、或者记录请求日志&#xff0c;同时支持可撤销的操作。 下面是一个简单的示例代码&#xff0c;展示了如何使用命令模…...

网站建设公司 电话销售没什么效果/网站的营销推广方案

$(window).scroll(function() { }); window的滚动事件不触发以及offset().top数据乱的原因&#xff1f; 如果你的css中&#xff1a;html,body的高度样式如果设置为100%&#xff0c;那么$(window).scroll方法将检测不到正确的滚出高度&#xff08;0&#xff09;&#xff0c;导致…...

网络用户提要求找人帮忙做的网站/百度搜索官网

&#x1f4e2;前言&#x1f332;原题样例&#xff1a;旋转字符串&#x1f33b;C#方法&#xff1a;判断子串&#x1f33b;Java 方法&#xff1a;判断子串&#x1f4ac;总结&#x1f4e2;前言 &#x1f680; 算法题 &#x1f680; &#x1f332; 每天打卡一道算法题&#xff0c;…...

武汉阳网站建设市场/域名检测查询

虚拟化是什么&#xff1f; 虚拟化是一种将计算机资源&#xff08;如处理器、内存、存储等&#xff09;抽象化和隔离的技术&#xff0c;以实现多个虚拟环境共享物理计算机资源的目的。通俗地说&#xff0c;虚拟化就是将一个物理主机分割成多个虚拟的、相互独立的虚拟机&#xf…...

网站商城系统建设/怎么联系地推公司

解决方案&#xff1a; sudo easy_install pip...

惠州网站制作网站/上海十大营销策划公司

试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试标签过滤试试…...

营销式网站制作/seo网络推广是什么意思

STM32F407ZG的简单介绍0 处理器基本参数1 程序环境2 系统架构2.1 S0&#xff1a;I 总线2.2 S1&#xff1a;D 总线3.3 S2&#xff1a;S 总线2.4 S3、S4&#xff1a;DMA 存储器总线2.5 S5&#xff1a;DMA 外设总线2.6 S6&#xff1a;以太网 DMA 总线2.7 S7&#xff1a;USB OTG HS…...