一、初始方案

自动化中需要把日志通过testng的Reporter.log来记录日志在报告中展示。开始是新增了一个日志类:

ReporterLog.class

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Reporter; public class ReporterLogger {
private Logger LOGGER; public ReporterLogger(Class<?> clazz){
LOGGER= LoggerFactory.getLogger(clazz);
} public void info(String message){
//使用slf4j打印到控制台或者文件
LOGGER.info(message);
//记录到Reporter
Reporter.log(message);
} }

这样会有2个问题:

1、LOGGER.info(message);这句话打印出来的类名、方法名、行号等不是调用ReporterLogger方法info的类,二是ReporterLogger类。

2、Reporter.log记录的日志,没有时间、类名、方法名、行号。

第一个问题测试:

import com.sqe.sas.test.service.ReporterLogger;

public class LogTest {
private static final ReporterLogger LOGGER = new ReporterLogger(LogTest.class); public static void main(String[] args) {
LOGGER.info("processing。。。。");
} }

打印结果:

[main][2019-01-29 18:28:14] [INFO] [LogTest.info:25] processing。。。。

类名打印的是对的,但是方法名和行号打印的都是ReporterLogger中的

二、改进方案:

第一个问题:

使用log4j的log方法

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.testng.Reporter; public class ReporterLogger {
private Logger LOGGER; //使用org.apache.log4j.Logger 而不是org.slf4j.Logger;
static final String FQCN = ReporterLogger.class.getName(); // log4j把传递进来的callerFQCN在堆栈中一一比较,相等后,再往上一层即认为是用户的调用类 public ReporterLogger(Class<?> clazz){
LOGGER= Logger.getLogger(clazz); // 这里也要改
} public void info(String message){
//使用slf4j打印到控制台或者文件
LOGGER.log(FQCN, Level.INFO,message,null);
//记录到Reporter
Reporter.log(message);
} }

再次测试,打印结果如下:

[main][2019-01-30 10:44:23] [INFO] [LogTest.main:7] processing。。。。

已经可以了打印正确的方法名和行号了

第二个问题:

在打印的字符串前加上时间、类名、方法名、行号

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.testng.Reporter; import java.text.SimpleDateFormat;
import java.util.Date; public class ReporterLogger {
private Logger LOGGER; //使用org.apache.log4j.Logger 而不是org.slf4j.Logger;
static final String FQCN = ReporterLogger.class.getName(); // og4j把传递进来的callerFQCN在堆栈中一一比较,相等后,再往上一层即认为是用户的调用类 public ReporterLogger(Class<?> clazz){
LOGGER= Logger.getLogger(clazz); // 这里也要改
} public void info(String message){
//使用slf4j打印到控制台或者文件
LOGGER.log(FQCN, Level.INFO,message,null);
message = getLogTag()+message;
//记录到Reporter
Reporter.log(message);
}
//根据堆栈信息,拿到调用类的名称、方法名、行号
public String getLogTag(){
String logTag = "";
Long timeStamp = System.currentTimeMillis();
String dateString = timestampToDate(timeStamp);
StackTraceElement stack[] = (new Throwable()).getStackTrace();
for(int i=0;i<stack.length;i++) {
StackTraceElement s = stack[i];
if(s.getClassName().equals(LOGGER.getName())){
logTag= "["+dateString+"]"+"["+classNameDeal(s.getClassName())+":"+s.getMethodName()+":"+s.getLineNumber()+"]";
}
}
return logTag;
} //时间戳转date字符串
public static String timestampToDate(Long timestamp){
if(timestamp.toString().length() <13){
timestamp = Long.valueOf(timestamp.toString().substring(0,10)+"000");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = new Date(timestamp);
String dateStr = sdf.format(date);
return dateStr;
} //去掉包名,只保留类名
private String classNameDeal(String allName){
String[] className = allName.split("\\.");
return className[className.length-1];
}
}

最新文章

  1. java代码优化
  2. c语言指针占几个字节
  3. UFT\QTP 12 新特性
  4. 数据结构《10》----二叉树 Morris 中序遍历
  5. bzoj 3884 上帝与集合的正确用法(递归,欧拉函数)
  6. MyEclipse 8.5配置Tomcat7.0
  7. adb shell am pm
  8. ie浏览器提交参数和其它浏览器的区别
  9. Android-Bluetooth Low Energy(BLE)
  10. markdown编辑器的学习
  11. Git的fast forward和no fast forward和 three way merge 以及squash(聚合)
  12. 玩转ASP.NET Core中的日志组件
  13. js可拖拽的div
  14. springboot返回页面
  15. linux信息收集篇之sosreport
  16. java集群优化——ORM框架查询优化原理
  17. qlserver排序规则在全角与半角处理中的应用
  18. css3 - 字体图标库使用方法
  19. Flashtext 使用文档 大规模数据清洗的利器-实现文本结构化
  20. NSCalendar日历

热门文章

  1. webapi限流框架WebApiThrottle
  2. code1043 方格取数
  3. SpringMVC 2.5.6 +Hibernate 3.2.0
  4. Pandas -- Merge,join and concatenate
  5. mac安装mysql及终端操作mysql与pycharm的数据库可视化
  6. C#中深复制和浅复制
  7. 常见的MIME
  8. spark介绍4(sparksql)ODBC(Windows)gc
  9. java-03 变量与运算符
  10. SQL 语句常用函数