【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{30}.%M\(%F:%L\) - %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><!-- 根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)打包也很容易了开箱即用。
-------------另外一个用到的-----------
<?xml version="1.0" encoding="UTF-8" ?>
<configuration><property name="LOG_DIR" value="./logs"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder>
<!-- <pattern>[%-5level][%d{HH:mm:ss.SSS}][%thread][%logger{30}][%L] - %msg%n</pattern>--><pattern>%d{yyyy-MM-dd HH:mm:ss} [%highlight(%-5level)] [%thread] %logger{30}.%M\(%F:%L\) - %msg%n</pattern></encoder></appender><!-- perf4j --><appender name="ROLLFILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_DIR}/game.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_DIR}/game.%d{yyyyMMdd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>[%-5level][%d{HH:mm:ss.SSS}][%thread][%logger][%L] - %msg%n</pattern></encoder></appender><appender name="MONITOR_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_DIR}/monitor.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_DIR}/monitor.%d{yyyyMMdd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>[%-5level][%d{HH:mm:ss.SSS}][%thread][%logger][%L] - %msg%n</pattern></encoder></appender><appender name="PERF4J_ROLLFILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_DIR}/game-perf.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_DIR}/game-perf.%d{yyyyMMdd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%msg%n%ex</pattern></encoder></appender><appender name="PERF4J_STATISTICS"class="org.perf4j.logback.AsyncCoalescingStatisticsAppender"><appender-ref ref="PERF4J_ROLLFILE"/><timeSlice>60000</timeSlice></appender><appender name="ASYNC_ROLLFILE" class="ch.qos.logback.classic.AsyncAppender"><appender-ref ref="ROLLFILE"/><queueSize>1024</queueSize><maxFlushTime>3000</maxFlushTime></appender><appender name="DispatchSingleThreadMgr" class="ch.qos.logback.classic.AsyncAppender"><appender-ref ref="MONITOR_INFO"/><queueSize>1024</queueSize><maxFlushTime>3000</maxFlushTime></appender><logger name="org.perf4j.TimingLogger" level="INFO" additivity="false"><appender-ref ref="PERF4J_STATISTICS"/></logger><logger name="com.elex.framework.core.thread.DispatchSingleThreadMgr" level="INFO" additivity="false"><appender-ref ref="DispatchSingleThreadMgr"/></logger><logger name="org.springframework" level="INFO" additivity="false"/><logger name="org.apache.http.impl" level="INFO" additivity="false"/><logger name="org.apache.ibatis" level="INFO" additivity="false"/><logger name="org.apache.http" level="INFO" additivity="false"/><logger name="org.mybatis" level="INFO" additivity="false"/><logger name="org.apache.thrift" level="INFO" additivity="false"/><logger name="org.mongodb" level="INFO" additivity="false"/><logger name="org.apache.zookeeper" level="INFO" additivity="false"/><logger name="com.elex.icefire.scene.object.SO_PlayerCity" level="warn"/><logger name="com.elex.billion.icefire.way.service.FindWayWorker" level="off"/><logger name="com.elex.icefire.scene.object.model.SceneMove" level="off"/><logger name="com.elex.icefire.scene.AbstractScene" level="off"/><logger name="com.elex.icefire.scene.object.AbstractSceneObject" level="off"/><logger name="com.elex.icefire.scene.object.playerTroop.SO_PlayerTroop" level="off"/><logger name="com.elex.icefire.scene.object.resource.SO_NormalResource" level="off"/><root level="debug"><appender-ref ref="STDOUT"/><appender-ref ref="ASYNC_ROLLFILE"/></root>
</configuration>
相关文章:

【SpringMVC快速使用】1.@RestController @RequestMapping 2.logback的使用
背景:为何从这个最简单的 例子写起呢? 那是因为我们的管理后台之类的都是别人写的,我也听说了大家说:只用Post请求就足够了,但是却发现,在浏览器中测试时,默认是GET请求,如果直接写…...
C2593 operator << 不明确
错误 C2593 “operator <<” 不明确,通常出现在C代码中,当你尝试使用<<运算符(通常用于输出或位移运算)时,编译器无法确定使用哪个重载版本的运算符。这个错误可能由几个原因引起: 多个重载冲突…...

vue:使用【3.0】:条件模块
一、条件层级效果图 二、代码 <template><ContentWrap><!-- 添加条件分支:level1 --><div class"btnBox" v-if"isEdit"><el-button type"primary" click"add">添加条件分支</el-button></div…...

Kafka与RabbitMQ的区别
消息队列介绍 消息队列(Message Queue)是一种在分布式系统中进行异步通信的机制。它允许一个或多个生产者在发送消息时暂时将消息存储在队列中,然后由一个或多个消费者按顺序读取并处理这些消息。 消息队列具有以下特点: 异步通…...

C++力扣题目538--把二叉搜索树转换为累加树
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件&#…...

曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)
目录 0 专栏介绍1 贝塞尔曲线的应用2 图解贝塞尔曲线3 贝塞尔曲线的性质4 算法仿真4.1 ROS C仿真4.2 Python仿真4.3 Matlab仿真 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法…...

【一万字干货】一篇给你讲清楚智慧城市——附送智慧系列开发项目合集
智慧城市的概念 智慧城市(Smart City)起源于传媒领域,是指利用各种信息技术或创新概念,将城市的系统和服务打通、集成,以提升资源运用的效率,优化城市管理和服务,以及改善市民生活质量。 中国…...

关于如何禁用、暂停或退出OneDrive等操作,看这篇文件就够了
想知道如何禁用OneDrive?你可以暂停OneDrive的文件同步,退出应用程序,阻止它在启动时打开,或者永远从你的机器上删除该应用程序。我们将向你展示如何在Windows计算机上完成所有这些操作。 如何在Windows上关闭OneDrive 有多种方法可以防止OneDrive在你的电脑上妨碍你。…...

Vue3-46-Pinia-获取全局状态变量的方式
使用说明 在 Pinia 中,获取状态变量的方式非常的简单 : 就和使用对象一样。 使用思路 : 1、导入Store;2、声明Store对象;3、使用对象。 在逻辑代码中使用 但是 Option Store 和 Setup Store 两种方式定义的全局状态变量…...

数据库——DAY1(Linux上安装MySQL8.0.35(网络仓库安装))
一、环境部署 1、Red Hat Enterprise Linux 9.3 64 位 2、删除之前安装过本地镜像版本的MySQL软件(以前未安装过,请跳过此步骤) [rootlocalhost ~]# dnf remove mysql-server -y [rootlocalhost ~]# rm -rf /var/lib/mysql [rootlocalhost …...

原生微信小程序-两次设置支付密码校验,密码设置二次确认
效果 具体代码 1、wxml <view style"{{themeColor}}"><view classcontainer><view class"password_content"><view wx:if{{type 1}}><view class"title"><view class"main_title">设置支付密码…...

【Python学习】Python学习15-模块
目录 【Python学习】Python学习15-模块 前言创建语法引入模块from…import 语句from…import* 语句搜索路径PYTHONPATH 变量-*- coding: UTF-8 -*-导入模块现在可以调用模块里包含的函数了PYTHONPATH 变量命名空间和作用域dir()函数globals() 和 locals() 函数reload() 函数Py…...

ARCGIS PRO SDK 设置UI控件状态:启用/禁用
举例: 第一步:添加两个 Button 分别命名为Connect、Disconnect 第二步:nfig.daml添加状态和条件:在 DAML 中定义条件。请记住,条件存在于模块标记<modules>之外,下代码定义:Disconnected_…...

案例126:基于微信小程序的民大食堂用餐综合服务平台
文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…...
cephfs 配置 mds stancd replay 操作
目的 1 假设有某个客户创建过千万文件目录,可以导致 ceph-mds 故障 2 backup ceph-mds 拉起时需要从内存中 replay 最后操作,可能需要吧当前目录中所有目> 录结构 重新 reload 至内存 3 这个过程可能需要几小时,可能需要几天 4 为了快速地拉起 ceph-mds 5 可以选择配置一…...

【2023我的编程之旅】系统学习C语言easyx图形库心得体会
目录 引言 C语言基础知识回顾 easyx图形库介绍 如何快速学习easyx图形库 学习笔记积累 学习成果展示 学习拓展 总结 引言 首先说一下我为什么要学习C语言easyx图形库。我接触C语言easyx图形库是在我今年一月份的时候,也是机缘巧合之下偶然在B站上看到了鸣人…...

【linux】软链接创建(linux的快捷方式创建)
软连接的概念 类似于windows系统中的快捷方式。有的文件目录很长或者每次使用都要找很不方便,于是可以用类似windows的快捷方式的软链接在home(初始目录类似于桌面)上创建一些软链接方便使用。 软链接的语法 ln -s 参数1 参数2 参数1&#…...
基于BP神经网络的光伏发电预测
目录 摘要 BP神经网络参数设置及各种函数选择 参数设置 训练函数 传递函数 学习函数 性能函数 显示函数 前向网络创建函数 BP神经网络训练窗口详解 训练窗口例样 训练窗口四部详解 基于BP神经网络的租金预测 代码下载:19-66天气预测光伏发电.rar(代码完整,数据齐全)资源-C…...

RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用RPA全球生态 2024-01-05 17:27 发表于河北
目前国内外研究人员对于RPA机器人在财务管理流程优化领域中的应用研究层出不穷,但现有研究成果主要集中在财务业务单一领域,缺乏财务管理整体流程一体化管控的研究。RPA机器人的功能绝非单一的财务业务处理,无论从自身技术发展,或…...

应用在LCD显示器电源插头里的氮化镓(GaN)MTC-65W1C
LCD(Liquid Crystal Display)显示器是利用液晶显示技术来进行图像表现的显示装置,从液晶显示器的结构来看,无论是笔记本电脑还是桌面系统,采用的LCD显示屏都是由不同部分组成的分层结构。LCD显示器按照控制方式不同可分…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...