通用型(再也不用每个类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的终极封装的更多相关文章

  1. SQLHelper、DBUtil终极封装

    DBUtil.java package org.guangsoft.util; import java.io.InputStream; import java.sql.Connection; impo ...

  2. DRF终极封装ViewSet和Router附教程PDF源码

    在DRF官方教程的学习过程中,一个很明显的感受是框架在不断地进行封装,我们自己写框架/工具/脚本/平台也可以模仿模仿,先完成底层代码,再做多层封装,让使用者很容易就上手操作.本文是教程的最后一篇,介绍 ...

  3. 分页Bean终极封装

    package org.guangsoft.vo; import java.util.List; public class Page { private Integer pageNum; privat ...

  4. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(二)

    Log4j 这个东西,大家都熟悉,就简单的介绍一下,算是一个抛砖引玉,因为我自己在Log日志的搭建方面,没有什么经验,但这东西确实是非常重要的,日后调Bug没有它基本不可能,如果有朋友有什么比较好的L ...

  5. 项目中logger、message错误信息的配置

    申明:在一个项目中必不可少的是Logger和错误信息的配置,现在给出在我们常用的处理方法. —.创建一个ConfigUtils类和他对应的rah.properties文件和Test测试类 Config ...

  6. day86

    视图组件 基于以往我们所用的视图函数,我们发现其中冗余的代码比较多,今天就来对其进行封装,争取做一个代码洁癖者 原来我们的视图函数: class Book(APIView): def get(self ...

  7. RESTframwork之视图view

    一 在view.py 中: class AuthorView(APIView): def get(self, request): author_list = Author.objects.all() ...

  8. IOS项目之弹出动画终结篇

    在之前写过IOS项目之弹出动画一.IOS项目之弹出动画二.IOS项目之弹出动画三,今天来一个终极封装已经上传到Github上弹出动画总结篇UIPopoverTableView. UIPopoverTa ...

  9. 必读的 Android 文章

    必读的 Android 文章 掘金官方 关注 2017.06.07 13:58* 字数 25218 阅读 8782评论 2喜欢 218 写给 Android 开发者的混淆使用手册 - Android ...

随机推荐

  1. Linux知识积累(8)卸载安装jdk

    java -version yum remove java yum groupremove java java -version tar -zxvf jdk-8u60-linux-x64.tar.gz ...

  2. python入门(12)dict

    python入门(12)dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例 ...

  3. 表单中各种input汇总

    html表单 表单用于搜集不同类型的用户输入,表单由不同类型的标签组成,相关标签及属性用法如下: 1.<form>标签 定义整体的表单区域 action属性 定义表单数据提交地址 meth ...

  4. MySQL 5.7 新特性之初始化

    1. 把二进制安装包下载放在/opt 目录下并解压 2. 创建软连接, 并添加运行环境 ln -s /usr/local/mysql /opt/mysql-5.7.18-linux-glibc2.5- ...

  5. Python3 面向对象编程之程序设计思想发展

    概述 1940年以前:面向机器 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语 ...

  6. 关于手机APP开发的一些常见误解

    移动应用不适用于小型企业和创业公司 如果你想要开发一款移动APP,那么在前期开发一种偏见的态度并不是一个好主意.如果你认为移动APP只有跨国公司和大企业创业者才会去开发,那么你可能错过了成功的捷径.而 ...

  7. vue-cli的使用

    1.安装node https://nodejs.org/en/download/ 2.webpack安装[我选全局安装] 全局安装 npm install --global webpack 本地安装 ...

  8. [LeetCode] Single Element in a Sorted Array 有序数组中的单独元素

    Given a sorted array consisting of only integers where every element appears twice except for one el ...

  9. Unity3D UGUI 自动调节大小

    可添加以下组件 组件包含的两个枚举参数,可以自行设定适应方式. 例如一个Text UI元素,当文字过多的时候他不会自动增加高度而导致文字不能完全显示,这时候就可以挂载这个组件,如上图设置参数,就可以自 ...

  10. 使用.Net+非关系型数据库MongoDB 实现LBS商家按距离排序_按离我最近排序

    .Net MongoDB LBS地理位置定位 开发过程,实现商家按距离排序 前言: 在使用美团点外卖,看电影,找好吃的时候,经常会注意到软件有一个按距离排序,找离我最近的商家,心中有一些疑问,.Net ...