今日在项目当中想要重构一下 log4j 的info 方法,发现有一些好的办法,所以进行一些记录。
目标:在项目当中有时候需要把一些遗忘掉的重要内容统一输出。但是因为大家在写程序的时候获取日志的方法都是较为简便的写法,如:
private Logger log = Logger.getLogger(OrderServiceImpl.class); 所有想要实现一个类来偷换掉 logger 是不太可能的了。
另外,根据网上有些用户的办法 新建一个 org.apache.log4j.Logger 类,然后通过 eclipse 重构,让整个项目关于这个部分的代码全部被修改过来,个人感觉对项目伤害比较大,所以不太赞成使用。继续搜索后发现,其实 log4j.properties 里边的 layout 是可以修改的。只需要自己写一个类,继承与原先的 org.apache.log4j.PatternLayout ,实现里边的
public String format(LoggingEvent event) 方法,基本上就可以进行自定义的输出了。
配置文件如下:
#define logfile
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.Encoding=GBK
log4j.appender.logfile.File= ${log.output.directory}/zjgjgxcucc.log
log4j.appender.logfile.DatePattern=.yyyy-MM-dd
#以下修改成自己实现的类
log4j.appender.logfile.layout=com.xxx.LogLayoutTest
log4j.appender.logfile.layout.ConversionPattern=%d %p [%t] [%c] - <%m>%n
代码如下:
/**
* 重构 log4j 的日志格式化输出方法,所有的日志当中加入渠道商id。
*/
public String format(LoggingEvent event) {
Object userId = "abcsss";
String info = super.format(event);
try{
String level = event.getLevel().toString();
String str = "["+level.toUpperCase()+"]"; // [INFO] [DEBUG] 等等
int index = info.indexOf(str);
String first = info.substring(0, str.length());
String last = info.substring(index + 6);
return first + " 登陆用户:"+userId+ last;
//request.getSession().setAttribute("sessionMessage", "im'sessionMessage!");
//request.getSession().getAttribute("sessionMessage");
}catch (Exception e) {
//e.printStackTrace();
}
return info;
}
同时,引用以下网上的资源,还可以将log4j 当中的某些内容,输出成 HTML 方式。即继承 HTMLLayout 类。原文地址:
http://onlyonetoone.iteye.com/blog/1563658