最实用的logback讲解(1)

Logback的使用 logger.error("日志输出,ERROR日志---{}", output);logger.warn ("日志输出,WARN 日志---{}", output);logger.info ("日志输出,INFO 日志---{}", output);logger.debug("日志输出,DEBUG日志---{}", output);logger.trace("日志输出,TRACE日志---{}", output); 阅读详情


logback,一个“可靠、通用、快速而又灵活的Java日志框架”,是springboot默认的日志框架。

1. pom依赖和logback.xml

  1. pom依赖
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
<!--
引入以上依赖,会自动引入以下jar
	logback-classic.x.x.x.jar
	logback-core.x.x.x.jar
	slf4j-api-x.x.x.jar
-->

注意spring-boot-starter-parent里已集成logback,可直接使用。

  1. logback.xml

在工程resources目录下建立logback.xml

1.logback首先会试着查找logback.groovy文件;

2.当没有找到时,继续试着查找logback-test.xml文件;

3.当没有找到时,继续试着查找logback.xml文件;

4.如果仍然没有找到,则使用默认配置(打印到控制台)。

2. configuration属性介绍

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="60 seconds" debug="false" packagingData="true">

	<!-- 用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,
	用于区分不同应用程序的记录。一旦设置,不能修改。-->
    <contextName>myApplicationName</contextName>


	<!--用来定义变量值,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使用“${}”来使用变量。
	name: 变量的名称,value: 的值时变量定义的值-->
    <property name="LOG_HOME" value="${catalina.base}/logs/cloudTest/" />
    
    
	<!--获取时间戳字符串,他有两个属性key和datePattern     key: 标识此<timestamp> 的名字;datePattern: 设置将当前时间(解析配置
	文件的时间)转换为字符串的模式,遵循	java.txt.SimpleDateFormat的格式。这个属性很少使用	-->
    <timestamp key="keyValue" datePattern="yyyy-MM-dd" />    
    <contextName>${keyValue}</contextName>

	<!--其他配置略-->
</configuration>
  • configuration

    scan 属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
    packagingData:Logback可以包括它输出的堆栈跟踪行的每一行的打包数据。打包数据由JAR文件的名称和版本组成,堆栈跟踪行的类就是在JAR文件中创建的。默认为false

  • contextName

  • property
    可以定义一些变量,常用于定义日志文件输出位置。

  • timestamp

3. logger和root属性的使用

logger 是configuration的子节点,用来设置某一个包或者具体的某一个类的日志打印级别、以及指定appender。logger仅有一个name属性,一个可选的level和一个可选的addtivity属性。

  • name: 用来指定受此logger约束的某一个包或者具体的某一个类。

  • level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。

  • addtivity: 是否向上级logger传递打印信息。默认是true。

logger可以包含零个或多个appender-ref元素,标识这个appender将会添加到这个logger。

root也是logger元素,但是它是根logger。只有一个level属性,因为已经被命名为"root".

  • level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。

  • root可以包含零个或多个appender-ref元素,标识这个appender将会添加到这个logger。

3.1 addtivity属性重点讲解

下面重点说明addtivity的含义,例:

java代码:

	package com.jun.springdemo.controller;
	、 、 、
	private final Logger logger = LoggerFactory.getLogger(DemoController.class);

    @RequestMapping("/get")
    public String get(){
        logger.trace("======trace");
        logger.debug("======debug");
        logger.info("======info");
        logger.warn("======warn");
        logger.error("======error");
        return "222";
    }

logback.xml配置文件

  1. 只配置root
 <configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{15}:%line] - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 日志输出级别 -->
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

其中appender的配置表示打印到控制台;
<root level="INFO">将root的打印级别设置为“INFO”,指定了名字为“STDOUT”的appender。当执行DemoController类的get方法时,root将级别为“INFO”及大于“INFO”的日志信息交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;

打印结果如下:

2019-03-07 09:59:17.257 [http-nio-8080-exec-1] INFO  [c.h.j.s.c.DemoController:22] - ======info
2019-03-07 09:59:17.257 [http-nio-8080-exec-1] WARN  [c.h.j.s.c.DemoController:23] - ======warn
2019-03-07 09:59:17.257 [http-nio-8080-exec-1] ERROR [c.h.j.s.c.DemoController:24] - ======error
  1. 带有logger的配置,不指定级别,不指定appender
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{15}:%line] - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <logger name="com.jun.springdemo.controller" ></logger>

    <!-- 日志输出级别 -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

<logger name="com.jun.springdemo.controller" />将控制com.jun.springdemo.controller包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级的日志级别“DEBUG”;没有设置addtivity,默认为true,将此logger的打印信息向上级传递;没有设置appender,此logger本身不打印任何信息。

       <root level="DEBUG">将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。
当执行com.jun.springdemo.controller.DemoController类的get方法时,因为DemoController在包com.jun.springdemo.controller中,所以首先执行<logger name="com.jun.springdemo.controller" />,将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印;

root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;
打印结果如下:

2019-03-07 10:06:36.564 [http-nio-8080-exec-1] DEBUG [c.h.j.s.c.DemoController:21] - ======debug
2019-03-07 10:06:36.564 [http-nio-8080-exec-1] INFO  [c.h.j.s.c.DemoController:22] - ======info
2019-03-07 10:06:36.564 [http-nio-8080-exec-1] WARN  [c.h.j.s.c.DemoController:23] - ======warn
2019-03-07 10:06:36.564 [http-nio-8080-exec-1] ERROR [c.h.j.s.c.DemoController:24] - ======error
  1. 带有多个logger的配置,指定级别,指定appender
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{15}:%line] - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <logger name="com.jun.springdemo.controller" ></logger>

    <logger name="com.jun.springdemo.controller.DemoController" level="info" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>

    <!-- 日志输出级别 -->
    <root level="error">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

       <logger name="com.jun.springdemo.controller" />将控制com.jun.springdemo.controller包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级的日志级别“error”;没有设置addtivity,默认为true,将此logger的打印信息向上级传递;没有设置appender,此logger本身不打印任何信息。

        <logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="false">控制com.jun.springdemo.controller.DemoController类的日志打印,打印级别为“INFO”;additivity属性为false,表示此logger的打印信息不再向上级传递,指定了名字为“STDOUT”的appender。

<root level="ERROR">将root的打印级别设置为“ERROR”,指定了名字为“STDOUT”的appender。

       当执行com.jun.springdemo.controller.DemoController类的get方法时,先执行<logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="false">,将级别为“INFO”及大于“INFO”的日志信息交给此logger指定的名为“STDOUT”的appender处理,在控制台中打出日志,不再向logger的上级 <logger name="com.jun.springdemo.controller"/> 传递打印信息; 注意此时因为DemoController位于com.jun.springdemo.controller包下,所以 <logger name="com.jun.springdemo.controller"/>是<logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="false">的上级!

<logger name="com.jun.springdemo.controller"/>未接到任何打印信息,当然也不会给它的上级root传递任何打印信息;

打印结果如下:

2019-03-07 10:14:23.472 [http-nio-8080-exec-1] INFO  [c.h.j.s.c.DemoController:22] - ======info
2019-03-07 10:14:23.474 [http-nio-8080-exec-1] WARN  [c.h.j.s.c.DemoController:23] - ======warn
2019-03-07 10:14:23.475 [http-nio-8080-exec-1] ERROR [c.h.j.s.c.DemoController:24] - ======error

       如果将<logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="false">修改为 <logger name="com.jun.springdemo.controller.DemoController" level="INFO" additivity="true">那打印结果将是什么呢?

       没错,日志打印了两次,想必大家都知道原因了,因为打印信息向上级传递,logger本身打印一次, <logger name="com.jun.springdemo.controller"/>接到后本身因为没有设置appender不会打印但向上继续传递给root,root会再打印一次。

2019-03-07 11:39:17.131 [http-nio-8080-exec-1] INFO  [c.h.j.s.c.DemoController:22] - ======info
2019-03-07 11:39:17.131 [http-nio-8080-exec-1] INFO  [c.h.j.s.c.DemoController:22] - ======info
2019-03-07 11:39:17.134 [http-nio-8080-exec-1] WARN  [c.h.j.s.c.DemoController:23] - ======warn
2019-03-07 11:39:17.134 [http-nio-8080-exec-1] WARN  [c.h.j.s.c.DemoController:23] - ======warn
2019-03-07 11:39:17.134 [http-nio-8080-exec-1] ERROR [c.h.j.s.c.DemoController:24] - ======error
2019-03-07 11:39:17.134 [http-nio-8080-exec-1] ERROR [c.h.j.s.c.DemoController:24] - ======error

       此处可能令人困惑, <root>日志级别不是error么,怎么还会打印info和warn级别的日志?这里是因为日志信息向上传递后,日志级别会由下级的level来决定!所以即使info日志也会打印!! 因此注意一般实际使用中additivity常常设置为false。

4. appender

见最实用的logback讲解(2)

【Logback】Logback 中的 Appenders Appender组件负责处理Logback日志写入的任务,该组件必须实现接口,该接口的主要方法总结如下://主要是解决将日志写到哪里去的问题//核心方法Appender接口中其实就一个最核心的方法,即doAppend()方法,且该方法只有一个参数,也就是类型为 E 的对象实例。泛型 E 的实例类型需要根据 logback 的具体模块进行决定,在模块内,E 的类型为ILoggingEvent(日志记录事件),在模块内,E 的类型为。 阅读详情

相关推荐

深入讲解Logback

什么是Logback ogback是由log4j创始人设计的又一个开源日志组件。是log4j的一个 改良版本。此外完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。 在springboot中如何使用logback 这部分网上已经被人写烂了,我就不写了,随便丢一个教程吧 https://blog.youkuaiyun.com/white_ice/article/details/

诺浅的专栏 737

Logback日志框架

Logback日志框架 1、Logback入门案例 1、Logback简介 官方网站:https://logback.qos.ch/index.html、Maven 仓库地址:https://search.maven.org/artifact/ch.qos.logback/logback-classic Logback日志框架的优势: Logback 是 log4j 框架的作者开发的新一代日志框架(性能比Log4j要好),它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J Logback的定制性更

路边烧卖 3730

Logback日志框架实用教程:配置与实践

Logback是Java应用中一个功能强大的日志记录框架,作为Log4j的后继版本,它更加高效和易于使用。在日常开发中,合理地利用Logback不仅可以帮助开发者捕捉错误、监控应用状态,而且还可以通过其灵活的配置,定制日志输出到控制台、文件系统等,为系统诊断和分析提供强大的支持。在软件开发中,项目往往依赖于许多外部库,而依赖管理确保了项目依赖关系的正确性、完整性和一致性。依赖管理有助于解决版本冲突、依赖遗漏或冗余等问题,使得项目的构建和维护更加便捷。

weixin_26907223的博客 787

【Spring实战】15 Logback

Spring 作为一个现代化的 Java 开发框架,提供了很多便利的功能,其中包括灵活而强大的日志记录。本文将介绍如何结合 Spring 和 Logback 配置和使用日志,并通过实际的例子演示日志的记录和输出。

好久不见的流星 1547

制造业私有化LLM部署实战:从RAG到智能体,构建企业专属知识大脑

大型语言模型(LLM)作为人工智能的核心技术,通过在海量文本数据上进行预训练,具备了强大的语言理解和生成能力。其原理在于基于Transformer架构,通过自注意力机制捕捉长距离语义依赖。这一技术价值在于能将非结构化信息转化为可计算、可推理的知识,从而赋能企业实现知识的高效管理与应用。在制造业等强数据安全与知识密集型领域,私有化部署的LLM结合检索增强生成(RAG)和智能体(Agent)技术,能够深入业务流程,构建安全、专属的智能知识中枢。本文聚焦于如何利用Qwen、LangChain、向量数据库等技术栈,

weixin_42523711的博客 250

深度学习中的注意力机制

最近两年,注意力模型(Attention Model)被广泛使用在自然语言处理、图像识别及语音识别等各种不同类型的深度学习任务中,是深度学习技术中最值得关注与深入了解的核心技术之一。本文以机器翻译为例,深入浅出地介绍了深度学习中注意力机制的原理及关键计算机制,同时也抽象出其本质思想,并介绍了注意力模型在图像及语音等领域的典型应用场景。

优快云人工智能 4万+

Spring通用配置文件模板(logback、pom等配置文件)

本文主要存放通用的配置文件模板,大部分项目可拿来即用(或者简单修改)。例如logback、pom等

zyplanke的专栏 1802

在昇腾910B上,用kubeadm快速拉起一个双节点K8s集群(保姆级避坑指南)

本文详细介绍了在昇腾910B服务器上使用kubeadm快速搭建双节点Kubernetes集群的完整流程,包括环境准备、容器运行时配置、kubeadm初始化、节点加入与网络插件部署等关键步骤,特别针对ARM架构和昇腾芯片提供了优化配置和避坑指南。

weixin_29204749的博客 247

java 如何去掉http debug日志_Spring Boot手把手教学(3):从零配置logback日志

前言使用logback我们可以自定义控制台日志输出,可以实现对不同日志不同级别打印到不同的文件中,可以对日志进行归档保存,并定时删除;对于一个应用来讲,一个好的日志系统,对于对问题的追溯有很大的帮助,也有助于线上问题的查找和解决,所以我们来配置下logback日志。我们在初始化Spring Boot项目的时候,默认安装了spring-boot-starter-web,另外Spring Boot默认...

weixin_39844525的博客 559

LLM大模型基础知识【一】

大语言模型(LLM):是指在自然语言处理(Natural Language Processing,NLP)领域中的一类大模型,通常用于处理文本数据和理解自然语言。这类大模型的主要特点是它们在大规模语料库上进行了训练,以学习自然语言的各种语法、语义和语境规则。例如:GPT系列(OpenAI)、Bard(Google)、文心一言(百度)。视觉大模型:是指在计算机视觉(Computer Vision,CV)领域中使用的大模型,通常用于图像处理和分析。

lin_xi_xi的博客 2882

大学计算 - NumPy库的矩阵运算 实训答案

本文介绍了三个NumPy矩阵操作的实验练习。第一关练习ndarray类型操作,包括矩阵构造、元素平方和计算、矩阵乘积运算和逆矩阵行列式计算;第二关针对matrix类型,涉及绝对值最大值获取、特定矩阵乘积运算和转置矩阵特征值计算;第三关实现Moore-Penrose伪逆矩阵计算,并与NumPy内置pinv函数结果比较误差。实验涵盖了NumPy核心矩阵操作,展示了从基础运算到高级矩阵分解的应用,帮助掌握科学计算中的矩阵处理技巧。

2403_89314916的博客 312

Spring Boot logback配置

如果你不想让其打印CONDITIONS EVALUATION REPORT这个需要再yml文件中配置。在resources新建logback.xml文件内容为。首先在.pom文件中引入。

m0_45212207的博客 325

基于DINO自监督学习对YOLO11 Backbone进行预训练

这PoolHead将获取前一层的输出并应用卷积,然后应用自适应平均池化以将特征图的空间维度减小为固定且一致的大小(1x1)。这是必需的,因为否则空间维度会根据输入的大小而变化,这将使将 DINO 头部附加到主干变得困难,因为它需要固定的输入大小。在本指南中,我们将介绍如何使用 Lightly 使用 DINO 预训练 YOLO 11主干,以及如何将其重新加载到 Ultralytics 中进行微调。您可以使用不同的大小,例如,640这与 YOLO 中的默认图像大小更一致,但它也会在训练期间消耗更多 VRAM。

如果想成为中心,那么就到中心去吧。 1014

最实用的logback讲解(2)—appender

文章目录2.1 ConsoleAppender2. FileAppender2.3 RollingFileAppender2.3.1 triggeringPolicy触发策略2.3.2 rollingPolicy滚动策略 &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp; &am

学习 5356

2025华为OD 面试手撕代码真题【字符串至多删除一个字符,是否能构成回文串】

2025华为OD 面试手撕代码真题【字符串至多删除一个字符,是否能构成回文串】

MISAYAONE的博客 1708

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

logback最详细配置讲解,及命名规范

介绍 logback是一款日志框架。这个就不详细赘述了 命名规范 一般来说logback的配置文件可以命名为logback.xml,项目启动时就可以读取到里面的配置。但是在spring-boot项目中,这样会有一点问题。因为logback.xml会先于spring-boot的配置文件application.yml读取,导致在logback.xml中读取application.yml中配置的值时会读取不到,导致项目报错。 这里举个例子。在application.yml中配置了项目名称application.n

NullPointer 5168

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SpringBoot 整合logback日志详解讲解

本文介绍了SpringBoot中的日志框架选择与实战应用。主要内容包括:1)日志框架分为日志门面(如SLF4J)和日志实现(如Logback),推荐使用SLF4J+Logback组合;2)SLF4J采用门面模式,通过桥接组件适配不同日志实现;3)SpringBoot默认集成Logback,可通过logback-spring.xml配置文件自定义日志格式和输出路径。文章强调了应面向抽象编程,直接使用SLF4J接口而非具体实现,并提供了代码示例和配置文件模板。

weixin_53818428的博客 1119

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

springboot使用logback及配置文件讲解

文章目录一、日志级别二、SpringBoot引入logger三、通过springboot配置文件配置logback四、通过XMl文件自定义logback配置4.1configuration父标签4.2 contextName属性4.3 property属性4.4 appender节点4.4.1 控制台输出appender4.4.2 文件输入appender4.5 root节点-启用配4.6 logger节点4.7 root和logger的关系4.8多环境日志配置 日志处理是一个正式项目必备的功能,日志要能够

Apple_Boy的博客 1万+

logback讲解

配置文件 先讲讲这个配置文件的故事。 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;configuration&gt; &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt; &lt;encoder c

笔记小屋 861

Logback日志技术

文章主要介绍了 Logback 日志技术,包括日志的定义及作用,sout 的局限,日志技术的迭代(如 JUL、Log4j、Logback、Slf4j),Logback 的快速入门(引入依赖、配置文件、定义 Logger 对象),配置文件对控制台和系统文件输出的设置,以及常见的日志级别(trace、debug、info、warn、error)。

Aishangyuwen的博客 1328

logback property 默认值_logback 日志详细讲解

Logback介绍Logback是一个开源日志组件,logback被分为3个组件,logback-core,logback-classic和logback-access.Logback是具体的日志框架,它要与slf4j结合起来使用。Slf4j:简单日志门面,不是具体的日志解决方案,它只服务于各种各样的日志系统。slf4j和logback是如何绑定的?Slf4j和logback是在编译期间绑定的,在...

weixin_39614754的博客 602

Logback中文网:Logback学习笔记(三)配置Logback(1)

一、配置Logback 可以通过以下三种方式配置Logback: 编程方式 配置 XML 脚本 配置Groovy 格式 logback 的初始化步骤: logback 会在类路径下寻找名为 logback-test.xml 的文件。 如果没有找到,logback 会继续寻找名为 logback.groovy 的文件。 如果没有找到,logback 会继续寻找名为 logbac...

Vaingloryss的博客 874

Logback 配置详情

logback 的配置,需要配置输出源 appender,打日志的 logger(子节点)和 root(根节点)。实际上,它输出日志是从子节点开始,子节点如果有输出源直接输出,如果无,判断配置的 additivity,是否向上级传递,即是否向 root 传递,传递则采用 root 的输出源,否则不输出日志。

大大怪将军的博客 1136
上一篇: netstat命令查看套接字信息
下一篇: 最实用的logback讲解(2)—appender
余生之君
博客等级 码龄10年 246粉丝 98原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值