spring log 日志管理

简介:       import java.util.Map; import javax.annotation.Resource; import org.aspectj.lang.

 

 

 

import java.util.Map;

import javax.annotation.Resource;

import org.aspectj.lang.ProceedingJoinPoint;
/**
 * Logger
 */
public class Logger {
	
	@Resource
	private LogService logService ;
	public Object record(ProceedingJoinPoint pjp){
		Log log = new Log();
		try {
			ActionContext ac = ActionContext.getContext(); 
			if(ac != null){
				Map<String, Object> session = ac.getSession();
				if(session != null){
					User user = (User) session.get("user");
					if(user != null){
						log.setOperator("" + user.getId() + ":" + user.getEmail());
					}
				}
			} 
			String mname = pjp.getSignature().getName();
			log.setOperName(mname); 
			Object[] params = pjp.getArgs();
			log.setOperParams(StringUtil.arr2Str(params)); 
			Object ret = pjp.proceed(); 
			log.setOperResult("success"); 
			if(ret != null){
				log.setResultMsg(ret.toString());
			}
			return ret ;
		} catch (Throwable e) {
			log.setOperResult("failure");
			log.setResultMsg(e.getMessage());
		}
		finally{
			logService.saveEntity(log);
		}
		return null ;
	}
}

 

 

<!-- 日志记录仪 -->	
	<bean id="logger" class="com.surveypark.advice.Logger" />
	
	<!-- aop配置 -->	
	<aop:config>
		<!-- 事务切入点通知 -->
		<aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*Service.*(..))" order="2"/>
		
		<!-- 缓存切入点通知 -->
		<aop:advisor advice-ref="cacheAdvice" pointcut="execution(* *..*Service.*(..))" order="0"/>
		
		<!-- Logger切面 -->
		<aop:aspect id="loggerAspect" ref="logger" order="1">
			<aop:around method="record" pointcut="(execution(* *..*Service.save*(..)) 
											or execution(* *..*Service.update*(..)) 
											or execution(* *..*Service.delete*(..)) 
											or execution(* *..*Service.batch*(..)) 
											or execution(* *..*Service.new*(..)) 
											or execution(* *..*Service.move*(..)) 
											or execution(* *..*Service.clear*(..)) 
											or execution(* *..*Service.toggle*(..)))
											and !bean(logService)
											 "/>
		</aop:aspect>
	</aop:config>

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 任务明细bean -->
	<bean id="jobDetailBean" class="org.springframework.scheduling.quartz.JobDetailBean">
		<!-- 通过任务类指定石英任务 -->
		<property name="jobClass" value="com.surveypark.scheduler.CreateLogTablesTask" />
		<property name="jobDataMap">
			<map>
				<entry key="logService" value-ref="logService" />
			</map>
		</property>
	</bean>
	
	<!-- cron触发器bean,设置石英任务的调度策略 -->
	<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="jobDetailBean" />
		<!-- cron表达式 -->
		<property name="cronExpression">
			<value>0 19 10 3 * ?</value>
		</property>
	</bean>
	
	<!-- 调度工厂bean,激活触发器运行 -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="cronTriggerBean"/>
			</list>
		</property>
	</bean>
</beans>

 

public class CreateLogTablesTask extends QuartzJobBean {

	
	private LogService logService ; 
	public void setLogService(LogService logService) {
		this.logService = logService;
	}
 
	protected void executeInternal(JobExecutionContext arg0)
			throws JobExecutionException { 
		String tableName = LogUtil.generateLogTableName(1 );
		logService.createLogTable(tableName);
		 
		tableName = LogUtil.generateLogTableName(2);
		logService.createLogTable(tableName);
		 
		tableName = LogUtil.generateLogTableName(3);
		logService.createLogTable(tableName);
	}
}

  

public void createLogTable(String tableName){
		String sql = "create table if not exists " +tableName + " like logs" ;
		this.executeSQL(sql);
	}

  

 

 

public class LogUtil {
	 
	public static String generateLogTableName(int offset){
		Calendar c = Calendar.getInstance();
		// 2013
		int year = c.get(Calendar.YEAR);
		// 0 -11
		int month = c.get(Calendar.MONTH) + 1 + offset;
		
		if(month > 12){
			year ++ ;
			month = month - 12 ;
		}
		if(month < 1){
			year -- ;
			month = month + 12 ;
		}
		DecimalFormat df = new DecimalFormat();
		df.applyPattern("00");
		return "logs_" + year + "_" + df.format(month) ;
	}
}

 

public void saveEntity(Log t) {
		//insert into logs_2013_9()
		String sql = "insert into " 
				+ LogUtil.generateLogTableName(0) 
				+ "(id,operator,opername,operparams,operresult,resultmsg,opertime) "
				+ "values(?,?,?,?,?,?,?)" ;
		UUIDHexGenerator uuid = new UUIDHexGenerator();
		String id = (String) uuid.generate(null, null);
		this.executeSQL(sql, id,
							t.getOperator(),
							t.getOperName(),
							t.getOperParams(),
							t.getOperResult(),
							t.getResultMsg(),
							t.getOperTime());
	}

  

   

  

 

 

 

 

 

 

 

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
|
3天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
8 1
|
4天前
|
弹性计算 运维 Shell
|
11天前
|
Java
log4j异常日志过滤规则配置
log4j异常日志过滤规则配置
16 0
|
14天前
|
SQL 存储 监控
SLS 查询新范式:使用 SPL 对日志进行交互式探索
像 Unix 命令一样支持多级管道级联,像加工预览一样实时处理查询结果,更便捷的交互,更丰富的算子,更灵活的探索半结构化日志,快来试试使用 SPL 语言查询日志数据吧~
|
15天前
|
Apache
web服务器(Apache)访问日志(access_log)详细解释
web服务器(Apache)访问日志(access_log)详细解释
|
21天前
|
Java Spring
日志精准记录:Spring与Log4j完美整合的实战指南
日志精准记录:Spring与Log4j完美整合的实战指南
18 0
日志精准记录:Spring与Log4j完美整合的实战指南
|
23天前
|
运维 安全 Ubuntu
`/var/log/syslog` 和 `/var/log/messages` 日志详解
`/var/log/syslog` 和 `/var/log/messages` 是Linux系统的日志文件,分别在Debian和Red Hat系发行版中记录系统事件和错误。它们包含时间戳、日志级别、PID及消息内容,由`rsyslog`等守护进程管理。常用命令如`tail`和`grep`用于查看和搜索日志。日志级别从低到高包括`debug`到`emerg`,表示不同严重程度的信息。注意保护日志文件的安全,防止未授权访问,并定期使用`logrotate`进行文件轮转以管理磁盘空间。
29 1
|
23天前
|
安全 Unix Linux
`/var/log/wtmp` 和 `/var/run/utmp`日志详解
`/var/log/wtmp` 和 `/var/run/utmp` 是Unix/Linux系统中记录用户登录信息的关键文件。`wtmp` 文件存储所有登录和注销事件,供 `last` 命令显示登录历史,而 `utmp` 文件实时更新,记录当前登录用户信息,可由 `who` 或 `w` 命令解析展示。两者皆为root用户访问,系统重启可能清空,且常受安全措施保护,用于系统管理和安全审计。
36 1
|
23天前
|
监控 安全 Unix
/var/log/faillog日志详解
【4月更文挑战第8天】`/var/log/faillog`是Unix和Linux系统中记录登录失败尝试的日志文件,帮助管理员检测恶意登录和错误密码尝试。每行包含用户名、登录终端、时间戳和失败次数。高失败次数可能暗示密码破解尝试,管理员应密切关注并采取安全措施。启用和配置此功能可能需使用`pam_faillock`。然而,`/var/log/faillog`仅是安全策略的一部分,应结合强密码、系统更新、访问限制和多日志监控以增强安全性。
19 1
/var/log/faillog日志详解