log4j的终极封装
通用型(再也不用每个类new一个logger了)
public class Log {
private static Map<String,Logger> loggerMap = new HashMap<String,Logger>();
public static void main(String[] args) throws ClassNotFoundException {
Log.error("自定义LOG","sss444444");
}
public static void debug(Object message){
String className = getClassName();
Logger log = getLogger(className);
if(log.isDebugEnabled()){
log.debug(message);
}
}
public static void debug(String tag, Object message){
String className = getClassName();
Logger log = getLogger(className);
if(log.isDebugEnabled()){
log.debug(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
}
}
public static void info(Object message){
String className = getClassName();
Logger log = getLogger(className);
if(log.isInfoEnabled()){
log.info(message);
}
}
public static void info(String tag, Object message){
String className = getClassName();
Logger log = getLogger(className);
if(log.isInfoEnabled()){
log.info(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
}
}
public static void warn(Object message){
String className = getClassName();
Logger log = getLogger(className);
log.warn(message);
}
public static void warn(String tag, Object message){
String className = getClassName();
Logger log = getLogger(className);
log.warn(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
}
public static void error(Object message){
String className = getClassName();
Logger log = getLogger(className);
log.error(message);
}
public static void error(String tag, Object message){
String className = getClassName();
Logger log = getLogger(className);
log.error(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
}
/**
* 获取最开始的调用者所在类
* @return
*/
private static String getClassName(){
Throwable th = new Throwable();
StackTraceElement[] stes = th.getStackTrace();
StackTraceElement ste = stes[2];
return ste.getClassName();
}
/**
* 根据类名获得logger对象
* @param className
* @return
*/
private static Logger getLogger(String className){
Logger log = null;
if(loggerMap.containsKey(className)){
log = loggerMap.get(className);
}else{
try {
log = Logger.getLogger(Class.forName(className));
loggerMap.put(className, log);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return log;
}
}
spring型(上个注释自己帮我们log了)
@Aspect
@Service
public class LoggerAdvice { private Logger logger = Logger.getLogger(this.getClass()); @Before("within(com.example.webmanager..*) && @annotation(loggerManage)")
public void addBeforeLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
logger.info("执行 " + loggerManage.description() + " 开始");
logger.info("地址 "+joinPoint.getSignature().toString());
logger.info("参数 "+this.parseParames(joinPoint.getArgs()));
} @AfterReturning("within(com.example.webmanager..*) && @annotation(loggerManage)")
public void addAfterReturningLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
logger.info("执行 " + loggerManage.description() + " 结束");
} @AfterThrowing(pointcut = "within(com.example.webmanager..*) && @annotation(loggerManage)", throwing = "ex")
public void addAfterThrowingLogger(JoinPoint joinPoint, LoggerManage loggerManage, Exception ex) {
logger.error("执行 " + loggerManage.description() + " 异常", ex);
} private String parseParames(Object[] parames) {
if (null == parames || parames.length <= 0) {
return "";
}
StringBuffer param = new StringBuffer("传入参数[");
for (Object obj : parames) {
param.append("{").append(ToStringBuilder.reflectionToString(obj)).append("} ");
}
param.append("]");
return param.toString();
} } @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoggerManage {
String description();
}
log4j的终极封装的更多相关文章
- SQLHelper、DBUtil终极封装
DBUtil.java package org.guangsoft.util; import java.io.InputStream; import java.sql.Connection; impo ...
- DRF终极封装ViewSet和Router附教程PDF源码
在DRF官方教程的学习过程中,一个很明显的感受是框架在不断地进行封装,我们自己写框架/工具/脚本/平台也可以模仿模仿,先完成底层代码,再做多层封装,让使用者很容易就上手操作.本文是教程的最后一篇,介绍 ...
- 分页Bean终极封装
package org.guangsoft.vo; import java.util.List; public class Page { private Integer pageNum; privat ...
- 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(二)
Log4j 这个东西,大家都熟悉,就简单的介绍一下,算是一个抛砖引玉,因为我自己在Log日志的搭建方面,没有什么经验,但这东西确实是非常重要的,日后调Bug没有它基本不可能,如果有朋友有什么比较好的L ...
- 项目中logger、message错误信息的配置
申明:在一个项目中必不可少的是Logger和错误信息的配置,现在给出在我们常用的处理方法. —.创建一个ConfigUtils类和他对应的rah.properties文件和Test测试类 Config ...
- day86
视图组件 基于以往我们所用的视图函数,我们发现其中冗余的代码比较多,今天就来对其进行封装,争取做一个代码洁癖者 原来我们的视图函数: class Book(APIView): def get(self ...
- RESTframwork之视图view
一 在view.py 中: class AuthorView(APIView): def get(self, request): author_list = Author.objects.all() ...
- IOS项目之弹出动画终结篇
在之前写过IOS项目之弹出动画一.IOS项目之弹出动画二.IOS项目之弹出动画三,今天来一个终极封装已经上传到Github上弹出动画总结篇UIPopoverTableView. UIPopoverTa ...
- 必读的 Android 文章
必读的 Android 文章 掘金官方 关注 2017.06.07 13:58* 字数 25218 阅读 8782评论 2喜欢 218 写给 Android 开发者的混淆使用手册 - Android ...
随机推荐
- Python-socket网络编程-Day8
目录Day8-Python socket 11.Socket 11.1.socket和file的区别: 11.2.WEB服务应用: 21.3.更多功能 21.4.socket方法: 41.5. 服务端 ...
- 新概念英语(1-35)Our village
新概念英语(1-35)Our village Are the children coming out of the park or going into it ? This is a photogra ...
- SpringCloud的注解:汇总篇
使用注解之前要开启自动扫描功能,如下配置中base-package为需要扫描的包(含子包): 1 <context:component-scan base-package="cn.te ...
- POJ2318【判断点在直线哪一侧+二分查找区间】
题目大意:给定一个矩形和一些线段,线段将矩形分割为从左至右的若干部分,之后给出一些玩具的坐标,求每个部分中玩具的数量 #include<cstdio> #include<cstdli ...
- python/SQLAchemy
python/SQLAchemy SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数 ...
- 数据库“行专列”操作---使用row_number()over(partition by 分组字段 [order by 排序字段])
测试样例: create table test(rsrp string,rsrq string,tkey string,distan string); '); '); '); '); select * ...
- linux远程传输
scp scp 命令是 SSH中最方便有用的命令了,scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证. 与rcp ...
- jacascript 函数参数与 arguments 对象
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 调用函数时,实参和形参需要一一对应,但如果参数多了的话,会很苦恼: 我们可以用键值对(字面量对象)的方式传 ...
- [LeetCode] Degree of an Array 数组的度
Given a non-empty array of non-negative integers nums, the degree of this array is defined as the ma ...
- 【实验吧】CTF_Web_简单的SQL注入之1
题目链接:http://ctf5.shiyanbar.com/423/web/ 简单的SQL注入之1,比2,3都简单一些.利用2 的查询语句也可以实现:1'/**/union/**/select/** ...