其实就是对java的日志工具类Logger的输出进行封装而已。
public class LogUtil extends Formatter {
@Override
public String format(LogRecord record) {
String message = formatMessage(record);
String throwable ="";
if(record.getThrown() !=null){
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println();
record.getThrown().printStackTrace(pw);
pw.close();
throwable = "\n"+sw.toString();
}
Thread currentThread = Thread.currentThread();
StackTraceElement stackTrace = currentThread.getStackTrace()[8];
return String.format("%tF %tT [%s] (%s:%d) %s%s\n",
new Date(), new Date(),
Thread.currentThread().getName(),
stackTrace.getFileName(),
stackTrace.getLineNumber(),
message,
throwable);
}
public static Logger installFormatter(Logger logger){
if(null != logger){
logger.setUseParentHandlers(false);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setFormatter(new LogUtil());
logger.addHandler(consoleHandler);
}
return logger;
}
}
使用:
public static Logger log = LogUtil.installFormatter(Logger.getLogger(Main.class.getSimpleName()));
log.info("");
Logger
public static Logger logger = Logger.getLogger("LoggerTest"); // 里面存放的是类名
logger.info("info");
logger.warning("warning");
logger.severe("severe");
输出结果:
对输出格式进行自定义:
logger.setUseParentHandlers(false); // 不交给父处理器处理
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setFormatter(new MyFormatter());
logger.addHandler(consoleHandler);
这里的MyFormatter就是我们自定义的日志输出格式,只需要实现Formatter的fomat方法就ok了。
public class MyFormatter extends Formatter {
@Override
public String format(LogRecord record) {
String message = formatMessage(record); // 传进去的内容
String throwable ="";
if(record.getThrown() !=null){
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println();
record.getThrown().printStackTrace(pw);
pw.close();
throwable = "\n"+sw.toString();
}
Thread currentThread = Thread.currentThread();
StackTraceElement stackTrace = currentThread.getStackTrace()[8];
return String.format("%tF %tT [%s] (%s:%d) %s%s\n",
new Date(), new Date(),
Thread.currentThread().getName(),
stackTrace.getFileName(),
stackTrace.getLineNumber(),
message,
throwable);
}
String.format
其实也是和占位符类似,但是它这里占位符也是有讲究的
%s:字符串
%d:整数
%t?:时间
?不同,表示输出的时间格式也不同
System.out.println(String.format("原本的: %tc",new Date()));
System.out.println(String.format("yyyy-MM-dd:%tF" ,new Date()));
System.out.println(String.format("MM/dd/yyyy:%tD",new Date()));
System.out.println(String.format("hh:mm:ss %tr",new Date()));
System.out.println(String.format("HH:mm:ss %tT",new Date()));
System.out.println(String.format("HH:MM %tR",new Date()));