封装log4j支持记录到testng
一、初始方案
自动化中需要把日志通过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];
}
}
封装log4j支持记录到testng的更多相关文章
- 项目中添加Log4J支持
		首先,在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Append ... 
- ELK环境配置+log4j日志记录
		ELK环境配置+log4j日志记录 1. 背景介绍 在大数据时代,日志记录和管理变得尤为重要. 以往的文件记录日志的形式,既查询起来又不方便,又造成日志在服务器上分散存储,管理起来相当麻烦, 想根据一 ... 
- 基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
		由于我们有时候需要在基于.net framework的项目上使用(如Winform端应用),有时候有需要在.net core的项目上使用(如.net core的WebAPI),那么我们把基于SQLSu ... 
- Hibernate 使用log4j日志记录
		日志记录使程序员能够将日志详细信息永久写入文件.这是我们以后在开发当中非常重要的一步. Hibernate使用log4j日志记录,我们需要以下几个步骤: 1.导入jar包: (1)这是hibernat ... 
- 小票打印机指令集封装(支持EPSON指令)
		最近写了一些关于小票打印机的程序,不难,但是记录下来,作为足迹吧. 现在市场上的小票机基本都支持EPSON指令.指令集文档 对指令集进行了自己的封装,方便以后调用: package aheiziUti ... 
- ELK菜鸟手记 (一) 环境配置+log4j日志记录
		1. 背景介绍 在大数据时代,日志记录和管理变得尤为重要. 以往的文件记录日志的形式,既查询起来又不方便,又造成日志在服务器上分散存储,管理起来相当麻烦, 想根据一个关键字查询日志中某个关键信息相当困 ... 
- 在android中配置 slf4j + log4j 日志记录框架
		需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ... 
- Hibernate使用Log4j日志记录(使用properties文件)
		我们知道,Log4j和Logback框架可用于支持日志记录hibernate,使用log4j有两种执行日志记录的方法: 通过log4j.xml文件(或) 通过log4j.properties文件 在这 ... 
- Hibernate使用Log4j日志记录(使用xml文件)
		日志记录使程序员能够将日志详细信息永久写入文件. Log4j和Logback框架可以在hibernate框架中使用来支持日志记录. 使用log4j执行日志记录有两种方法: 通过log4j.xml文件( ... 
随机推荐
- 关于super关键字
			1.在Java中,有时会遇到子类中的成员变量或方法与父类中的成员变量或方法同名.此时父类的成员变量或方法就会被隐藏(可以理解为重写),如果还想要使用父类中的这个成员变量或方法,就需要用到super. ... 
- ubuntu14.04安装chromium以及flash插件
			之前找了好几个方法都不还用,今天突然发现,还挺简单的.命令如下: sudo apt-get updatesudo apt-get install chromium-browser#sudo add-a ... 
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明.RP
			1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ... 
- java IO之File基本操作
			public static void main(String[] args) { // TODO Auto-generated method stub //"G:\\JAVA\\test\\ ... 
- SSH不能连接虚拟机中的Ubuntu
			设置 网络 既然要远程ubuntu的系统.那么首先是两个网络是不是在一个网段.能不能ping的通? a) Windows电脑上--cmd 打开命令窗口.键入:ipconfig 命令.查看主机IP. b ... 
- Codeforces 691E Xor-sequences(矩阵快速幂)
			You are given n integers a1, a2, ..., an. A sequence of integers x1, x2, ..., xk is called a & ... 
- js和C# 时间日期格式转换
			下午在搞MVC和EXTJS的日期格式互相转换遇到了问题,我们从.NET服务器端序列化一个DateTime对象的结果是一个字符串格式,如 '/Date(1335258540000)/' 这样的字串. 整 ... 
- 安装和使用 Elasticsearch(1.1.1)+marvel插件、Kibana插件
			Elasticsearch是开源搜索平台的新成员,实时数据分析的神器,发展迅猛,基于 Lucene.RESTful.分布式.面向云计算设计.实时搜索.全文搜索.稳定.高可靠.可扩展.安装+使用方便,介 ... 
- SQL 语句case when
			简介 case when 一般有两种书写方式,多用于查询判断 1. case 列名 when '' then '空' ' then '成功' ' then '失败' else '其他' end as ... 
- python - seletors实现IO多路复用
			服务端 from socket import * import selectors sel = selectors.DefaultSelector() def accept(server_fileob ... 
