SpringMVC返回json数据的三种方式文件可知,我的SpringMVC工程已支持返回json数据,下面我们再给它增加日志输出功能。
一.引入日志相关的jar包
不知为什么,经不是特别全面的验证,这七个jar包必须都引用到我的SpringMVC的工程中来。
二.增加log4j2.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!--这个都知道是输出日志的格式-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="20MB"/>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<logger name="com.bijian.study.controller" level="trace" additivity="false">
<appender-ref ref="RollingFile"/>
<appender-ref ref="log"/>
<appender-ref ref="Console"/>
</logger>
<!--建立一个默认的root的logger-->
<root level="info">
<appender-ref ref="RollingFile"/>
<appender-ref ref="log"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
三.修改代码验证
HelloController.java
package com.bijian.study.controller;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.bijian.study.service.HelloService;
@Controller
public class HelloController {
private static Logger logger = LoggerFactory.getLogger(HelloController.class);
@Autowired
private HelloService helloService;
@RequestMapping("/greeting")
public ModelAndView greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
Map<String, Object> map = new HashMap<String, Object>();
try {
//由于浏览器会把中文直接换成ISO-8859-1编码格式,如果用户在地址打入中文,需要进行如下转换处理
String tempName = new String(name.getBytes("ISO-8859-1"), "utf-8");
logger.trace("tempName:" + tempName);
logger.info(tempName);
String userName = helloService.processService(tempName);
map.put("userName", userName);
logger.trace("运行结果:" + map);
} catch (UnsupportedEncodingException e) {
logger.error("HelloController greeting方法发生UnsupportedEncodingException异常:" + e);
} catch (Exception e) {
logger.error("HelloController greeting方法发生Exception异常:" + e);
}
return new ModelAndView("/hello", map);
}
@ResponseBody
@RequestMapping("/greet")
public Map<String, Object> greet(HttpServletResponse response,
@RequestParam(value = "name", defaultValue = "World") String name) {
Map<String, Object> map = null;
try {
//由于浏览器会把中文直接换成ISO-8859-1编码格式,如果用户在地址打入中文,需要进行如下转换处理
String tempName = new String(name.getBytes("ISO-8859-1"), "utf-8");
logger.trace("tempName:" + tempName);
logger.info(tempName);
String userName = helloService.processService(tempName);
map = new HashMap<String, Object>();
map.put("userName", userName);
logger.trace("运行结果:" + map);
} catch (UnsupportedEncodingException e) {
logger.error("HelloController greet方法发生UnsupportedEncodingException异常:" + e);
} catch (Exception e) {
logger.error("HelloController greet方法发生Exception异常:" + e);
}
return map;
}
}
HelloService.java
package com.bijian.study.service;
public interface HelloService {
public String processService(String name) throws Exception;
}
HelloServiceImpl.java
package com.bijian.study.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.bijian.study.service.HelloService;
@Service("helloService")
public class HelloServiceImpl implements HelloService {
private static Logger logger = LoggerFactory.getLogger(HelloServiceImpl.class);
@Override
public String processService(String name) throws Exception {
logger.info("HelloService processService name:" + name);
return "Hello " + name;
}
}
启动Tomcat,浏览器中输入http://localhost:8080/SpringMVC/greet?name=lisi,运行结果如下:
控制台输出:
16:08:34.120 TRACE com.bijian.study.controller.HelloController 62 greet - tempName:lisi
16:08:34.125 INFO com.bijian.study.controller.HelloController 63 greet - lisi
16:08:34.125 INFO com.bijian.study.service.impl.HelloServiceImpl 17 processService - HelloService processService name:lisi
16:08:34.126 TRACE com.bijian.study.controller.HelloController 70 greet - 运行结果:{userName=Hello lisi}
app.log输出:
2016-06-26 at 16:08:34 CST TRACE com.bijian.study.controller.HelloController 62 greet - tempName:lisi
2016-06-26 at 16:08:34 CST INFO com.bijian.study.controller.HelloController 63 greet - lisi
2016-06-26 at 16:08:34 CST INFO com.bijian.study.service.impl.HelloServiceImpl 17 processService - HelloService processService name:lisi
2016-06-26 at 16:08:34 CST TRACE com.bijian.study.controller.HelloController 70 greet - 运行结果:{userName=Hello lisi}
整个工程见附件《SpringMVC.zip》。