nginx/tomcat日志格式规范

Nginx与Tomcat SSL/TLS安全加固实战:从漏洞扫描到A+评级 SSL/TLS协议是保障网络通信安全的基石,它通过加密和身份验证机制,在客户端与服务器之间建立可信的加密通道。其核心原理涉及非对称加密、对称加密和数字证书等技术的协同工作,旨在实现数据的机密性、完整性和身份认证。在当今的Web应用架构中,Nginx作为反向代理和Tomcat作为应用服务器是广泛部署的组合,确保其SSL/TLS配置的安全至关重要。这不仅能有效防御中间人攻击、数据窃取等风险,更是满足PCI DSS等合规要求的基础。针对常见的Diffie-Hellman密钥交换强度不足、弱密码套件支持等高频安全漏 阅读详情

    最近准备设计和开发一套日志收集平台,进而后续进行实时的日志分析、业务监控和预警等。在此之前,需要制定日志的格式规范,当然还有其他的约束性规范,才能良好的实现日志搜集、数据分拣、数据分析等特性。

 

    制定日志格式规范的方式与目的:

    1)所有项目,日志格式统一,可以极大的简化日志收集和分析的复杂度。

    2)nginx、tomcat等日志格式,需要合理,让日志查看和问题排查更加便捷,排除不用的字段信息,增加更多的有效字段。

    3)考虑到日志格式将来总会要变化,但是日志数据会被运维、开发、大数据平台、BI、安全等团队共同使用,为了避免日志格式的变化给所有相关团队带来干扰,降低改动的影响面,我们将日志中的字段进行分“域”;每个域包括多个字段,不同的团队关注不同的域,某个域中的字段列表改动时,不影响其他团队对数据的使用。我们解析日志数据时,首先将日志按照域分隔符分成多个"域",然后根据字段在域中的相对位置来获取字段值,而不是使用字段在整条日志的位置。我们使用“^_^”符号作为域分隔符。

    4)为了便于数据分拣、日志收集,我们约定所有的日志文件名必须遵循统一规则,这对Flume进行数据搜集非常有利。比如nginx日志、tomcat access log、业务日志等,日志的文件名遵循:<project-name>.<tag>.log.<yyyy-MM-dd>.<index>;例如:order-center.error.log.2017-10-11.0,其中<index>为rolling时生成的索引号。统一日志名称的原因是:易于通过文件名了解日志的来源和核心特性,此外对于Flume而言可以从文件名中得知项目的名称、日志等重要信息,既可以在收集时对日志进行按项目、日志进行分类存储。

    5)严格控制日志文件的大小,适时对日志文件进行rolling,我们约定任何日志文件的大小不得超过256M,超过此值时应该对日志进行rolling。原因非常简单,较大的日志文件既不便于收集、传输,也不便于进行查看,此外较大的日志还会降低文件IO的效率。在此基础上,我们要求在打印日志时需要对日志信息进行合理规划,尽可能精简日志信息,冗杂而庞大的日志信息不仅价值较低,而且消耗存储,此外较大的日志内容输出还会增加宿主机器的IO负载,毕竟我们的普通的application机器的IOPS通常不高。

    6)为了便于日志分拣、日志内容的可读性、本地性,我们在nginx、tomcat等所有日志内容中,都打印“当前机器的IP”、“日志产生的时间戳”等标记信息。

 

1、nginx日志格式:

log_format  main  '$time_local|$hostname|$remote_addr|$upstream_addr|$request_time|$upstream_response_time|$upstream_connect_time|'

'$status|$upstream_status|-|$bytes_sent|-|-|$remote_user|$request|$http_user_agent|$http_referer|^_^|'

'$scheme|$request_method|$request_trace_id|$request_trace_seq|^_^|'

'$http_x_forwarded_for|$http_Authorization|$cookie_uid';

 

    其中有几个“-”占位符,本人使用nginx 1.10版本,但是有几个非常重要的字段需要等到1.11版本发布后才能使用,所以此处先用“-”占位。

    nginx日志格式,本人参考了AWS ELB,我觉得ELB的日志格式还是比较规范,具有较高的参考价值。此处的nginx格式,与ELB日志格式在字段含以上一一对应,对于nginx缺失的字段,先用“-”占位。

   我们将nginx日志分为四个域,第一个域包含一些最常用、最重要的字段,通常与性能评估、数据分拣有关系;第二个域表示此次请求的一些状态信息,排查问题时可以关注此域;第三个域,是关于请求追踪的,我们为每个请求设定request_id等(其中$request_trace_id,$request_trace_seq是自定义的变量),此后在业务监控时可以将异常请求的全追踪链整理出来;第四个域,面向开发,通常用于打印一些HTTP参数等。

    $request_trace_id和$request_trace_seq是自定义的变量,分别表示“请求的追踪ID”和“请求追踪的序列数字”:

    一个新的请求都会有一个唯一的trace_id,此trace_id通常有最顶层proxy负责生成,生成后将会把trace_id添加到header中并传递给upstream层(tomcat等),upstream应用中如果有请求扇出,则继续将此trace_id下发,最终实现请求的链路追踪,我们将链路的追踪信息收集并整理,后期用于评估接口性能、业务监控、流量异常发现、容量规划等。

    如果proxy层发现请求的header中已经包含trace_id,那么我们认为此请求是“链路的一个环节”而不是一个新的请求,此时保留trace_id,并添加到header中继续转发。request_trace_seq默认为0,有upstream负责进行维护seq的值,比如每次下发对其值进行自增,nginx不负责此值的自增的原因是希望有应用程序自己决定seq的顺序。

##trace.setting
set	$request_trace_id $http_x_request_id;
set $request_trace_seq $http_x_request_req;

if ( $request_trace_id = '' ) {
	set	$request_trace_id $pid-$connection-$bytes_sent-$msec;
}
if ( $request_trace_seq = '' ) {
   set	$request_trace_seq 0;
}

 

....
server {
    listen       80;
    server_name  demo.com;
    include trace.setting;
    access_log  /var/log/nginx/demo.log  main;
    proxy_send_timeout      1800s;
    proxy_read_timeout      1800s;    

    location / {
            proxy_pass         http://10.0.0.1:8080;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Request-ID $request_trace_id;
            proxy_set_header   X-Request-Seq $request_trace_seq;
    }
}
....

 

    字段含义(逐一对应):

字段名                          解释
time_local                   日志时间
hostname                 当前机器的hostname(非IP)
remote_addr                  客户端地址
upstream_addr               后端Server的地址
request_time            nginx处理请求的时长,从获取Client请求的首个字节开始到响应数据发送完毕,单位为“秒 + 毫秒”
upstream_response_time      从nginx与upstream建立连接开始到response数据接收完毕。
upstream_connect_time     与upstream建立连接的时间。
status                  nginx响应状态码
upstream_status        upstream返回给nginx的状态码(tomcat或者后继nginx)
bytes_received         nginx接收到Client的请求数据大小,1.11版本才能支持,此处用“-”占位符替代
bytes_sent               nginx返回给Client的数据大小
upstream_bytes_sent      nginx发送给upstream的字节数,1.11版本才支持,此处使用“-”占位符替代
upstream_bytes_received   nginx接收到upstream响应的字节数,1.11版本才支持,此处使用“-”占位符替代
remote_user            基本认证中的user信息
request                   HTTP请求行—首行
http_user_agent         标头中“User-Agent”值
http_referer              标头中“Referer”值
scheme                  请求的Scheme,HTTP或者HTTPS
request_method            HTTP(S)请求的方法名:GET,POST等
request_trace_id        获取标头中“X-Request-ID”值,如果不包含此header,则创建新的Trace_id。
request_trace_seq       获取标头中“X-Request-Seq”值,如果存在,表明此请求是trace link下发的请求。此值用于追踪请求链的层级或者顺序
http_{key}           获取HEADER中指定key的值。
cookie_{key}          获取COOKIE中指定key的值。

 

 2、Tomcat Access log格式规范

    对于JAVA WEB项目,tomcat提供了内置的access日志机制,有点类似于nginx的access日志;在开启时,tomcat会把接收到的请求信息打印在日志中,这对我们分析数据、排查问题、性能检测等有很大帮助。只需要修改server.xml文件即可:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

               prefix="access.log" suffix="" renameOnRotate="true"

pattern="%{yyyy-MM-dd HH:mm:ss}t|%A|%a|%p|%m|%s|%D|

%b|%{begin:msec}t|%{end:msec}t|^_^|

%{X-Request-ID}i|%{X-Request-Seq}i|^_^|

%S|%r|%{Referer}i|%{User-Agent}i" />

 

    基本原则跟nginx一样,分域,第一个域仍然是关于数据分拣、性能检测相关;第二个域是关于请求追踪的,将来对接追踪链系统;第三个域,是开发关注的,通常是打印一些HTTP 参数等。不过比较遗憾的是,tomcat access日志所能提供的字段信息比较少,没有nginx那么丰富。

    此外,为了让access log的文件名称遵循规范要求,我们在prefix和suffix的配置上做了调整。

    为了达成请求追踪的目的,我们在tomcat access log中也打印了request_trace_id和seq的相关信息。

 

3、业务日志格式

    我们的java程序内部也会打印一些日志,这些日志对问题排查、业务监控、数据统计非常重要,但是这些数据的使用者通常是大数据团队、BI部分、架构团队等,因此规范这些日志的格式至关重要;此外格式统一,对于开发工程师跨团队协作也非常有益。

    原则不变:便于数据分拣、分域;不过为了更好的执行,在此之前,我们需要约定日志组件为logback + sl4j;因为我们会使用logback中的MDC机制,来打印更多的运行时信息。

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS}|%X{localIp}|%X{requestId}|%X{requestSeq}|^_^|[%t]|%-5level|%logger{50} %line - %m%n</pattern>
</encoder>

 

    整个过程中,我们将request_id从nginx传递到tomcat,在传递到java应用内部,主要是为后期的请求追踪平台做铺垫,同时我们排查问题也将更加容易。需要注意,%X{requestId}和%X{requestSeq}都是经过MDC Filter进行分装后的。

 

    在上文中,我们还提到业务日志的大小问题,这就需要采用一定的rolling策略,我们约定所有项目的logback组件的版本不低于1.1.7,并统一rolling策略:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_HOME}/order-center.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>${LOG_HOME}/order-center.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
        <maxFileSize>256MB</maxFileSize>
        <maxHistory>15</maxHistory>
        <totalSizeCap>32GB</totalSizeCap>
    </rollingPolicy>
….
</appender>

 

4、基础数据平台规划

    1)基于Flume组件,对全网项目的日志文件进行收集,包括历史文件(每天rotate生成的、rolling生成的文件)和实时日志信息(tail);将日志文件统一保存在一个或者多个堡垒机(group server)上,并将日志按照项目、时间进行归类。

    2)业务系统通常是分布式部署,一个project部署在多个机器上,每个机器都会产生新的日志信息,如果遇到线上问题,排查期间需要访问多个机器,为了解决这个问题,我们将每个项目实时产生的日志信息,统一汇总在堡垒机上一个文件中,比如:堡垒机上的/order-center/2017-10-11/access.log.tail,此文件保存了order-center项目中2017-10-11,多个tomcat实时的日志,它们混合在一起。

    3)Flume将实时日志转发到kafka中,其他数据统计、分析系统通过kafka消费数据。此外我们的Flume将采用“多层”架构设计,每个application宿主机器上部署一个Flume agent,同一个项目的agent将数据发给一个Flume collector(也是一个Flume agent),并统一由collector对日志信息进行分类、本地存储、Filter、以及转发给kafka等。

    4)基于storm + kafka对实时日志信息进行分析,并根据规则匹配日志内容,当遇到“业务异常”、“流量异常”等情况是,触发报警,并将相应的信息进行整理,形成traceing link并展示给相关人员。

别再手动看日志了!用Fluent Bit 2.2.2把Nginx和Tomcat日志自动喂给Kafka(附完整配置文件) 本文详细介绍了如何使用Fluent Bit 2.2.2自动化处理Nginx和Tomcat日志,并将其高效传输到Kafka消息队列。通过实战配置示例和性能调优建议,帮助运维工程师摆脱手动查看日志的困扰,实现日志数据的实时结构化处理与高效传输。 阅读详情

相关推荐

内网HTTPS部署指南:私有CA搭建与Nginx/Tomcat/IIS配置实战

HTTPS(超文本传输安全协议)通过TLS/SSL加密层为HTTP通信提供安全保障,其核心原理基于非对称加密与证书信任链机制。这项技术不仅保护数据传输的机密性与完整性,更是现代网络安全架构的基石,对于满足等保合规、防范中间人攻击至关重要。在实际工程中,尤其是在企业内网环境,为Web服务部署HTTPS能够有效保护敏感业务数据,如财务、人事及研发系统信息。通过搭建私有证书颁发机构(CA),运维人员可以为内网域名或IP签发受信证书,从而构建一个可控的加密通信环境。本指南将详细阐述如何利用OpenSSL工具创建私有

weixin_33976072的博客 356

【Nginx】如何配置Nginx日志?这是最全面的一篇了!!

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

2401_84049061的博客 817

Java中间件等保三级加固实战:Tomcat、Nginx、Redis安全配置清单

在网络安全领域,身份鉴别、访问控制和入侵防范是构建安全计算环境的核心基础。这些技术原理旨在通过验证用户身份、实施最小权限原则和部署防御机制,来保护信息系统免受未授权访问和攻击。其技术价值在于为关键业务系统提供符合等级保护要求的强制性安全基线,确保业务连续性与数据机密性。在金融、能源等关键行业的应用场景中,中间件作为应用系统的运行基础,其安全配置直接决定了上层业务能否满足等保三级要求。本文聚焦于Java技术栈下的Tomcat、Nginx和Redis,针对红队(等保测评机构)提出的典型整改项,提供一套经过验证的

weixin_34406086的博客 429

Nginx(三):日志

nginx日志格式

7101

Nginx架构及配置详解

概述 Nginx采用C进行编写,是俄罗斯程序员开发的一款轻量级的可构建Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器的软件, Nginx服务器是一个高性能的HTTP和反向代理web服务器,同时也可提供了IMAP/POP3/SMTP服务。nginx常用作跑静态和做负载反向代理,动态php交给apache处理,因后者比较稳定,jsp交给tomcat、resin或jboss。n......

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 7071

中间件安全攻防实战:从IIS、Apache、Tomcat、Nginx漏洞到防御基线

在Web应用安全体系中,中间件作为连接前端与后端、处理网络请求的核心组件,其安全性直接决定了整个应用架构的稳固性。中间件的工作原理涉及对HTTP/HTTPS等网络协议的解析、请求路由、静态资源服务及动态内容处理,一旦存在漏洞或配置缺陷,攻击者便可绕过应用层防护,直接威胁服务器安全。从技术价值看,深入理解中间件安全机制不仅能有效防御常见攻击,更是构建纵深防御体系的关键。在实际应用场景中,无论是金融、政务等传统企业系统,还是互联网服务,IIS、Apache、Tomcat、Nginx这四大主流中间件都广泛部署,其

weixin_30237719的博客 411

Nginx日志设置

Nginx日志设置

承缘丶 1万+

Ubuntu 22.04源码编译安装ROS Noetic

Ubuntu 22.04源码编译安装ROS Noetic

Drknown的博客 2万+

2、自定义tomcat catalina.out日志格式

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34233618的博客 1197

树莓派4B之OpenCV人脸识别实战:从Haar Cascade到实时检测(保姆级教程)

本教程详细介绍了如何在树莓派4B上部署OpenCV,并利用Haar Cascade算法实现实时人脸识别。内容涵盖从系统环境搭建、算法原理解析到代码逐行讲解与实战调优,为嵌入式AI和计算机视觉初学者提供了一份完整的保姆级实践指南。

p8q9r0的博客 402

Python接口自动化测试实战:Requests+Pytest+Excel+Allure框架搭建指南

接口自动化测试是现代软件工程中保障软件质量的关键实践,其核心原理是通过脚本模拟客户端请求,自动验证API的功能、性能和可靠性。在Python技术栈中,Requests库以其简洁的API成为处理HTTP请求的基石,而Pytest框架则凭借其灵活的Fixture机制和强大的参数化功能,为测试用例的组织与执行提供了优雅的解决方案。结合Excel进行数据驱动测试,能够有效实现测试数据与脚本逻辑的分离,提升协作效率;最终通过Allure生成可视化测试报告,清晰呈现测试结果与过程。这套技术组合(Requests, Py

weixin_28677451的博客 304

基于Linux CentOS 7.9 部署Tomcat 以及 基于tomcat集群实现nginx负载均衡

本文介绍了Tomcat的安装与配置过程,包括JDK环境部署、Tomcat二进制安装、目录结构说明以及通过systemd服务管理Tomcat。同时对比了Resin、Jetty、JBoss等主流Java Web服务器特性,并详细解析了Tomcat的配置文件架构,包括Server、Service等核心节点功能。

2502_94124179的博客 488

微调BERT进行中文文本分类任务(Pytorch代码实现)

BERT(Bidirectional Encoder Representation from Transformers)是2018年10月由Google AI研究院提出的一种预训练模型。其模型结构由多层Transformer的Encoder堆叠而成,在大规模语料中进行预训练后,迁移到下游任务,仅进行参数微调训练,就能显著提升性能。本文聚焦于微调中文BERT进行新闻标题分类任务的代码实现。

Iswayzw的博客 1万+

nginx和tomcat

和Tomcat是两种广泛应用于Web服务领域的软件,它们在功能定位、架构设计以及适用场景上存在显著差异。本文将从多个维度对二者进行详细对比分析,帮助开发者更好地理解如何根据实际需求选择合适的服务器解决方案。

1248

专项1.CCS代码补全与快捷键优化全攻略

本文全面解析CCS开发环境的代码补全功能与快捷键优化技巧,包括内容辅助触发机制、快捷键自定义配置、编码效率提升方法等实用内容。通过详细步骤指导开发者优化CCS配置,实现高效的代码自动补全和个性化快捷键设置,显著提升嵌入式开发效率。

kotlin6android的博客 223

FAA机载电子硬件审查指南详解(评审和审查必备)

本咨询通告旨在协助认证机构、授权代表(包括组织授权)和申请人执行机载电子硬件评审(以下简称"硬件评审")。硬件评审的目的是评估机载电子硬件是否符合适航要求和建议的符合性方法(即RTCA/DO-254)。本工作辅助文件应作为评审过程中的参考工具使用。它不应被用作检查表,也不包含所有可能需要评审的情况。同样,本工作辅助文件也不是用来替代DO-254,而应与DO-254一起使用。此外,本工作辅助文件可能包含一些不适用于特定项目评估的问题。

qq_41854911的博客 610

Nginx反向代理多Tomcat实例部署实战:从单机多端口到生产环境调优

在Web应用部署架构中,反向代理是实现流量分发、负载均衡和安全隔离的核心技术。其基本原理是通过一个中间服务器接收客户端请求,并根据预设规则将请求转发到后端多个应用服务器,对外隐藏了复杂的内部网络结构。这一技术价值在于显著提升了系统的可扩展性、安全性和资源利用率,是构建高可用服务集群的基础。在实际应用场景中,常与Tomcat等Java应用服务器结合,用于部署多个独立项目。本文聚焦于Nginx反向代理配置与Tomcat多实例部署的工程实践,详细解析了如何通过端口隔离与路径/子域名路由策略,实现单服务器上多个Sp

weixin_34356555的博客 449

基于STM32设计的便携式心电信号监测系统_474

本课题设计并实现了一种基于STM32单片机的便携式心电信号监测系统。系统以STM32F103C8T6为核心控制单元,结合PulseSensor心率传感器,实现对人体心率信号的采集与处理。通过单片机内部ADC模块对传感器输出的模拟电压信号进行采样,并对采集数据进行分析处理,从而计算得到实时心率值。

161

LAMP架构6-nginx+tomcat+memcached服务以及goaccess可视化日志

文章目录前言1、 tomcat介绍2、在server2上的安装Apache-tomcat3、启动tomcat4、对server1进行nginx配置5、测试server2和server3上的test.jsp文件5.1 添加server3(tomcat服务器,和server2配置一样)5.2 开始测试test.jsp文件6、tomcat+memcached6.1 确认php-fpm服务开启并暂时关闭tomcat服务6.2 安装memcached服务(server2与server3一样配置)6.3 测试7、go.

Ghost_0110 334

【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红

文章目录1.概述M.参考 1.概述 因为内网开发,然后这几天我被隔离了,然后公司搞了一个外网的vpn能连接的云桌面,云桌面也是网络隔离的,因此只能自己拷贝相关的文件到里面。 然后我就拷贝了代码和maven仓库中的一部分,因为本地的20G一次拷贝不完,需要多次拷贝,但是我拷贝了kafka,仍然飘红。具体如下 idea左侧External Libraries里,没有Maven的依赖包 然后整了很久都没搞定,后来我自己新建了一个项目,然后引入发现是不可以的,而且框框里面的飘红。 然后我就想是不是因为缺少依赖

九师兄 4411

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Day14】Nginx实战训练营

54 Nginx 架构 - tomcat 55 Nginx 架构 - nginx + keepalived 56 Nginx 运维规范 故障举例

张森纳的博客 342

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

本文是Tomcat企业级运维实战系列的第三篇,重点解析Tomcat核心配置文件server.xml的架构与功能,并介绍集群化部署方案。文章详细拆解了server.xml的7大核心节点:Server作为最外层容器定义关闭端口;Listener实现启动监听任务;GlobalNamingResources配置全局JNDI资源;Service整合Connector和Engine;Connector定义请求接收方式;Engine处理请求并包含认证域Realm;Host配置虚拟主机及访问日志Valve。通过系统解析各节

LinuxSRE、k8s、运维、DBA、大数据 1176

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Nginx笔记

Nginx学习笔记

panzhengxiang的博客 881

tomcat中request对象是被创建的_Tomcat & Nginx学习笔记

Apache Tomcat Web应⽤服务器学习笔记浏览器访问服务器的流程http请求的处理过程: 浏览器访问服务器使⽤的是Http协议,Http是应⽤层协议,⽤于定义数据通信的格式,具体的数据传输使⽤的是TCP/IP协议。Tomcat 系统总体架构 Tomcat是⼀个Http服务器(能够接收并且处理http请求,所以tomcat是⼀个http服务器),tomcat是Apache旗下的一个开源S...

weixin_39796652的博客 340

全网最强Nginx教程 | 万字长文爆肝Nginx(一)

学习nginx

qq_45832461的博客 2115
上一篇: 《架构漫谈》摘要
下一篇: JAVA正则表达式过滤文件
shift_alt_ctrl
博客等级 码龄10年 0粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值