java日志Logger-自定义日志输出格式 & String.format

其实就是对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()));

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值