强迫症犯了,忍不住赞一下slf4j包Logger.java的优雅代码
如下是slf4j-api包下的Logger接口类里其中几个方法的声明:
package org.slf4j;
public interface Logger {
/**
* Log a message at the INFO level.
*
* @param msg the message string to be logged
*/
public void info(String msg);
/**
* Log a message at the INFO level according to the specified format and argument.
*
* @param format the format string
* @param arg the argument
*/
public void info(String format, Object arg);
/**
* Log a message at the INFO level according to the specified format and arguments.
*
* @param format the format string
* @param arguments a list of 3 or more arguments
*/
public void info(String format, Object... arguments);
/**
* Log a message at the ERROR level.
*
* @param msg the message string to be logged
*/
public void error(String msg);
public void error(String format, Object arg);
public void error(String format, Object... arguments);
/**
* Log an exception (throwable) at the ERROR level with an accompanying message.
*
* @param msg the message accompanying the exception
* @param t the exception (throwable) to log
*/
public void error(String msg, Throwable t);
}
slf4j(Simple Logging Facade for Java)是Facade模式的典型应用,它定义了一套标准的日志接口,诸如logback、log4j、slf4j-simple等框架都是这个日志接口的具体实现。从这一点来看,slf4j的标准化显得相当重要,当然,从上面这些方法可见,它做到了!
我这里要点赞的也是这几个方法的定义。注意观察比较这几个有参的info/error方法的第一个参数:有的是format,有的是msg。
充分展现了代码的整洁之道,由此可以看出来作者是很讲究代码的可读性的。
看上面几个方法,
- 如果记录异常信息,不妨调用error(String msg, Throwable t)方法。这时,第一个参数不是format,是msg。所以下面语句里的“{}”就有画蛇添足之嫌了:
try {
......
}
} catch (IOException e) {
LOG.error("#PayCenterHttpTransport,http调用出错!异常信息:{}", e);
}
- 如果要打印更详细的info日志,可以调用logger.info那几个重载方法,支持用format形式。
log.info("融宝请求url:{},请求报文:{}", url, json);
- logger.error也是支持format的。如下是Logger接口类里这个error重载方法的定义。注意调用方式是
log.error("执行请求{}出现异常,",1,new Exception("test"));
/**
* Log a message at the ERROR level according to the specified format and arguments.
* <p/>
* <p>This form avoids superfluous object creation when the logger is disabled for the ERROR level. </p>
*
* @param format the format string
* @param arg1 the first argument
* @param arg2 the second argument
*/
public void error(String format, Object arg1, Object arg2);
打印的异常日志是:
14:55:25.997 [main] ERROR ddd - 执行请求1出现异常,
java.lang.Exception: test
at com.emax.paycenter.common.util.MailUtil.main(MailUtil.java:100) [classes/:na]
=====over=====
强迫症犯了,忍不住赞一下slf4j包Logger.java的优雅代码的更多相关文章
- Android导包导致java.lang.NoClassDefFoundError
摘要: SDK方法总数是不能超过65k的.是否也引入其他的三方库,导致总数超过限制.超出限制会导致部分class找不到,引发java.lang.NoClassDefFoundError.解决方法:近日 ...
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...
- 多线程包:java.util.concurrent,
Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent,
- 韩顺平细说Servlet视频系列意外收获之用命令行编译带有包的java类解决方案
命令行编译带有包的java类 在命令行编译这一块,基本上都是新手入门时了解一下,然后就直奔IDE而去.这样固然没错,就怕那些--.然后今天在视频中看到了这种方法,觉得可能会用到,所以就记录下来了,以备 ...
- JDK重要包和Java学习方法论
以下内容摘自:万能的林萧说:一篇文章教会你,如何做到简历中要求的“要有扎实的Java基础” 第一级别:精读源码 该级别包含的包如下: java.io java.lang java.util 第二 ...
- java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是扩展包。
java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是扩展包.
- (转载)Eclipse将引用了第三方jar包的Java项目打包成可执行jar的两种方法
转载自:http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 "MA ...
- 文件IO 相关的包:java.io文件——API
文件IO 相关的包:java.io文件——API 1.Java.io.File类的使用(1)两种路径绝对路径:相对于当前路径:当前为 “工程名”(2)File类创建,对象为一个文件/目录,可能存在或不 ...
- static特别用法【静态导包】——Java包的静态导入
面试我问你static关键字有哪些作用,如果你答出static修饰变量.修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满意,因为能看出你非常热 ...
随机推荐
- Linux配置定时,使用 crontab -e 与 直接编辑 /etc/crontab 的区别
转自:http://blog.csdn.net/catoop/article/details/41821395 版权声明:本文为博主原创文章,未经博主允许不得转载. Linux配置定时任务,大家都知道 ...
- win10 caffe python Faster-RCNN训练自己数据集(转)
一.制作数据集 1. 关于训练的图片 不论你是网上找的图片或者你用别人的数据集,记住一点你的图片不能太小,width和height最好不要小于150.需要是jpeg的图片. 2.制作xml文件 1)L ...
- linux清理日志脚本
1.删除日志的命令 find 目录路径 -mtime +天数 -name "文件名" -exec rm -rf {} \; 例如:#!/bin/bash find /usr/loc ...
- windows 端口被占用,并杀死进程的方法
netstat -ano | findstr 8081 查询端口 被什么进程占用 tasklist | findstr 2184 根据进程号 查询任务名称 taskkill /f /t /im jav ...
- flume学习笔记——安装和使用
Flume是一个分布式.可靠.和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力. Flume是一 ...
- 蜕变成蝶~Linux设备驱动之异步通知和异步I/O
在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代.异步通知类 ...
- SQL开头quoted和ansiNULL
“QUOTED_IDENTIFIER” 当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔. 当 SET QUOTED_IDENTIFIER ...
- store.state
https://blog.csdn.net/qq_38658567/article/details/82847758
- iOS - 跳转到系统设置
一.跳转到自己应用设置(iOS8以上系统推荐使用) //跳转到自己应用干的设置配置页(如 定位.相机.相册 这些隐私配置) [[UIApplication sharedApplication] ope ...
- Jmeter中使用SSH插件,连接远程linux机器执行命令
一.Why 在云主机测试中,需要使用SSH协议连接云主机进行相关操作 在python中使用paramiko库很好实现,在如果要使用jmeter做性能测试时,怎么做? 二.解决 既然原生jmeter没有 ...