(十)SpringBoot2.0整合log4j+lombok日志管理

本文详细介绍如何使用log4j进行日志记录,包括配置文件设置和依赖管理;使用AOP处理Web请求日志,增强应用的监控能力;并介绍如何通过SpringBoot集成lombok简化代码,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 使用log4j记录日志

1. 新建log4j配置文件

文件名称log4j.properties,直接复制到你工程即可。

#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=info,error,CONSOLE,DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender     
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout     
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n     
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout     
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = info   
log4j.appender.info.append=true   
#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_services_info
log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info
log4j.logger.error=error  
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout     
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = error   
log4j.appender.error.append=true   
#log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error
log4j.appender.error.File=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_error
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout     
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  
log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG   
log4j.appender.DEBUG.append=true   
#log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug
log4j.appender.DEBUG.File=/Users/dddd/Documents/testspace/pms-api-services/logs/debug/api_services_debug

在类里面使用:
private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

2. pom文件依赖

<!-- spring boot start -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
			<exclusions>
				<!-- 排除自带的logback依赖 -->
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<!-- springboot-log4j -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-log4j</artifactId>
			<version>1.3.8.RELEASE</version>
		</dependency>

二. 使用AOP统一处理Web请求日志

1. pom文件依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
	</dependency>

2. 切面拦截类

@Aspect
@Component
public class WebLogAspect {

	private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

	@Pointcut("execution(public * com.itmayiedu.controller.*.*(..))")
	public void webLog() {
	}

	@Before("webLog()")
	public void doBefore(JoinPoint joinPoint) throws Throwable {
		// 接收到请求,记录请求内容
		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = attributes.getRequest();
		// 记录下请求内容
		logger.info("URL : " + request.getRequestURL().toString());
		logger.info("HTTP_METHOD : " + request.getMethod());
		logger.info("IP : " + request.getRemoteAddr());
		Enumeration<String> enu = request.getParameterNames();
		while (enu.hasMoreElements()) {
			String name = (String) enu.nextElement();
			logger.info("name:{},value:{}", name, request.getParameter(name));
		}
	}
	@AfterReturning(returning = "ret", pointcut = "webLog()")
	public void doAfterReturning(Object ret) throws Throwable {
		// 处理完请求,返回内容
		logger.info("RESPONSE : " + ret);
	}
}

三. Spring Boot集成lombok让代码更简洁(强烈推荐)

1. pom文件依赖

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>

2. 实体类演示

@Slf4j
@Data
public class UserEntity {
	// @Getter
	// @Setter
	private String userName;
	// @Getter
	// @Setter
	private Integer age;

	@Override
	public String toString() {
		return "UserEntity [userName=" + userName + ", age=" + age + "]";
	}
	public static void main(String[] args) {
		UserEntity userEntity = new UserEntity();
		userEntity.setUserName("zhangsan");
		userEntity.setAge(20);
		System.out.println(userEntity.toString());
		log.info("####我是日志##########");
	}
}

3. 其他特性

@Data 标签,生成getter/setter toString()等方法 
@NonNull : 让你不在担忧并且爱上NullPointerException 
@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法 
@Setter/@Getter : 自动生成setget方法 
@ToString : 自动生成toString方法 
@EqualsAndHashcode : 从对象的字段中生成hashCode和equals的实现 
@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor 
自动生成构造方法 
@Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法 
@Value : 用于注解final类 
@Builder : 产生复杂的构建器api类
@SneakyThrows : 异常处理(谨慎使用) 
@Synchronized : 同步方法安全的转化 
@Getter(lazy=true) : 
@Log : 支持各种logger对象,使用时用对应的注解,如:@Log4

下一篇:(十一)SpringBoot2.0整合Ehcache缓存技术

// 定义包路径 package com.wuyunbin.jmb2c.service.impl; // 导入相关类 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.wuyunbin.jmb2c.dto.MemberLoginDTO; import com.wuyunbin.jmb2c.dto.MemberUpdatePasswordDTO; import com.wuyunbin.jmb2c.entity.Member; import com.wuyunbin.jmb2c.exceptions.BusinessException; import com.wuyunbin.jmb2c.mapper.MemberMapper; import com.wuyunbin.jmb2c.service.MemberService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wuyunbin.jmb2c.utils.JwtUtil; import io.jsonwebtoken.Claims; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.HashMap; /** * 会员服务实现类 * 实现会员相关的业务逻辑,包括登录、获取用户信息、更新密码等功能 * * @author wuyunbin * @since 2025-07-02 */ // 启用日志功能 @Slf4j // 标记为服务类 @Service public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService { // 注入RestTemplate,用于发送HTTP请求 @Resource private RestTemplate restTemplate; // 注入HttpServletRequest,用于获取请求中的信息(如token) @Resource private HttpServletRequest request; // 注入JWT工具类,用于处理token @Resource private JwtUtil jwtUtil; /** * 用户登录实现 * 支持账号密码登录,验证用户身份并生成JWT令牌 * * @param memberLoginDTO 登录信息数据传输对象 * @return 生成的JWT令牌 * @throws BusinessException 当账号不存在或密码错误时抛出 */ @Override public String login(MemberLoginDTO memberLoginDTO) { Member member=null; // 账号密码登录 if(memberLoginDTO.getMobile()!=null){ // 创建查询条件 LambdaQueryWrapper<Member> wrapper=new LambdaQueryWrapper<>(); // 根据手机号查询用户 wrapper.eq(Member::getMobile,memberLoginDTO.getMobile()); // 获取用户信息 member = this.getOne(wrapper); // 检查用户是否存在 if(member==null){ log.info("账号不存在"); throw new BusinessException("账号不存在或密码错误"); } // 验证密码是否正确 if(!member.getPassword().equals(memberLoginDTO.getPassword())){ log.info("密码错误"); throw new BusinessException("账号不存在或密码错误"); } }else{ // todo 0702 微信登录 } // 签发token HashMap<String,Object> map=new HashMap<>(); // 将用户ID存入token map.put("id",member.getUserId()); // 生成JWT令牌 String token = jwtUtil.generateToken(map); return token; } /** * 获取当前登录用户信息 * 从请求头中获取token,解析出用户ID,然后查询用户信息 * * @return 当前登录用户的信息 */ @Override public Member info() { // 从请求头获取token String token = request.getHeader("token"); log.info("token:{}",token); // 解析token,获取用户ID Claims claims = jwtUtil.parseToken(token); Integer id = claims.get("id", Integer.class); // 根据用户ID查询用户信息 Member member = this.getById(id); return member; } /** * 更新用户密码 * 根据用户ID更新密码信息 * * @param memberUpdatePasswordDTO 密码更新信息数据传输对象 */ @Override public void updatePassword(MemberUpdatePasswordDTO memberUpdatePasswordDTO) { // 创建Member对象 Member member=new Member(); // 设置用户ID member.setUserId(memberUpdatePasswordDTO.getUserId()); // 设置新密码 member.setPassword(memberUpdatePasswordDTO.getPassword()); // 更新用户信息 this.updateById(member); } } 帮我补上 // todo 0702 微信登录中的代码,并添加详尽的注释
07-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值