java 自带logger_Java原生日志 java.util.logging.Logger

这是个大标题

在某些情况下写个简单的项目懒得引用Log4j的时候使用Java自带的日志也不错

先来个示例:

import java.util.logging.FileHandler;

import java.util.logging.Level;

import java.util.logging.Logger;

import java.util.logging.SimpleFormatter;

public class Main {

public static void main(String[] args) throws Exception {

Logger logger = Logger.getLogger("MyLog");

FileHandler fh;

fh = new FileHandler("c:\\MyLogFile.log", true);

logger.addHandler(fh);

logger.setLevel(Level.ALL);

SimpleFormatter formatter = new SimpleFormatter();

fh.setFormatter(formatter);

logger.log(Level.WARNING, "My first log");

}

}

来源地址:

(这网站真心屌,各种适合初学者的demo)

Demo

看了看别人的示例,不满足自己要求,研究了半天只能自己写了:

import java.io.IOException;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

import java.util.logging.*;

/**

* @Author wenqiang [2019-09-19]

* @Date September, 19, Thursday

* @Comment ...

*/

public class LogMe {

static String logFileName = "track-%u-%g.log";

static Map loggerMap = new ConcurrentHashMap<>();

static FileHandler fileHandler = null;

private static ConsoleHandler getConsoleHandler() {

ConsoleHandler consoleHandler = new ConsoleHandler();

consoleHandler.setLevel(Level.ALL);

return consoleHandler;

}

private static FileHandler getFileHandler() {

if (fileHandler != null) return fileHandler;

System.err.println("~~~> 生成 fileHandler");

try {

//生成1G大小的日志文件,最多100个,开启日志追加记录

FileHandler f = new FileHandler(logFileName, 1024 * 1024 * 1024, 100, true);

f.setFormatter(new Formatter() {

@Override

public String format(LogRecord record) {

String defaultStr = "\n[{}][{}]{}: {}";

if (this.getClass().getName().equals(record.getLoggerName())) {

defaultStr = "\n[{}][{}]{} {}";

}

return StringUtil.truncStr(defaultStr,

DateUtil.getNowDate(),

record.getLevel(),

record.getLoggerName(),

record.getMessage()

);

}

});

//f.setLevel(Level.FINE); //默认 all

f.setEncoding("UTF-8");

//f.publish();

fileHandler = f;

return f;

} catch (IOException e) {

e.printStackTrace();

//throw new MessageException("Create FileHandler fail.");

}

return null;

}

public static Logger getLogger(Class> cls) {

String name = cls.getName();

Logger logger;

if (loggerMap.containsKey(name)) {

logger = loggerMap.get(name);

} else {

logger = Logger.getLogger(name);

//logger.addHandler(getConsoleHandler());

logger.addHandler(getFileHandler());

loggerMap.put(name, logger);

}

logger.setLevel(Level.ALL);

return logger;

}

public static void error(Throwable throwable, Object... msgs) {

Logger logger = getLogger(LogMe.class);

logger.log(Level.SEVERE, StringUtil.truncStr(msgs), throwable);

}

public static void error(Throwable throwable) {

Logger logger = getLogger(LogMe.class);

logger.log(Level.SEVERE, excetpionMsg(throwable).toString(), throwable);

}

public static void info(Object... msgs) {

Logger logger = getLogger(LogMe.class);

logger.log(Level.INFO, StringUtil.truncStr(msgs));

}

public static StringBuilder excetpionMsg(Throwable throwable) {

StringBuilder sb = new StringBuilder();

StackTraceElement[] stes = throwable.getStackTrace();

for (StackTraceElement ste : stes) {

//System.out.println(ste.toString());

sb.append("\r\n");

sb.append("~~> ").append(ste.getFileName());

sb.append("[" + ste.getLineNumber() + "]").append("\r\n");

sb.append(ste.getClassName()).append(".").append(ste.getMethodName());

sb.append(": ").append(throwable.getMessage());

}

return sb;

}

}

使用方式:

import java.util.logging.Logger;

/**

* @Author wenqiang [2019-09-19]

* @Date September, 19, Thursday

* @Comment ...

*/

public class TestMain {

static Logger logger = LogMe.getLogger(TestMain.class);

public static void main(String[] args) {

logger.info("info msg");

logger.severe("severe msg");

logger.config("config msg");

logger.fine("fine msg");

logger.finer("finer msg");

logger.warning("warning msg");

logger.finest("finest msg");

System.out.println("==========>>><<<==========>>><<<==========>>><<<==========");

try {

LogMe.info("LogMe INFO1 {}");

//输出信息的时候可以类似log4j的输入信息方式输入

LogMe.info("LogMe INFO2 {}-{}-{}", 1, 2, 3);

LogMe.info("LogMe INFO3");

throw new MessageException("Test MessageException");

} catch (MessageException e) {

LogMe.error(e);

}

}

}

效果

控制台:

~~~> 生成 fileHandler

九月 19, 2019 2:34:08 下午 com.*.track.log.TestMain main

信息: info msg

九月 19, 2019 2:34:08 下午 com.*.track.log.TestMain main

严重: severe msg

九月 19, 2019 2:34:08 下午 com.*.track.log.TestMain main

警告: warning msg

==========>>><<<==========>>><<<==========>>><<<==========

九月 19, 2019 2:34:08 下午 com.*.track.log.LogMe info

信息: LogMe INFO1 {}

九月 19, 2019 2:34:08 下午 com.*.track.log.LogMe info

信息: LogMe INFO2 1-2-3

九月 19, 2019 2:34:08 下午 com.*.track.log.LogMe info

信息: LogMe INFO3

九月 19, 2019 2:34:08 下午 com.*.track.log.LogMe error

严重:

~~> TestMain.java[29]

com.*.track.log.TestMain.main: Test MessageException

com.*.track.exception.MessageException: Test MessageException

at com.*.track.log.TestMain.main(TestMain.java:29)

日志文件:

[2019-09-19 14:34:08][INFO]com.*.track.log.TestMain: info msg

[2019-09-19 14:34:08][SEVERE]com.*.track.log.TestMain: severe msg

[2019-09-19 14:34:08][CONFIG]com.*.track.log.TestMain: config msg

[2019-09-19 14:34:08][FINE]com.*.track.log.TestMain: fine msg

[2019-09-19 14:34:08][FINER]com.*.track.log.TestMain: finer msg

[2019-09-19 14:34:08][WARNING]com.*.track.log.TestMain: warning msg

[2019-09-19 14:34:08][FINEST]com.*.track.log.TestMain: finest msg

[2019-09-19 14:34:08][INFO]com.*.track.log.LogMe: LogMe INFO1 {}

[2019-09-19 14:34:08][INFO]com.*.track.log.LogMe: LogMe INFO2 1-2-3

[2019-09-19 14:34:08][INFO]com.*.track.log.LogMe: LogMe INFO3

[2019-09-19 14:34:08][SEVERE]com.*.track.log.LogMe:

~~> TestMain.java[29]

com.*.track.log.TestMain.main: Test MessageException

FileHandler 具体使用看这里:

好了,一般Java项目使用日志解决了,这算将就能用吧,如果日志专业点还是建议使用 log4j ,本文这里只简单使用Java原生日志,可以直接复制拿来使用,不建议在生产上使用。

补个文中的小工具:

DateUtils就自己写个吧就是获取一个当前日期而已;

StringUtil.truncStr(Object... msgs) :

/**

* 快捷工具,模仿 slf4j 占位符输出

*/

public static String truncStr(Object... strs) {

if (strs == null) return null;

if (strs.length < 2) return merge(strs);

String str0 = strs[0].toString();

if (!str0.contains("{}")) {

return merge(strs);

}

str0 = str0.replaceAll("\\{\\}", "%s");

Object[] objs = new Object[strs.length - 1];

int len = strs.length;

for (int i = 1; i < len; i++) {

objs[i - 1] = strs[i];

}

return String.format(str0, objs);

}

如果帮到你了,加个关注呗~~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值