systemd-journal(二)之配置文件详解journal-remote.conf,journal-upload.conf,journald.conf

22 篇文章 0 订阅
6 篇文章 0 订阅

写在前面

本文主要是详细介绍了linux服务器中systemd日志管理journal相关配置文件及详细含义,主要翻译自英文原文文档。主要是 接收日志上传服务的配置文件:journal-remote.conf, journal-remote.conf.d,日志上传服务的配置文件:journal-upload.conf, journal-upload.conf.d和日志服务配置文件:journald.conf, journald.conf.d, journald@.conf
主要是下列配置文件:

  1. 接收日志上传服务的配置文件
    journal-remote.conf, journal-remote.conf.d
    英文文档链接:
    https://www.freedesktop.org/software/systemd/man/latest/journal-remote.conf.html#

  2. 日志上传服务的配置文件
    journal-upload.conf, journal-upload.conf.d
    英文文档链接:
    https://www.freedesktop.org/software/systemd/man/latest/journal-upload.conf.html#

  3. 日志服务配置文件
    journald.conf, journald.conf.d, journald@.conf
    英文文档链接:
    https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html#

其他相关文档请参考:
systemd-journal(一)之journalctl命令详解

systemd专栏

在这里插入图片描述
在这里插入图片描述

概述

主要是systemd的日志相关的配置文件说明
journal-remote.conf, journal-remote.conf.d

journal-remote.conf, journal-remote.conf.d

接受远程日志上传的服务的配置文件

概要

/etc/systemd/journal-remote.conf

/etc/systemd/journal-remote.conf.d/*.conf

/run/systemd/journal-remote.conf.d/*.conf

/usr/lib/systemd/journal-remote.conf.d/*.conf

这些文件配置了 systemd-journal-remote.service(8) 的各种参数。参见 systemd.syntax(7) 来了解语法的一般描述。

配置目录和优先级

默认配置是在编译过程中设置的,因此只有在需要偏离这些默认值时才需要配置。

主配置文件位于 /usr/lib/systemd//etc/systemd/中,并且包含注释掉的条目,显示默认值作为管理员指南。可以通过创建插入式替换来创建本地覆盖,如下所述。主配置文件也可以为此目的进行编辑(如果在 /usr/中附带,也可以是/etc下的一个copy),但是建议使用插入式配置而不是修改主配置文件。

除了“main”配置文件之外,还从 /usr/lib/systemd/*.conf.d/ ,/etc/systemd/*.conf.d/ *.conf.d//usr/local/lib/systemd/*.conf.d/中读取插入式配置代码段

这些插入项具有更高的优先级,并覆盖主配置文件。

配置子目录中的文件按其文件名按字典顺序排序,而不管它们位于哪个子目录中。当多个文件指定同一选项时,对于只接受单个值的选项,最后排序的文件中的条目优先,对于接受值列表的选项,将收集排序文件中出现的条目。

当软件包需要自定义配置时,可以在/usr/下安装drop-ins/etc/中的文件是为本地管理员保留的,他们可以使用这个逻辑来覆盖供应商软件包安装的配置文件。因为主配置文件的优先级较低,必须使用 Drop-ins 来覆盖包 Drop-ins。建议在这些子目录中的所有文件名前添加两位的数字和破折号作为前缀,以简化文件的排序。这还定义了 drop-in 优先级的概念,允许发行版在低于用户使用范围的特定范围内发送 drop-in。这应该可以降低包插入程序覆盖用户定义的意外插入程序的风险。
要禁用供应商提供的配置文件,建议的方法是在/etc/ 的配置目录中放置一个符号链接(软链接)指向/dev/null,其文件名与供应商配置文件相同。

选项

所有选项都在 [Remote] 部分中配置:

Seal=

使用 Forward Secure Sealing 定期对日志中的数据进行签名。

SplitMode=

"host" 或者 "none"

ServerKeyFile=

PEM 格式的 SSL 密钥

ServerCertificateFile=

PEM格式的SSL证书。

TrustedCertificateFile=

SSL CA certificate. SSL CA 证书。

MaxUse=, KeepFree=, MaxFileSize=, MaxFiles=

它们类似于 journald.conf(5) 中的

SystemMaxUse=
SystemKeepFree= 
SystemMaxFileSize= 
SystemMaxFiles=

MaxUse= 控制 systemd-journal-remote 最多可以占用多少磁盘空间。
KeepFree=控制 systemd-journal-remote 应留出多少磁盘空间用于其他用途。
systemd-journal-remote 将遵守这两个限制,并使用两个值中较小的一个。
MaxFiles= 控制最多要保留的单个日志文件的数量。

请注意,在达到此限制之前,仅删除存档文件以减少文件数量, 活动文件将保留。这意味着,实际上,在清空操作完成后,总的日志文件可能仍会超过此限制。

journal-upload.conf, journal-upload.conf.d

日志上传服务的配置文件

概要

/etc/systemd/journal-upload.conf

/etc/systemd/journal-upload.conf.d/*.conf

/run/systemd/journal-upload.conf.d/*.conf

/usr/lib/systemd/journal-upload.conf.d/*.conf

这些文件配置了 systemd-journal-upload.service(8) 的各种参数。

配置目录和优先级

默认配置是在编译过程中设置的,因此只有在需要偏离这些默认值时才需要配置。主配置文件位于 /usr/lib/systemd//etc/systemd/ 中,并且包含注释掉的条目,显示默认值作为管理员指南。可以通过创建插入式替换来创建本地覆盖,如下所述。主配置文件也可以为此目的进行编辑(如果附带在 /usr/目录下 ,也可以从/etc复制过来),但是建议使用插入式配置而不是修改主配置文件。
除了“main” 配置文件之外,还从 /usr/lib/systemd/*.conf.d//usr/local/lib/systemd/*.conf.d//etc/systemd/*.conf.d/ 中读取插入式配置代码段。这些插入项具有更高的优先级,并覆盖主配置文件。 *.conf.d/ 配置子目录中的文件按其文件名按字典顺序排序,而不管它们位于哪个子目录中。当多个文件指定同一选项时,对于只接受单个值的选项,最后排序的文件中的条目优先,对于接受值列表的选项,将收集排序文件中出现的条目。

当软件包需要自定义配置时,可以在 /usr/ 下安装插件。中的 /etc/ 文件是为本地管理员保留的,本地管理员可以使用此逻辑来覆盖供应商软件包安装的配置文件。必须使用插件来覆盖包插件,因为主配置文件的优先级较低。建议在这些子目录中的所有文件名前面加上两位的数字和破折号,以简化文件的排序。这也定义了插入优先级的概念,以允许发行版在低于用户使用的范围的特定范围内运送插入式组件。这应该会降低包插件覆盖用户定义的意外插件的风险。

要禁用供应商提供的配置文件,建议的方法是在/etc/ 的配置目录中放置一个符号链接(软链接)指向/dev/null,其文件名与供应商配置文件相同。

选项

所有选项均在[Upload]部分中配置:

URL=

要将日志记录上载到的 URL。参见 systemd-journal-upload(8) 中对 --url= 选项的描述来了解可能的值。没有默认值,因此此选项或命令行选项必须始终存在才能进行上传。

ServerKeyFile=

PEM 格式的 SSL 密钥。

ServerCertificateFile=

PEM 格式的 SSL CA 证书。

TrustedCertificateFile=

SSL CA certificate. SSL CA 证书。

NetworkTimeoutSec=

当与服务器的网络连接丢失时,此选项将配置等待连接恢复的时间。如果在配置的时间内无法通过网络访问服务器,则 systemd-journal-upload 将退出。以秒为单位获取值(如果后缀为“ms”、“min”、“h”等,则采用其他时间单位)。有关详细信息,请参见 systemd.time

journald.conf,journald.conf.d, journald@.conf

日志服务配置文件

概要

/etc/systemd/journald.conf

/etc/systemd/journald.conf.d/*.conf

/run/systemd/journald.conf.d/*.conf

/usr/lib/systemd/journald.conf.d/*.conf

/etc/systemd/journald@NAMESPACE.conf

/etc/systemd/journald@NAMESPACE.conf.d/*.conf

/run/systemd/journald@NAMESPACE.conf.d/*.conf

/usr/lib/systemd/journald@NAMESPACE.conf.d/*.conf

描述

这些文件配置了 systemd 日志服务 systemd-journald.service(8) 的各种参数
管理默认命名空间的 systemd-journald 实例由/etc/systemd/journald.conf关联的插件配置。管理其他命名空间的实例读取 /etc/systemd/journald@NAMESPACE.conf 并关联了填充了命名空间标识符的插入。这允许每个命名空间携带不同的配置。参见 systemd-journald.service(8) 来了解日志命名空间的细节。

配置目录和优先级

默认配置是在编译过程中设置的,因此只有在需要偏离这些默认值时才需要配置。主配置文件位于 /usr/lib/systemd/ /etc/systemd/ 中,并且包含注释掉的条目,显示默认值作为管理员指南。可以通过创建插入式替换来创建本地覆盖,如下所述。主配置文件也可以为此目的进行编辑(如果附带在 /usr/ 目录下 ,也可以从/etc 复制过来),但是建议使用插入式配置而不是修改主配置文件。
除了“main”配置文件之外,还从 /usr/lib/systemd/*.conf.d//usr/local/lib/systemd/*.conf.d//etc/systemd/*.conf.d/ 中读取插入式配置代码段。这些插入项具有更高的优先级,并覆盖主配置文件。 *.conf.d/ 配置子目录中的文件按其文件名按字典顺序排序,而不管它们位于哪个子目录中。当多个文件指定同一选项时,对于只接受单个值的选项,最后排序的文件中的条目优先,对于接受值列表的选项,将收集排序文件中出现的条目。

当软件包需要自定义配置时,可以在/usr/下安装插件。中的/etc/文件是为本地管理员保留的,本地管理员可以使用此逻辑来覆盖供应商软件包安装的配置文件。必须使用插件来覆盖包插件,因为主配置文件的优先级较低。建议在这些子目录中的所有文件名前面加上两位的数字和破折号,以简化文件的排序。这也定义了插入优先级的概念,以允许发行版在低于用户使用的范围的特定范围内运送插入式组件。这应该会降低包插件覆盖用户定义的意外插件的风险。

要禁用供应商提供的配置文件,建议的方法是在/etc/ 的配置目录中放置一个符号链接(软链接)指向/dev/null,其文件名与供应商配置文件相同。

选项

所有选项都在 [Journal] 部分中配置:

Storage=

控制日志数据的存储位置。“ volatile ”、“ persistent ” 、“auto” “和” none “之一。
如果 “ volatile ”,日志数据将仅存储在内存中,即 /run/log/journal 层次结构之下(如果需要,将创建层次结构)。
如果“ persistent ”,则数据将会存储在磁盘上,即在/var/log/journal层次结构(如果需要将会创建)下方,并在早期启动期间以及磁盘不可写时回退到/run/log/journal(如果需要将会创建)。
如果 /var/log/journal 目录存在,则“auto”行为类似于 ” persistent “,否则类似”volatile "(目录的存在控制存储模式)。
“none "表示关闭所有存储所有收到的日志数据都将被丢弃(但转发到其他目标,例如控制台、内核日志缓冲区或 syslog 套接字仍将有效)。

在默认日志命名空间中默认为“ auto ”,在所有其他命名空间中默认为“ persistent ”

请注意,journald 最初将使用易失性存储,直到调用 journalctl --flush(或发送到 SIGUSR1
journald)将导致它切换到持久日志记录(在上述条件下)。这是在启动时通过“ systemd-journal-flush.service ”自动完成的

请注意,当此选项更改为“ volatile ”时,不会删除现有持久性数据。从另一个方面来说,带有 --flush选项的journalctl(1) 可用于将易失性数据移动到持久性存储器。

当使用日志命名空间(参见 systemd.exec中使用的LogNamespace=)时,设置为Storage=为 “ volatile ”“ auto不会影响 中每个命名空间日志目录的/var/log/journal/创建,因为默认情况下服务systemd-journald@.service文件带有 LogsDirectory= 。要关闭它,请添加一个设置为 LogsDirectory= 空字符串的单元文件插入文件(a unit file drop-in file)。

请注意,除非启用持久性存储,否则不支持单个用户日志文件,因此 journalctl --user 不可用。

Compress=

可以取布尔值。如果启用(默认),则应存储在日志中且大于默认阈值 512 字节的数据对象在写入文件系统之前会被压缩。也可以将其设置为字节数以直接指定压缩阈值。K、M 和 G 等后缀可用于指定更大的单位。

Seal=

采用布尔值。如果启用了(默认值),并且封存密钥是可用的(由journalctl(1) --setup-keys的命令创建),那么所有持久性日志文件的前向安全封存 (FSS) 就会启用。FSS 基于 G. A. Marson 和 B. Poettering (doi:10.1007/978-3-642-40203-6_7) 的 Seekable Sequential Key Generators(可查找的顺序密钥生成器),可用于保护日志文件免遭未被注意的更改。

SplitMode=

控制是否拆分每个用户的日志文件,是“ uid ”还是“ none ”。
拆分日志文件主要用于访问控制:
在 UNIX/Linux 上,访问控制是按文件管理的,日志守护程序将分配用户对其日志文件的读取访问权限。
如果为 “ uid ,则所有常规用户(超出系统用户范围的UID、动态服务用户和 nobody 用户范围)将各自获取自己的日志文件,系统用户将获取到系统日志。
有关 UID 范围的更多详细信息,请参阅 systemd 系统上的用户、组、UID 和 GID。
如果为 “ none ”,则日志文件不会按用户拆分,而是将所有消息存储在单个系统日志中。在此模式下,非特权用户通常无权访问自己的日志数据。
请注意,按用户拆分日志文件仅适用于永久存储的日志。如果日志存储在易失性存储器上(见 Storage= 上文),则仅使用单个日志文件。默认为“ uid ”。

RateLimitIntervalSec=, RateLimitBurst=

配置应用于系统上生成的所有消息的速率限制。如果在 RateLimitIntervalSec= 定义的时间间隔内,服务记录的消息数多于指定的 RateLimitBurst= 时间间隔,则该间隔内的所有其他消息都将被丢弃,直到该间隔结束。将生成有关丢弃消息数的消息。此速率限制是针对每个服务应用的,因此记录的两个服务不会相互干扰对方的限制。默认为 每 30 秒10000 条消息。RateLimitIntervalSec= 定义的时间 规格可以用以下单位 指定:““s”, “min”, “h”, “ms”, “us”。若要关闭任何类型的速率限制,请将任一值设置为 0。
请注意,有效速率限制乘以从日志的可用磁盘空间派生的系数。目前,该因子是使用 2 基数对数计算的。

如果服务通过 LogRateLimitIntervalSec= 和/或 LogRateLimitBurst= 在 systemd.exec(5) 中为自己提供速率限制, 那么这些值将覆盖此处指定的设置。

SystemMaxUse=, SystemKeepFree=, SystemMaxFileSize=, SystemMaxFiles=, RuntimeMaxUse=, RuntimeKeepFree=, RuntimeMaxFileSize=, RuntimeMaxFiles=

对存储的日志文件强制实施大小限制。
“ System ”为前缀的选项适用于存储在持久性文件系统上的日志文件,更具体地说是/var/log/journal
“ Runtime ”为前缀的选项适用于存储在易失性内存文件系统上的日志文件,更具体地说 /run/log/journal

前者仅在 /var/已经挂载、可写且目录 /var/log/journal 存在时 使用。否则,仅后者适用。

请注意,这意味着在早期启动期间,如果管理员禁用了持久日志记录,则只有后一个选项适用;而如果启用了持久日志记录并且系统已完全启动,则前一个选项适用

journalctl systemd-journald 会忽略所有名称不以 “ .journal ”“ .journal~结尾的文件,因此在计算当前磁盘使用率时,仅考虑位于相应目录中的此类文件。

SystemMaxUse= 和 RuntimeMaxUse= 控制日志文件最多能占用多大的磁盘空间。

SystemKeepFree= 和 RuntimeKeepFree= 控制 systemd-journald 应留出多少磁盘空间用于其他用途。

systemd-journald 将遵守这两个限制,并使用两个值中较小的一个。

第一对(SystemMaxUse= 和 RuntimeMaxUse= )默认为相应文件系统大小的 10%,第二对(SystemKeepFree= 和 RuntimeKeepFree= )默认为 15%,但每个值的上限为 4G。

如果文件系统几乎已满,并且在启动 systemd-journald 时违反了 SystemKeepFree= 或 RuntimeKeepFree= 的规定,则限制将提高到实际空闲的百分比。

这意味着,如果在创建日志文件之前有足够的可用空间,然后创建了日志文件,但随后有其他原因导致文件系统填满,journald 将停止使用更多空间,但它也不会删除已有的日志文件以再次减少占用空间。

另请注意,仅删除归档文件,以减少日志文件占用的空间。这意味着,实际上,在清理操作完成后,使用的空间可能仍然多于 SystemMaxUse= 或 RuntimeMaxUse= 限制。

SystemMaxFileSize= 和 RuntimeMaxFileSize= 控制单个日志文件最多可以增长的大小。这会影响通过轮换(即删除历史数据)提供磁盘空间的粒度。默认为使用 SystemMaxUse= 和 RuntimeMaxUse= 配置的值的八分之一,上限为 128M,因此通常会保留七个轮换日志文件作为历史记录。如果启用日志压缩模式(默认启用),则最大文件大小上限为 4G。

以字节为单位指定值或使用 K、M、G、T、P、E 作为指定大小的单位(等于 1024、1024²、… 字节)。请注意,扩展日志文件时会同步强制执行大小限制,并且不需要由时间触发的显式轮换步骤。

SystemMaxFiles= 和 RuntimeMaxFiles= 控制最多保留多少个单独的日志文件。请注意,只有已归档的文件才会被删除,以减少文件数量,直到达到此限制;活动文件将保留着。这意味着,实际上,在清理操作完成后,日志文件总数可能仍多于此限制。此设置默认为 100。

MaxFileSec=

在轮换到下一个日志文件之前将条目存储在单个日志文件中的最长时间。通常,不需要基于时间的轮换,因为使用 SystemMaxFileSize= 等选项的基于大小的轮换应该足以确保日志文件不会无限制地增长。但是,为了确保删除旧日志文件时不会立即丢失太多数据,更改此值的默认值一个月可能是有意义的。设置为 0 可关闭此功能。此设置采用的时间值可以带有单位“年”、“月”、“周”、“日”、“h”或“m”作为后缀,以覆盖默认的时间单位(秒)。

MaxRetentionSec=

存储日记条目的最长时间。这控制是否删除包含早于指定时间跨度的条目的日志文件。通常,不需要基于时间删除旧日志文件,因为基于大小的删除(使用 SystemMaxUse= 等选项)应该足以确保日志文件不会无限制地增长。但是,为了实施数据保留策略,更改此值的默认值 0(这将关闭此功能)可能是有意义的。此设置还采用时间值,这些时间值可能带有单位“年”、“月”、“周”、“日”、“h”或“m”,以覆盖默认的时间单位(秒)。

SyncIntervalSec=

将日志文件同步到磁盘之前的超时时间。同步后,日志文件将处于“脱机”状态。请注意,在记录优先级为 CRIT、ALERT 或 EMERG 的日志消息后,会立即无条件地进行同步。因此,此设置仅适用于级别为 ERR、WARNING、NOTICE、INFO、DEBUG 的消息。默认超时为 5 分钟。
ForwardToSyslog=, ForwardToKMsg=, ForwardToConsole=, ForwardToWall=
控制日志守护程序接收的日志消息是转发到传统的 syslog 守护程序、内核日志缓冲区 (kmsg)、系统控制台,还是作为挂机消息发送给所有登录用户。这些选项采用布尔参数。如果启用了转发到 syslog,但没有任何东西从套接字读取消息,则转发到 syslog 没有效果。默认情况下,只能转发到 wall。
这些设置可能会在引导时使用内核命令行选项"systemd.journald.forward_to_syslog", "systemd.journald.forward_to_kmsg", "systemd.journald.forward_to_console", "systemd.journald.forward_to_wall" 覆盖。如果指定选项名称时没有 “ = ” 和以下参数,则假定为 true。否则,参数将解析为布尔值。
转发到控制台时,可以使用 TTYPath= 更改要登录的 TTY,如下所述。
转发到内核日志缓冲区 (kmsg) 时,请确保为日志缓冲区选择适当大的大小,例如在内核命令行中添加 “ log_buf_len=8M ”。systemd 将自动禁用应用于用户空间进程的内核速率限制(相当于设置 “ printk.devkmsg=on ”

MaxLevelStore= 、 MaxLevelSyslog= 、 MaxLevelKMsg= MaxLevelConsole= 、 MaxLevelWall=

控制存储在日志中、转发到 syslog、kmsg、控制台Console或Wall的消息的最大日志级别(如果启用,请参阅上文)。作为参数,取 “emerg”, “alert”, “crit”, “err”, “warning”, “notice”, “info”, “debug”, 或 0–7 范围内的整数值之一(对应于相同的级别)。
存储/转发等于或低于指定日志级别的消息,丢弃上述消息。

默认为 MaxLevelStore= MaxLevelSyslog= 的值都为“ debug ” ,以确保所有消息都存储在日志中并转发到 syslog。

默认为 MaxLevelKMsg= ”notice ”MaxLevelConsole= info ”和 MaxLevelWall= emerg ” 。这些设置可能会在引导时使用内核命令行选项"systemd.journald.max_level_store=", "systemd.journald.max_level_syslog=", "systemd.journald.max_level_kmsg=", "systemd.journald.max_level_console=", "systemd.journald.max_level_wall=".覆盖

ReadKMsg=

采用布尔值。如果启用,systemd-journal 将处理 /dev/kmsg 内核生成的消息。在默认日志命名空间中,此选项默认处于启用状态,在所有其他命名空间中处于禁用状态。

Audit=

采用布尔值。如果启用 systemd-journald 将在启动时打开内核审核。如果禁用,它将关闭。如果未设置,则既不会启用也不会禁用它,保持先前的状态不变。这意味着如果另一个工具打开审核,即使 systemd-journald 关闭了它,它仍然会收集生成的消息。默认为打开。

请注意,此选项不控制 systemd-journald 是否收集生成的审核记录,它只是控制是否告诉内核生成它们。如果您需要阻止 systemd-journald 收集生成的消息,可以禁用套接字单元“systemd-journald-audit.socket”,在这种情况下,此设置无效。

TTYPath=

如果 ForwardToConsole=yes 使用,请将控制台 TTY 更改为使用。默认值为 /dev/console

LineMax=

将流日志转换为记录日志时允许的最大行长度。

当 systemd 单元的标准输出/错误通过流套接字连接到日志时,读取的数据被拆分为换行符(“ \n ”,ASCII 10)和 NUL 字符处的单个日志记录。

如果未读取指定字节数的此类分隔符,则会人为插入硬日志记录边界,从而将过长的行分解为多个日志记录。选择过大的值会增加每个流客户端的日志守护程序可能使用的内存,因为在最坏的情况下,日志守护程序需要在内存中缓冲指定数量的字节,然后才能将新的日志记录刷新到磁盘。

另请注意,允许过大的行最大行长度会影响与传统日志协议的兼容性,因为日志记录可能不再适合单个 AF_UNIXAF_INET 数据报。大小以字节为单位。如果该值以K、M、G 或 T为后缀,则指定的大小将分别解析为千字节、兆字节、千兆字节或太字节(以 1024 为基数)。默认为 48K,该值相对较大,但仍然足够小,因此日志记录可能适合网络数据报以及元数据的额外空间。请注意,低于 79 的值不被接受,并将被提升至 79。

转发到传统的 syslog 守护进程

可以通过两种不同的方式将日志事件传输到不同的日志记录守护程序。

使用第一种方法,消息会立即转发到套接字 ( /run/systemd/journal/syslog ),传统的 syslog 守护程序可以在其中读取它们。此方法由 ForwardToSyslog= 选项控制。

使用第二种方法时,syslog 守护进程的行为类似于普通的日志客户端,并从日志文件中读取消息,类似于 journalctl(1)。这样一来,就不必立即读取消息,这允许仅在启动后期启动的日志记录守护程序访问自系统启动以来的所有消息。

此外,它还可以使用完整的结构化元数据。当然,只有当消息存储在日志文件中时,此方法才可用。因此,如果 Storage=none 设置了,它将不起作用。应该注意的是,通常第二种方法由 syslog 守护程序使用,因此 Storage= 选项而不是 ForwardToSyslog= 选项与它们相关。

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值