这是个大标题
在某些情况下写个简单的项目懒得引用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);
}
如果帮到你了,加个关注呗~~