【SpringMVC快速使用】1.@RestController @RequestMapping 2.logback的使用

背景:为何从这个最简单的 例子写起呢?

那是因为我们的管理后台之类的都是别人写的,我也听说了大家说:只用Post请求就足够了,但是却发现,在浏览器中测试时,默认是GET请求,如果直接写的@PostMapping,则提示此请求不支持。

有了SpringBoot,开发部署一个Web项目是非常加单的。对比ASP.Net Core 和go的繁琐(因为很多东西需要自己从头做),SpringBoot是做到了开箱即用,我们引入需要的starter,使用依赖注入即可引入我们需要的service类,结合dubbo,我们可以轻松的实现微服务(也就是这个接口的实现是别的服务做的)。不管是同步还是异步,都是非常的简单的。

1)我们的游戏服务器是从“平台”账号注册开始的,那么我们就从这里开始:

package com.example.springbootdemo.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/account")
public class AccountController {

    /**
     * @param username
     * @param password
     */
    @RequestMapping("/register")
    public void register(String username, String password) {
        log.info("新用户注册,username={}, password={}", username, password);
    }
}

/*
2024-01-11T11:10:10.421+08:00  INFO 32040 --- [nio-8080-exec-5] c.e.s.controller.AccountController       : 新用户注册,username="xx", password="aa"
2024-01-11T11:10:10.647+08:00  INFO 32040 --- [nio-8080-exec-6] c.e.s.controller.AccountController       : 新用户注册,username="xx", password="aa"
2024-01-11T11:10:10.850+08:00  INFO 32040 --- [nio-8080-exec-7] c.e.s.controller.AccountController       : 新用户注册,username="xx", password="aa"
2024-01-11T11:10:11.014+08:00  INFO 32040 --- [nio-8080-exec-8] c.e.s.controller.AccountController       : 新用户注册,username="xx", password="aa"
2024-01-11T11:10:11.187+08:00  INFO 32040 --- [nio-8080-exec-2] c.e.s.controller.AccountController       : 新用户注册,username="xx", password="aa"
2024-01-11T11:10:11.362+08:00  INFO 32040 --- [io-8080-exec-10] c.e.s.controller.AccountController       : 新用户注册,username="xx", password="aa"
2024-01-11T11:10:13.562+08:00  INFO 32040 --- [nio-8080-exec-9] c.e.s.controller.AccountController       : 新用户注册,username="xx", password="aa"
2024-01-11T11:15:47.588+08:00  INFO 32040 --- [nio-8080-exec-5] c.e.s.controller.AccountController       : 新用户注册,username="xx", password="aa"
*/

2)日志肯定是少不了的

在pom.xml中引入下logback日志包 // 注意:不要带版本号,不然打包时就会提示logback版本号冲突了,我们使用继承过来的版本即可

    <!-- log -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
<!--      <version>1.7.25</version>-->
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
<!--      <version>1.7.7</version>-->
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
<!--      <version>1.2.3</version>-->
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
<!--      <version>1.2.3</version>-->
    </dependency>

接着把zfoo的logback.xml粘贴过来放到resources下面即可:

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

<configuration scan="false" debug="false">
  <property name="LOG_HOME" value="log/"/>
  <property name="PATTERN_FILE"
    value="%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%thread] %logger.%M\\(%F:%line\\) - %msg%n"/>
  <property name="PATTERN_CONSOLE"
    value="%d{yyyy-MM-dd HH:mm:ss} [%highlight(%-5level)] [%thread] %logger.%M\\(%F:%line\\) - %msg%n"/>
  <!-- 负责写日志,控制台日志,会打印所有的包的所有级别日志 -->
  <appender name="zfoo_console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>${PATTERN_CONSOLE}</pattern>
      <charset>UTF-8</charset>
    </encoder>
  </appender>

  <!-- debug日志,只有一个文件,只收集debug级别日志,每次启动会覆盖以前的debug日志 -->
  <appender name="zfoo_debug" class="ch.qos.logback.core.FileAppender">
    <file>${LOG_HOME}/debug.log</file>
    <!-- append: true,日志被追加到文件结尾; false,清空现存文件;默认是true -->
    <append>false</append>
    <encoder>
      <pattern>${PATTERN_FILE}</pattern>
      <charset>UTF-8</charset>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>debug</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>

  <!-- info,warn,error级别的日志都会添加在info.log日志中 -->
  <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
  <appender name="zfoo_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_HOME}/info.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <!-- each file should be at most 100MB, keep 30 days worth of history, but at most 40GB -->
      <maxFileSize>100MB</maxFileSize>
      <maxHistory>30</maxHistory>
      <totalSizeCap>40GB</totalSizeCap>
    </rollingPolicy>

    <encoder>
      <Pattern>${PATTERN_FILE}</Pattern>
      <charset>UTF-8</charset>
    </encoder>

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>info</level>
    </filter>
  </appender>

  <!-- 异步输出 -->
  <appender name="zfoo_async_info" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
    <discardingThreshold>0</discardingThreshold>
    <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
    <queueSize>512</queueSize>
    <!-- 添加附加的appender,最多只能添加一个 -->
    <appender-ref ref="zfoo_info"/>
  </appender>

  <!-- 只收集error级别的日志 -->
  <appender name="zfoo_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_HOME}/error.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <maxFileSize>100MB</maxFileSize>
      <maxHistory>30</maxHistory>
      <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>

    <encoder>
      <Pattern>${PATTERN_FILE}</Pattern>
      <charset>UTF-8</charset>
    </encoder>

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>error</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>

  <!--step1:指定想要输出的类型-->
  <!-- 根logger -->
  <root level="info">
    <!--控制台-->
    <appender-ref ref="zfoo_console"/>
    <!--        <appender-ref ref="zfoo_debug"/>-->
    <appender-ref ref="zfoo_async_info"/>
    <!--        <appender-ref ref="zfoo_error"/>-->
  </root>

  <logger name="ch.qos.logback" level="info"/>
  <logger name="org.springframework" level="info"/>
  <logger name="io.netty" level="info"/>
</configuration>

3)结合lombok的@Slf4j注解,我们可以很轻松打印的日志(想想go或者asp.net core的话,自己不是太熟悉,还是得折腾半天)

4)测试

浏览器中发起下请求: 

http://localhost:8080/account/register?username="xx"&password="aa"

注意从浏览器中粘贴下来可能不是这样子了,这是因为进行了编码

http://localhost:8080/account/register?username=%22xx%22&password=%22aa%22 

观察下idea下的日志,可以看出来这个日志是非常清楚的

时间,日志级别,线程,日志是从哪个类打印出的,跳转,信息等非常清楚

5)打包也很容易了开箱即用。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/312526.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML--基本结构构成

基本结构&#xff1a; 文档声明: <!DOCTYPE html> htm标签对 :<html> </html> head标签对&#xff1a; <head> </head> body标签对&#xff1a;<body> </body> 如下结构&#xff1a; <html> <head> <title>这是一…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑩

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应处理&#xff0c;程序根据两个输入参数iRecordNum和IType计算x的值并返回。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码进行测试&#xff0c;测试类中设计最少的测试数据满足基路…

Unity中URP下实现能量罩(扭曲流光花纹)

文章目录 前言一、能量罩花纹1、在属性面板接收能量罩花纹纹理2、申明 纹理 和 采样器3、在顶点着色器&#xff0c;应用 Tilling 和 Offset4、在片元着色器&#xff0c;纹理采样后&#xff0c;与之前的结果相乘输出 二、能量罩流光1、在顶点着色器&#xff0c;记录原uv值2、在片…

世微大功率 内置2.5A宽电压降压恒流 LED电源驱动车灯IC AP5193

AP5193是一款PWM工作模式,高效率、外围简单、 内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度 降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光 脚有效电压范围0.55-2.6V. AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c…

微软Visual Studio产品之Visual C++编程进阶——一维数组(画画版)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;我小时候喜欢看小人书&#xff08;连环画&#xff09;&#xff0c;在那个没有电视、没有手机的年代&#xff0c;这是…

软件测试|Python中如何控制输出小数点位数

简介 在数据处理、科学计算和金融分析等领域&#xff0c;经常需要对浮点数的输出进行格式化&#xff0c;以控制小数点后的位数。Python提供了多种方法来实现这个目标。在本文中&#xff0c;我们将深入探讨几种指定输出小数点位数的方法&#xff0c;帮助我们在不同场景下选择合…

打造创新的金融数据平台,加速数字化和智能化转型丨PingCAP 官网金融行业专区上线

自诞生以来&#xff0c;TiDB 的原生分布式架构在强一致性、高可用性和可扩展性等方面与金融级业务需求高度契合&#xff0c;早期版本即为包括北京银行在内的金融用户提供服务。 TiDB 的核心能力始终源自与中国金融用户的共同创造。作为金融级分布式数据库&#xff0c;TiDB 在国…

Windows安全基础:认证基础知识

目录 Windows凭据 Windows访问控制模型 访问令牌&#xff1a; 安全标识符&#xff08;SID&#xff09;&#xff1a; 安全描述符&#xff1a; 令牌安全防御 1、禁止域管理员异机登录 2、开启“审核进程创建”策略 Windows凭据 SSPI&#xff08;Security Support Provide…

【期末不挂科-C++考前速过系列P2】大二C++第2次过程考核(20道选择题&10道判断题&3道代码题)【解析,注释】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》专…

RabbitMQ入门到实战——高级篇

消息的可靠性 生产者的可靠性&#xff08;确保消息一定到达MQ&#xff09; 生产者重连 这⾥除了enabled是false外&#xff0c;其他 initial-interval 等默认都是⼀样的值。 生产者确认 生产者确认代码实现 application中增加配置&#xff1a;&#xff08;publisher-returns…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷③

单元测试 一、任务要求 题目1&#xff1a;输入一个大写字母一个小写字母。根据输入的第一个字母和英文周几单词的第一个大写字母判断是周几&#xff0c;如果无法根据第一个大写字母判断&#xff0c;则继续根据输入的第二个小写字母进行判断&#xff0c;最终返回正确的英文周几…

Ubuntu下使用Virtual Box中显示没有可用的USB设备

Ubuntu中使用Virtual Box&#xff0c;但是使用到USB时只有USB1.1可以使用&#xff0c;并且提示没有可以使用的USB设备&#xff0c;解决方法如下 下载并安装Vitrual Box提供的功能扩展包 分别点击帮助->关于&#xff0c;查看当前使用的版本进入到Virtual Box官网下载链接根…

使用 gitee+sphinx+readthedocs 搭建个人博客

给大家安利如何快速搭建个人博客网站&#xff01; 前言 这是我本地运行的一个使用sphinx构建的博客服务&#xff0c;这些文章&#xff0c;都是用markdown写的。 一直有个想法&#xff0c;就是把自己写的这些文件&#xff0c;搞成一个博客网站&#xff0c;放到网上&#xff0c…

1.1 计算机网络在信息时代的作用

1.1 计算机网络在信息时代的作用 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链路&#xff08;Link&#xff09;所组成。网络中的结点可以是计算机、集线器、交换机或者路由器等。 图1-1 多个网络还可以通过路由器互连起来&a…

Chrome Dev Tools 配置

文章目录 前言偏好设置小结 前言 控制面板 > command shift p 呼出快捷指令面板&#xff0c;或者如下图操作 偏好设置 默认配置 中文配置 小结 把今天最好的表现当作明天最新的起点……&#xff0e;&#xff5e; 投身于天地这熔炉&#xff0c;一个人可以被毁灭&#xff0…

kafka下载安装部署

Apache kafka 是一个分布式的基于push-subscribe的消息系统&#xff0c;它具备快速、可扩展、可持久化的特点。它现在是Apache旗下的一个开源系统&#xff0c;作为hadoop生态系统的一部分&#xff0c;被各种商业公司广泛应用。它的最大的特性就是可以实时的处理大量数据以满足各…

oracle 19c容器数据库data dump数据泵传输数据(2)---11g导19c

目录 1.在11gnon-cdb数据库中创建测试用户 2.在19cCDB容器数据库中新建pdb2 3.执行命令导出 4.执行命令导入 Exporting from a Non-CDB and Importing into a PDB 我們要記住一点&#xff1a;如果是全库导出导入的话&#xff0c;目标数据库没有的表空间我们要事先创建&#…

制造领域 基础概念快速入门介绍

1、基本背景知识 本定义结合国家标准文件有所发挥&#xff0c;仅供参考。 产品&#xff1a;是生产企业向用户或市场以商品形式提供的制成品&#xff1b; 成套设备&#xff1a;在生产企业一般不用装配工序连接&#xff0c;但用于完成相互联系的使用功能的两个或两个以上的产…

国产系统-银河麒麟桌面版V10安装字体-wps安装字体

安装系统:银河麒麟V10 demodemo-pc:~/桌面$ cat /proc/version Linux version 5.10.0-8-generic (builddfa379600e539) (gcc (Ubuntu 9.4.0-1kylin1~20.04.1) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #33~v10pro-KYLINOS SMP Wed Mar 22 07:21:49 UTC 20230.系统缺失…

API设计:从基础到优秀实践

在这次深入探讨中&#xff0c;我们将深入了解API设计&#xff0c;从基础知识开始&#xff0c;逐步进阶到定义出色API的最佳实践。 作为开发者&#xff0c;你可能对许多这些概念很熟悉&#xff0c;但我将提供详细的解释&#xff0c;以加深你的理解。 API设计&#xff1a;电子商…