3.3 创建 Controller
Controller
用来处理http
请求
package com.atguigu.dw.gmalllogger.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
// @Controller
@RestController // 等价于: @Controller + @ResponseBody
public class LoggerController {
// @RequestMapping(value = "/log", method = RequestMethod.POST)
// @ResponseBody //表示返回值是一个 字符串, 而不是 页面名
@PostMapping("/log") // 等价于: @RequestMapping(value = "/log", method = RequestMethod.POST)
public String doLog(@RequestParam("log") String log) {
System.out.println(log);
return "success";
}
/**
* 业务:
*
* 1. 给日志添加时间戳 (客户端的时间有可能不准, 所以使用服务器端的时间)
*
* 2. 日志落盘
*
* 3. 日志发送 kafka
*/
}
对日志进行业务处理
1. 添加对gmall-common
的依赖
<dependency>
<groupId>com.atguigu.dw</groupId>
<artifactId>gmall-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2. 具体的业务实现
2.1 添加时间戳
在LoggerController
中添加如下方法
/**
* 添加时间戳
* @param logObj
* @return
*/
public JSONObject addTS(JSONObject logObj){
logObj.put("ts", System.currentTimeMillis());
return logObj;
}
2.2 使用log4j
给日志落盘
添加
log4j.properties
文件
log4j.appender.atguigu.MyConsole=org.apache.log4j.ConsoleAppender
log4j.appender.atguigu.MyConsole.target=System.err
log4j.appender.atguigu.MyConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.atguigu.MyConsole.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %6p (%c:%M) - %m%n
log4j.appender.atguigu.File=org.apache.log4j.DailyRollingFileAppender
log4j.appender.atguigu.File.file=C:/applog/gmall/log/app.log
log4j.appender.atguigu.File.DatePattern='.'yyyy-MM-dd
log4j.appender.atguigu.File.layout=org.apache.log4j.PatternLayout
log4j.appender.atguigu.File.layout.ConversionPattern=%m%n
log4j.logger.com.atguigu.dw.gmalllogger.controller.LoggerController=info,atguigu.File,atguigu.MyConsole
把
logging
更换成log4j
由于 Spring boot 默认是使用的 logging 来输出日志, 最好更换成log4j
<!-- 去除 logging-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 spring log4j 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
日志落盘
// 初始化 Logger 对象
private final Logger logger = LoggerFactory.getLogger(LoggerController.class);
/**
* 日志落盘
* 使用 log4j
* @param logObj
*/
public void saveLog(JSONObject logObj) {
logger.info(logObj.toJSONString());
}
2.3 发送日志到 kafka
在文件
Application.properties
中添加kafka
配置
#============== kafka 开始===================
# 指定kafka 代理地址,可以多个
spring.kafka.bootstrap-servers=hadoop201:9092,hadoop202:9092,hadoop203:9092
# 指定消息key和消息体的编解码方式
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
#============== kafka 配置结束===================
发送到 kafka
在 gmall-common
子模块中创建一个存放常量的类, 存储topic
名字
package com.atguigu.dw.gmall.common.constant;
/**
* @Author lzc
* @Date 2019/5/14 6:08 PM
*/
public class GmallConstant {
public static final String TOPIC_STARTUP = "gmall_startup";
public static final String TOPIC_EVENT = "gmall_event";
}
具体发送代码
// 使用注入的方式来实例化 KafkaTemplate. Spring boot 会自动完成
@Autowired
KafkaTemplate<String, String> kafkaTemplate;
/**
* 发送日志到 kafka
*
* @param logObj
*/
private void sendToKafka(JSONObject logObj) {
String logType = logObj.getString("type");
String topicName = GmallConstant.TOPIC_STARTUP;
if ("event".equals(logType)) {
topicName = GmallConstant.TOPIC_EVENT;
}
kafkaTemplate.send(topicName, logObj.toJSONString());
}
2.4 最终的doLog
方法
// 日志转成 JSONObject
JSONObject logObj = JSON.parseObject(log);
// 添加时间戳
logObj = addTS(logObj);
// 日志落盘
saveLog(logObj);
// 发送到 kafka
sendToKafka(logObj);
return "success";