赞
踩
废话不多说,直接上过程。
第一步,在pom.xml文件中添加以下坐标
<!-- 阿里云sls日志服务 --> <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log-producer</artifactId> <version>0.3.10</version> </dependency> <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log-log4j-appender</artifactId> <version>0.1.13</version> </dependency> <dependency> <groupId>com.szboanda</groupId> <artifactId>aliyun-sls</artifactId> <version>1.0.1</version> </dependency>
第二部,点击copylib.bat重新下载依赖
第三步,从lib文件夹下找到 aliyun-sls-1.0.1.jar包打开,找到spring-mvc.xml.bak文件夹,拷贝到桌面上,
复制出以下内容,粘贴到你自己项目中的spring-mvc.xml文件里(一般放在最下面)
<aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 阿里云日志项目配置 --> <beans:bean id="ProjectConfig" class="com.aliyun.openservices.aliyun.log.producer.ProjectConfig"> <beans:constructor-arg value="" index="0" /><!-- project 待填写--> <beans:constructor-arg value="" index="1" /><!-- endpoint 待填写 --> <beans:constructor-arg value="" index="2" /><!-- accessKeyId 待填写 --> <beans:constructor-arg value="" index="3" /><!-- accessKeySecret 待填写 --> </beans:bean> <!-- 生产者配置 --> <beans:bean id="ProducerConfig" class="com.aliyun.openservices.aliyun.log.producer.ProducerConfig" /> <!-- 生产者 --> <beans:bean id="Producer" class="com.aliyun.openservices.aliyun.log.producer.LogProducer"> <beans:constructor-arg ref="ProducerConfig" index="0" /> </beans:bean> <!-- 系统日志切面 --> <beans:bean id="sysLogAspect" class="com.szboanda.aliyun.log.SysLogAspect"> <beans:constructor-arg ref="Producer" index="0" /> <beans:constructor-arg ref="ProjectConfig" index="1" /> <beans:constructor-arg value="xietong2qi" index="2" /> <beans:constructor-arg value="" index="3" /> <!-- 系统名称 待填写 --> <beans:constructor-arg value="自定义操作" index="4" /> <beans:constructor-arg value="新增或修改操作" index="5" /> <beans:constructor-arg value="删除操作" index="6" /> <beans:constructor-arg value="菜单访问操作" index="7" /> </beans:bean> <!-- 配置形式 --> <aop:config> <!-- 动态表单保存切点 --> <aop:pointcut expression="execution(* com.szboanda.dynamicform.viewresolver.controller.ViewResolverController.saveOrupdate(..))" id="dynamicformsaveCut"/> <!-- 自定义注解切点 --> <aop:pointcut expression="@annotation(com.szboanda.aliyun.log.SysLog)" id="sysAnnotationCut"/> <!-- 动态表单删除切点 --> <aop:pointcut expression="execution(* com.szboanda.dynamicform.viewresolver.controller.ViewResolverController.deletebymbbhxh(..))" id="dynamicformdeleteCut"/> <!-- 访问菜单切点 --> <aop:pointcut expression="execution(* com.szboanda.platform.rms.menu.controller.MenuController.addMenuAccess(..))" id="menuAccessCut"/> <!-- aspect 标签切面 --> <aop:aspect ref="sysLogAspect" order="0"> <aop:around method="sysAnnotationCut" pointcut-ref="sysAnnotationCut"/> <aop:after method="dynamicformsaveCut" pointcut-ref="dynamicformsaveCut" /> <aop:after method="dynamicformdeleteCut" pointcut-ref="dynamicformdeleteCut" /> <aop:after method="menuAccessCut" pointcut-ref="menuAccessCut" /> </aop:aspect> </aop:config>
其中 阿里云日志项目配置(sls) 要找对应项目负责人拿,同时,系统日志切面需要填写当前系统名称
第四步,查看自己spring-mvc.xml 是否有aop头部声明,要是没有声明,请将该aop头部声明拷贝到自己项目中的spring-mvc.xml文件中。
这里附上AOP头部声明
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
第五步,使用sls自定义注解(如果你的项目里面,功能全部是通过动态表单,动态列表实现,没有自己写controller层,请忽略这步,如果有写,请在对应方法上加上注解以便记录用户日志,推送阿里云sls)
这里附上注解以及注解路径:
import com.szboanda.aliyun.log.SysLog;
@SysLog(action="方法说明")
第六步,重写公司平台类,将下面的类拷贝到各位所负责的项目中。(由于平台包日志记录工具类使用的是类方法调用,AOP不支持监控静态方法,且若打成jar包,会存在类重复问题,因此只能重写)
package com.szboanda.component.log.syslog; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.slf4j.LoggerFactory; import com.szboanda.component.log.cmommon.CurrentRequestData; /** * @Title: 系统日志输出类 * @author 庞东博 * @since JDK1.6 * @history 2017年5月23日 庞东博 新建 */ public class SysLog { /** * 输出trace级别的日志 * * @param clazz * @param msg */ public static void trace(Class<?> clazz, String msg) { LoggerFactory.getLogger(clazz).trace(resetMessage(msg)); try { Logger logger = LogManager.getLogger(clazz); logger.trace(resetMessage(msg)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出trace级别的日志 * * @param clazz * @param format * @param arguments */ public static void trace(Class<?> clazz, String format, Object... arguments) { LoggerFactory.getLogger(clazz).trace(resetMessage(format), arguments); try { Logger logger = LogManager.getLogger(clazz); logger.trace(resetMessage(format)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出trace级别的日志 * * @param clazz * @param msg * @param t */ public static void trace(Class<?> clazz, String msg, Throwable t) { LoggerFactory.getLogger(clazz).trace(resetMessage(msg), t); try { Logger logger = LogManager.getLogger(clazz); logger.trace(resetMessage(msg), t); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出debug级别的日志 * * @param clazz * @param msg */ public static void debug(Class<?> clazz, String msg) { LoggerFactory.getLogger(clazz).debug(resetMessage(msg)); try { Logger logger = LogManager.getLogger(clazz); logger.debug(resetMessage(msg)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出debug级别的日志 * * @param clazz * @param format * @param arguments */ public static void debug(Class<?> clazz, String format, Object... arguments) { LoggerFactory.getLogger(clazz).debug(resetMessage(format), arguments); try { Logger logger = LogManager.getLogger(clazz); logger.debug(resetMessage(format)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出debug级别的日志 * * @param clazz * @param msg * @param t */ public static void debug(Class<?> clazz, String msg, Throwable t) { LoggerFactory.getLogger(clazz).debug(resetMessage(msg), t); try { Logger logger = LogManager.getLogger(clazz); logger.debug(resetMessage(msg), t); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出info级别的日志 * * @param clazz * @param msg */ public static void info(Class<?> clazz, String msg) { LoggerFactory.getLogger(clazz).info(resetMessage(msg)); try { Logger logger = LogManager.getLogger(clazz); logger.info(resetMessage(msg)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出info级别的日志 * * @param clazz * @param format * @param arguments */ public static void info(Class<?> clazz, String format, Object... arguments) { LoggerFactory.getLogger(clazz).info(resetMessage(format), arguments); try { Logger logger = LogManager.getLogger(clazz); logger.info(resetMessage(format)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出info级别的日志 * * @param clazz * @param msg * @param t */ public static void info(Class<?> clazz, String msg, Throwable t) { LoggerFactory.getLogger(clazz).info(resetMessage(msg), t); try { Logger logger = LogManager.getLogger(clazz); logger.info(resetMessage(msg),t); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出warn级别的日志 * * @param clazz * @param msg */ public static void warn(Class<?> clazz, String msg) { LoggerFactory.getLogger(clazz).warn(resetMessage(msg)); try { Logger logger = LogManager.getLogger(clazz); logger.warn(resetMessage(msg)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出warn级别的日志 * * @param clazz * @param format * @param arguments */ public static void warn(Class<?> clazz, String format, Object... arguments) { LoggerFactory.getLogger(clazz).warn(resetMessage(format), arguments); try { Logger logger = LogManager.getLogger(clazz); logger.warn(resetMessage(format)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出warn级别的日志 * * @param clazz * @param msg * @param t */ public static void warn(Class<?> clazz, String msg, Throwable t) { LoggerFactory.getLogger(clazz).warn(resetMessage(msg), t); try { Logger logger = LogManager.getLogger(clazz); logger.warn(resetMessage(msg),t); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出error级别的日志 * * @param clazz * @param msg */ public static void error(Class<?> clazz, String msg) { LoggerFactory.getLogger(clazz).error(resetMessage(msg)); try { Logger logger = LogManager.getLogger(clazz); logger.error(resetMessage(msg)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出error级别的日志 * * @param clazz * @param format * @param arguments */ public static void error(Class<?> clazz, String format, Object... arguments) { LoggerFactory.getLogger(clazz).error(resetMessage(format), arguments); try { Logger logger = LogManager.getLogger(clazz); logger.error(resetMessage(format)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出error级别的日志 * * @param clazz * @param msg * @param t */ public static void error(Class<?> clazz, String msg, Throwable t) { LoggerFactory.getLogger(clazz).error(resetMessage(msg), t); try { Logger logger = LogManager.getLogger(clazz); logger.error(resetMessage(msg),t); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出alert级别的日志 * * @param clazz * @param msg */ public static void alert(Class<?> clazz, String msg) { LoggerFactory.getLogger("ALERT").error(resetMessage(msg)); try { Logger logger = LogManager.getLogger(clazz); logger.error(resetMessage(msg)); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出alert级别的日志 * * @param clazz * @param format * @param arguments */ public static void alert(Class<?> clazz, String format, Object... arguments) { String msg = resetMessage(format); SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String time = fmt.format(new Date()); StringBuilder sbLog = new StringBuilder(100); sbLog.append(time).append(" [ ").append(clazz.getName()).append(" ] - [").append(" ALERT ] ").append(msg); LoggerFactory.getLogger("ALERT").error(sbLog.toString(), arguments); try { Logger logger = LogManager.getLogger(clazz); logger.error(sbLog.toString()); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 输出alert级别的日志 * * @param clazz * @param msg * @param t */ public static void alert(Class<?> clazz, String msg, Throwable t) { LoggerFactory.getLogger(clazz).error(resetMessage(msg), t); try { Logger logger = LogManager.getLogger(clazz); logger.error(resetMessage(msg), t); }catch (Exception e) { LoggerFactory.getLogger(clazz).error(e.getMessage()); } } /** * 为日志内容添加关键内容 * * @param msg 日志内容 * @return */ private static String resetMessage(String msg) { if (null == msg) { msg = "Unknow error。"; } String traceId = CurrentRequestData.get().getTraceId(); String userId = CurrentRequestData.get().getYhid(); String deptId = CurrentRequestData.get().getBmbh(); StringBuilder sbMsg = new StringBuilder(msg.length() + 150); sbMsg.append("[ ").append(traceId).append(" ] - [ ").append(userId).append(" ] - [ ").append(deptId).append(" ] - ").append(msg); return sbMsg.toString(); } }
第七步,配置log4j.properties文件(将下面的内容拷贝到各位项目中的log4j文件中)
log4j.rootLogger = ERROR,stdout,D,I,W,E,loghub # 指定loghub的配置类 log4j.appender.loghub=com.aliyun.openservices.log.log4j.LoghubAppender # project名称 log4j.appender.loghub.project=xxx # 存储空间名称 log4j.appender.loghub.logStore=xxx # 地域名称,这里使用公网名称,可以去自己的日志服务里查看地域名称 log4j.appender.loghub.endpoint=xxx # 用户标识 log4j.appender.loghub.accessKeyId=xxx # 用户标识认证 log4j.appender.loghub.accessKeySecret=xxx #指定当前日志的主题,可以为空 log4j.appender.loghub.topic = "log4j" # 指定当前日志的来源,可以为空 log4j.appender.loghub.source = "xxx" #指定日志输出类配置 log4j.appender.loghub.layout=org.apache.log4j.PatternLayout # 输出格式 log4j.appender.loghub.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n # 单个 producer 实例能缓存的日志大小上限,默认为 100MB log4j.appender.loghub.totalSizeInBytes=104857600 # 如果 producer 可用空间不足,调用者在 send 方法上的最大阻塞时间,默认为 60 秒。为0则永久阻塞 log4j.appender.loghub.maxBlockMs=0 # 执行日志发送任务的线程池大小,默认为可用处理器个数。 log4j.appender.loghub.ioThreadCount=8 # 当一个 ProducerBatch 中缓存的日志大小大于等于 batchSizeThresholdInBytes 时,该 batch 将被发送,默认为 512 KB,最大可设置成 5MB。 log4j.appender.loghub.batchSizeThresholdInBytes=524288 # 当一个 ProducerBatch 中缓存的日志条数大于等于 batchCountThreshold 时,该 batch 将被发送,默认为 4096,最大可设置成 40960。 log4j.appender.loghub.batchCountThreshold=4096 # 一个 ProducerBatch 从创建到可发送的逗留时间,默认为 2 秒,最小可设置成 100 毫秒 log4j.appender.loghub.lingerMs=2000 # 如果某个 ProducerBatch 首次发送失败,能够对其重试的次数,默认为 10 次 log4j.appender.loghub.retries=10 # 首次重试的退避时间,默认为 100 毫秒。 log4j.appender.loghub.baseRetryBackoffMs=100 # 重试的最大退避时间,默认为 50 秒。 log4j.appender.loghub.maxRetryBackoffMs=50000 #时间格式 timeFormat = yyyy-MM-dd'T'HH:mm:ssZ #时区 timeZone = Asia/Beijing
其中:
第八步:大功告成,启动系统后,点击单个菜单,然后上阿里云查看日志是否推送成功
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。