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";
Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-06-16 20:26:32

results matching ""

    No results matching ""