基于Java8的日志类实现_java8 函数式日志-程序员宅基地

技术标签: java  Java8  日志  函数式编程  

在程序员打印日志是一个常见的需求,为此Java提供了内置的Logger类来实现,然而Logger类虽然比较好用,但是它还需要我们自己构造消息体,如果我们利用StackTrace来自动添加调用信息的话,不论是否当前Log级别是否被允许,这些代码都会被执行,显然在生产环境下,这种情况是需要尽量避免的。为了解决这个问题,我们有两种解决方案,其一是扩展Java的Logger类,判断当前Log级别允许时再通过StackTrace来取得调用信息,其二就是利用Java8新引入函数式接口,来实现这一功能。

首先,我们需要定义一个通用的日志类,代码如下所示:

/**
 * 采用Java8函数式接口的日志类
 * @author 闫涛 2016.06.12
 *
 */
public class AppLogger {
	public static void log(LogLevel logLevel, Supplier<String> supplier) {
		if (logLevel.getLogLevel() >= LOG_LEVEL.getLogLevel()) {
			String msg = supplier.get();
			StackTraceElement[] stes = new Exception().getStackTrace();
			StackTraceElement caller = stes[1];
			String methodName = caller.getMethodName(); 
			String className = caller.getClassName();
			String lineNumber = "" + caller.getLineNumber();
			System.out.println(className + "." + methodName + "(" + lineNumber + "):" + msg);
		}
	}
	
	/**
	 * 日志级别枚举类型定义
	 * @author 闫涛 2016.06.12
	 *
	 */
	public static enum LogLevel {
		TRACE(1), DEBUG(2), INFO(3), WARNING(4), ERROR(5);
		private int logLevel = 0;
		private LogLevel(int logLevel) {
			this.logLevel = logLevel;
		}
		public int getLogLevel() {
			return logLevel;
		}
	}
	
	public static LogLevel LOG_LEVEL = LogLevel.INFO;
}
在上面的代码中,我们首先定义了一个LogLevel的枚举类型,定义应用中会用到的日志级别。接着,我们定义一个静态变量LOG_LEVEL来保存当前的日志级别,只有要求打印日志的级别大于或等于本级别时,才会打印相应的内容。

在日志函数中,我们首先判断日志级别是否大于或等于我们定义的允许级别,如果小于则不做任何处理。如果大于,首先通过StackTrace来取出调用者的类名、方法名和行数,然后与要打印的消息进行合并,打印到控制台中。

在程序中需要打印日志时,只需进行如下的调用:

AppLogger.log(AppLogger.LogLevel.INFO, ()->"需要打印的消息");

其会打印出类似如下的内容:

com.haisijia.hxll.simulator.VendorDemo.test(59):需要打印的消息

如果程序部署到生产环境,只需把LOG_LEVEL的值提高到ERROR级别,就可以避免日志打印所带来的性能降低了。同时,还可以动态改变LOG_LEVEL,来临时调试一些BUG。



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Yt7589/article/details/51645229

智能推荐

信号与系统——差分方程的建立及经典解法-程序员宅基地

文章浏览阅读2.7w次,点赞33次,收藏169次。离散系统的解析描述--建立差分方程1. 差分的定义移位序列:设有序列f(k), 则… , f(k+2), f(k+1), f(k-1),f(k-2),… 等称为f(k)的移位序列。差分运..._系统的差分方程

平台篇-八年磨一剑,重新定义 HBase——HBase 2.0&阿里云 HBase 解读 ...-程序员宅基地

文章浏览阅读236次。八年磨一剑1.1 HBase 的前世今生关系型数据库的发展已经经历了 40 多年的历史了,而 HBase 以及大数据这套东 西的历史大概从 2006 年被认为是大数据的发起时期到现在,也就是 13 年左右 而已。那么,为什么会出现 HBase 以及 Hadoop 整体生态链的这些内容呢?这 是因为在大数据时代,传统数据库需要面对很多挑战,出现了数据量增..._hbase 2.2 2.1 对比

硬盘录像机-DVR文件系统及硬盘发展趋势_dvr 设备通常使用什么文件系统来存储视频-程序员宅基地

文章浏览阅读4.4k次。嵌入式硬盘录像机(DVR)与PC机一样,都存在硬盘文件系统。嵌入式DVR硬盘文件系统可分为两类,一是与PC机相同的FAT文件系统,第二种是嵌入式DVR生产厂家自行开发的,适合存储大容量媒体数据流的专业文件系统。 目前市场上,PC-based DVR一般基于Windows系统,文件系统一般采用NTFS或FAT32;而嵌入式 DVR所采用的文件系统则与厂商选择的嵌入式操作系统有密切的_dvr 设备通常使用什么文件系统来存储视频

linux mac地址自动分配-程序员宅基地

文章浏览阅读1.2k次。问题mac地址在设备树写死,导致多个板卡在一个系统中mac地址冲突,打算采用uboot中的mac地址,出厂时手动设置不同mac_linux mac地址自动分配

CentOS 7.6 安装mysql_centos7.6安装mysql-程序员宅基地

文章浏览阅读1.2k次。4.1 检查是否已安装mysqlrpm -qa | grep mysql若已安装有mysql,可执行以下命令进行卸载# 普通删除模式rpm -e mysql# 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除rpm -e --nodeps mysql4.2 下载安装下载地址:https://dev.mysql.com/downloads/repo/yum/# 下载wget -i -c http://dev.mysql.com/get/my_centos7.6安装mysql

Thingsboard Gateway_thingsboard中的getaway是如何实现的-程序员宅基地

文章浏览阅读8k次。Gateway是什么?gateway在thingsboard平台定义为一种特殊的设备,通过图形化配置的方式,解析OPC UA、modbus、MQTT、Http协议;通过定时任务,拿到数据解析和转换数据,然后通过MQTT协议传输到thingsboard云端,存储到时序数据库。官网链接https://thingsboard.io/docs/iot-gateway/what-is-io..._thingsboard中的getaway是如何实现的

随便推点

Linux内存初始化(4)——伙伴系统(buddy)_div_round_up-程序员宅基地

文章浏览阅读884次。Linux内存初始化说明mm_initmem_initfree_all_bootmem相关文章说明Kernel版本:4.0.0ARM处理器,Contex-A9,QEMU平台  上文完成了zone的初始化工作,接下来需要初始化伙伴系统(Buddy系统)。mm_init  mm_init函数,主要对内核内存分配器进行初始化。start_kernel->mm_init/* * Set up kernel memory allocators */static void __init mm_div_round_up

python生成订单号或生成任意序列_python 生成订单号-程序员宅基地

文章浏览阅读3.2k次。python生成订单号或生成任意序列示例代码:import time# 生成订单号def get_order_code(): # 年月日时分秒+time.time()的后7位 order_no = str(time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) + str(time.time()).replace('.', '')[-7:]) return order_noprint(get_o_python 生成订单号

搭建hadoop和spark分布式环境_hadoop@zhoucong-virtual-machine:/usr/local/spark/b-程序员宅基地

文章浏览阅读1k次。root权限密码:本机&amp;lt;15 Ubuntu的密码是:204Spark的分布环境需要基于HDFS,所以在装spark之前我们需要先配置hadoop分布式系统:1.实验做啥:基本:配置完成hadoop环境延伸:配置完成spark环境(实验二的部分内容)Hadoop 集群的安装配置大致为如下流程:1.选定一台机器作为 Master2.在 Master 节点上配置 hadoop 用户、..._hadoop@zhoucong-virtual-machine:/usr/local/spark/bin$ ./spark-submit --maste

英特尔杀入游戏显卡市场:3000元档位,支持光追和AI超分辨率,挑战AMD英伟达...-程序员宅基地

文章浏览阅读215次。晓查 发自 凹非寺量子位 报道 | 公众号 QbitAI千呼万唤始出来,在游戏显卡一卡难求(原价)的今天,英特尔给玩家们带来了一个好消息:正式发布高性能游戏显卡品牌Arc(中文名:锐炫)。...

电商项目环境搭建(谷粒商城)_谷粒商城 项目环境搭建文档-程序员宅基地

文章浏览阅读260次。电商项目环境配置1.vagrant快速创建虚拟机并连接(centos7)新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入1.vagrant快速创建虚拟机并连接(centos7)前期准备:①安装好Virtual Box,打_谷粒商城 项目环境搭建文档

无法通过adb将文件push到system的问题_adb push system-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏8次。本文整理自文末参考地址,Android adb调试时,经常会遇到权限问题(failed for /system/lib/libmm-test.so, Read-only file system),即使Root设备,在向/system等系统文件夹操作时(比如push、rm等),依然可能会提示“Read-only file system”。可尝试如下方法解决。一、典型提示操作1、向设备push_adb push system

推荐文章

热门文章

相关标签