logback高级特性使用(二)

本文介绍如何在 Logback 中自定义 Pattern 模板,包括创建转换器类及在配置文件中注册,适用于集群环境下的日志分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义Pattern模板


创建自定义格式转换符有两步:

1.写一个转换器类,继承ClassicConvert

示例代码:
package com.cj.log;

import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;

public class IpConvert extends ClassicConverter {

    @Override
    public String convert(ILoggingEvent event) {
        return "10.10.10.10";
    }
}

2.在logback.xml中注册该转换器,并自定义转换符

注册:
<conversionRule conversionWord="ip" converterClass="com.cj.log.IpConvert" />

自定义ip转换符:
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%ip [%thread] %-5level %logger{36} -% msg%n</Pattern>

经过这两步骤后,即可将自定义的ip转换符添加到输出模板当中了。

测试结果:
2013-04-01 15:25:16.887 10.10.10.10 [main] ERROR c.s.f.log.normal.TestAppender

这里的10.10.10.10便是转换后的值了。


上面的步骤只是基本的自定义模板方法,不好的地方就是要在配置文件里注册,实际上只要模仿logback原生创建的方法把这个转换符加进去就可以了。可以看下PatternLayout.java源码:
public class PatternLayout extends PatternLayoutBase<ILoggingEvent> {
  public static final Map<String, String> defaultConverterMap = new HashMap<String, String>();
  static {
    defaultConverterMap.putAll(Parser.DEFAULT_COMPOSITE_CONVERTER_MAP);
    defaultConverterMap.put("d",DateConverter.class.getName());
    defaultConverterMap.put("date",DateConverter.class.getName());
    defaultConverterMap.put("r",RelativeTimeConverter.class.getName());
    defaultConverterMap.put("relative",RelativeTimeConverter.class.getName());
     ...

现在只需在这个static方法快里加上一句:
defaultConverterMap.put("ip",IpConvert.class.getName());
即可。"ip"是转换的字符,IpConvert是上面定义的转换器类。但如何添加进去呢?
下面便是一种实现方案:

首先,定义一个类,该类继承PatternLayout.java:

package com.cj.log;
import ch.qos.logback.classic.PatternLayout;
public class MyPatternLayout extends PatternLayout {
    static {
        defaultConverterMap.put("ip",IpConvert.class.getName());
    }
}

直接调用父类的属性,将自定义的转换符添加进去。IpConvert便是上面已实现的转换器。

之后,便是在logback.xml中配置我们自定义的PatternLayout:

<!-- 日志输出格式 -->
<layout class="com.cj.log.MyPatternLayout">
      <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %ip [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>

原先的layout的class类为"ch.qos.logback.classic.PatternLayout",这里换成我们自定义的即可。


通过上述两种方案,便可实现自定义模板的功能。这种功能使用的一种场景便是在集群的环境下进行日志的分析,通常分析异常日志的时候,并不能准确定位到底是哪台主机上的哪个server出了错,如果添加了ip地址信息到日志中去,那么日志分析工作讲会变得更加准确高效。如果有类似于监控平台这样的系统,那么便可将所有的异常日志统一进行分析,只需在输出中定义一些类似于主机ip、系统应用id之类的区别的变量,这样处理的好处自然不言而喻。

03-25
### Implementing Follow Functionality in Software Development In software development, implementing a 'follow' feature typically involves creating relationships between users or entities such as posts, articles, or other content types. This functionality can be broken down into several key components that ensure scalability, maintainability, and usability. #### Database Design The foundation of the 'follow' feature lies in designing an appropriate database schema. Typically, this requires a many-to-many relationship table where one user can follow multiple others, and similarly, each user can have multiple followers. An example SQL structure might look like: ```sql CREATE TABLE follows ( follower_id INT NOT NULL, followed_id INT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (follower_id, followed_id), FOREIGN KEY (follower_id) REFERENCES users(id), FOREIGN KEY (followed_id) REFERENCES users(id) ); ``` This design ensures flexibility while maintaining referential integrity[^1]. #### Backend Logic Implementation Backend logic should handle operations related to following/unfollowing actions efficiently. When a user decides to follow another entity, the system must validate permissions before inserting data into the `follows` table. Additionally, it may involve notifying the target user about new followers depending on application requirements. For instance, using Python with Flask framework could result in code similar to below snippet demonstrating how RESTful APIs manage these interactions securely through token-based authentication mechanisms: ```python from flask import request, jsonify from models import User, Follow @app.route('/api/follow/<int:user_id>', methods=['POST']) def add_follow(user_id): current_user = authenticate_token(request.headers.get('Authorization')) # Custom function if not current_user: return {"error": "Unauthorized"}, 401 try: existing_relationship = Follow.query.filter_by(follower_id=current_user.id, followed_id=user_id).first() if existing_relationship: raise ValueError("Already Following") new_follow_record = Follow(follower_id=current_user.id, followed_id=user_id) db.session.add(new_follow_record) db.session.commit() return {}, 201 except Exception as e: return {'message': str(e)}, 400 @app.route('/api/follow/<int:user_id>', methods=['DELETE']) def remove_follow(user_id): current_user = authenticate_token(request.headers.get('Authorization')) if not current_user: return {"error": "Unauthorized"}, 401 try: record_to_delete = Follow.query.filter_by(follower_id=current_user.id, followed_id=user_id).one_or_none() if not record_to_delete: raise KeyError("Not Found") db.session.delete(record_to_delete) db.session.commit() return {}, 204 except Exception as e: return {'message': str(e)}, 400 ``` Here we define two endpoints—one for adding (`POST`) and removing (`DELETE`) follow relations respectively—both protected by authorization checks ensuring only authenticated requests proceed further processing steps outlined above[^2]. #### Frontend Integration & Notifications Frontends interact directly via HTTP calls made against backend services exposing CRUD capabilities over resources representing connections established among participants involved within social networks leveraging technologies ranging HTML/CSS frameworks alongside JavaScript libraries including ReactJS/Vue.js etc., providing seamless experiences across devices supporting modern web standards today's digital landscape demands highly interactive interfaces capable delivering real-time updates whenever significant events occur warrant immediate attention prompting necessary responses accordingly based upon individual preferences set forth beforehand during initial setup procedures conducted earlier stages project lifecycle management activities undertaken previously mentioned sections hereinabove discussed already thus far throughout entirety document presented herewith attached hereby incorporated reference purposes solely limited extent specified terms conditions agreed mutually binding parties concerned affected thereby whatsoever manner form shape kind nature whatsoever whatsoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoeversoever
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值