SpringBoot项目实战(6):整合Log4j和Aop,实现简单的日志记录
温馨提示:
本文最后更新于 2017年04月07日,已超过 2,815 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
目录结构
1.pom.xml
<!--log4j2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="com.sbm" level="trace" additivity="false">
<AppenderRef ref="Console" />
</Logger>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
3.Aop记录Log类:AppLogAspect
package com.sbm.aspects;
import com.sbm.util.IPUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Enumeration;
/**
* sbm
* Created by yadong.zhang on com.sbm.aspects
* User:yadong.zhang
* Date:2016/10/21
* Time:15:53
*/
@Component
@Aspect
/*
* 定义切面执行的优先级,数字越低,优先级越高
* 在切入点之前执行:按order值有小到大的顺序执行
* 在切入点之后执行:按order值由大到小的顺序执行
*/
@Order(-5)
public class AppLogAspect {
private Logger logger = LogManager.getLogger(AppLogAspect.class);
// 保证每个线程都有一个单独的实例
private ThreadLocal<Long> time = new ThreadLocal<>();
@Pointcut("execution(* com.sbm.controller..*.*(..))")
public void pointcut() {
}
@Before("pointcut()")
public void doBefore(JoinPoint joinPoint) {
time.set(System.currentTimeMillis());
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//记录请求的内容
logger.info("Request URL: " + request.getRequestURL().toString());
logger.info("Request Method: " + request.getMethod());
String ip = request.getRemoteAddr();
if (ip.indexOf(":0") > -1) {
ip = IPUtil.getRealIp();
}
logger.info("IP: " + ip);
logger.info("User-Agent: " + request.getHeader("User-Agent"));
logger.info("Class Method: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("Cookies: " + request.getCookies());
logger.info("Params: " + Arrays.toString(joinPoint.getArgs()));
Enumeration<String> enums = request.getParameterNames();
while (enums.hasMoreElements()) {
String paraName = enums.nextElement();
logger.info(paraName + ":" + request.getParameter(paraName));
}
}
@AfterReturning("pointcut()")
public void doAfterReturning(JoinPoint joinPoint) {
logger.info("耗时 : " + ((System.currentTimeMillis() - time.get())) + "ms");
logger.info("AppLogAspect.doAfterReturning()");
}
}
4.简单的controller请求
@RequestMapping("/message/{currentPage}")
public String message(@PathVariable("currentPage") Integer currentPage, Model model){
if(currentPage!= null){
PageHelper.startPage(currentPage, 11);
}
LOGGER.debug("程序执行的时候输出Log日志...");
List<Message> messages = messageService.list();
model.addAttribute("messages", messages);
return "message";
}
5.IPUtil工具类
package com.sbm.util;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
/**
* sbm
* Created by yadong.zhang on com.sbm.util
* User:yadong.zhang
* Date:2016/10/21
* Time:16:04
*/
public class IPUtil {
public static String getRealIp() {
String realIp = null;
InetAddress ip = null;
try {
if (isWindowsOS()) { // windows
ip = InetAddress.getLocalHost();
} else { // Linux ,从网卡中获取ip地址
boolean bFindIP = false;
Enumeration<NetworkInterface> netInterfaces =
(Enumeration<NetworkInterface>) NetworkInterface.getNetworkInterfaces();
NetworkInterface ni = null;
Enumeration<InetAddress> ips = null;
while (netInterfaces.hasMoreElements()) {
if (bFindIP) {
break;
}
ni = (NetworkInterface) netInterfaces.nextElement();
ips = ni.getInetAddresses();
while (ips.hasMoreElements()) {
ip = (InetAddress) ips.nextElement();
if (ip.isSiteLocalAddress()
&& !ip.isLoopbackAddress()
&& ip.getHostAddress().indexOf(":") == -1) {
bFindIP = true;
break;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
if (ip != null) {
realIp = ip.getHostAddress();
}
return realIp;
}
/**
* 判断当前系统类型
*
* @return
*/
private static boolean isWindowsOS() {
boolean isWindowsOS = false;
String osName = System.getProperty("os.name");
if (osName.toLowerCase().indexOf("windows") > -1) {
isWindowsOS = true;
}
return isWindowsOS;
}
}
6.效果
其他相关文章
正文到此结束
- 本文标签: Spring Boot
- 本文链接: https://zhyd.me/article/28
- 版权声明: 本文由张亚东原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权