public class LogUtil {
private static String log_path = getBasePath();// 日志保存路径
private static String log_name = "sate_log";// 日志文件名(前部分)
private static boolean console_out = true;// 日志是否输出到控制台
/*
* yyyy-MM: 每个月更新一个log日志 yyyy-ww: 每个星期更新一个log日志 yyyy-MM-dd: 每天更新一个log日志
* yyyy-MM-dd-a: 每天的午夜和正午更新一个log日志 yyyy-MM-dd-HH: 每小时更新一个log日志
* yyyy-MM-dd-HH-mm: 每分钟更新一个log日志
*/
private static String update_hz = "yyyy-MM";// 更新日志的频率,每月更新一次
private static long max_log_size = 1024 * 1024 * 10;// 单个日志文件最大大小 10M
public static void debug(String msg) {
runWrite(msg, log_path, log_name + "_debug");
}
public static void info(String msg) {
runWrite(msg, log_path, log_name + "_info");
}
public static void error(String msg) {
runWrite(msg, log_path, log_name + "_error");
}
public static void exception(Exception e) {
String errorMessage = e.getMessage() + "";
StackTraceElement[] eArray = e.getCause().getStackTrace();
for (int i = 0; i < eArray.length; i++) {
String className = e.getCause().getStackTrace()[i].getClassName();
String MethodName = e.getCause().getStackTrace()[i].getMethodName();
int LineNumber = e.getCause().getStackTrace()[i].getLineNumber();
errorMessage = errorMessage + "\n\t---" + className + "." + MethodName + ",\tline:" + LineNumber;
}
logResult(errorMessage, log_path, log_name + "_exception");
}
/**
* 日志根目录
*
* @return
*/
public static String getBasePath() {
// String s = Thread.currentThread().getContextClassLoader().getResource("").getPath();
// s = s.substring(0, s.indexOf("out")) + "log" + File.separator;
String s = System.getProperty("user.dir") + "\\log" + File.separator;
return s;
}
/**
* 写日志
*
* @param sWord
* 要写入日志里的文本内容
*/
public static void logResult(String sWord) {
runWrite(sWord, log_path, log_name);
}
public static void logResult(String sWord, String logPath, String logName) {
FileWriter writer = null;
try {
File dir = new File(logPath);
if (!dir.exists()) {
dir.mkdirs();
}
String dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
File f = new File(logPath + logName + "_" + new SimpleDateFormat(update_hz).format(new Date()) + ".txt");
if (!f.exists()) {
f.createNewFile();
sWord = "日志\r\n" + "[" + dt + "]\t" + sWord;
} else {
long logSize = f.length();
// 文件大小超过10M,备份
if (logSize >= max_log_size) {
String backLogName = logPath + logName
+ new SimpleDateFormat("_yyyy-MM-dd.HHmmss.SSS").format(new Date()) + ".txt";
f.renameTo(new File(backLogName));
}
}
writer = new FileWriter(f, true);
writer.write("[" + dt + "]\t" + sWord + "\r\n");
if (console_out) {
System.out.println("[" + dt + "]\t" + sWord);
}
} catch (Exception e) {
System.out.println("记录日志异常:" + e.toString());
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void runWrite(final String sWord,final String logPath,final String logName) {
//TODO 如何防止 多线程 同时写日志文件,造成日志文件混乱
//后续优化,单独跑一个线程写日志 多个线程同时往一个队列里写数据 写日志的线程pull数据 ArrayBlockingQueue
new Thread() {
public void run() {
logResult(sWord, logPath, logName);
}
}.start();;
}
public static void main(String[] args) {
error("一i个日志工具");
error("一i个日志工具2123");
error("一i个日志工具111");
error("一i个日志工具222");
}
}
普通项目日志记录工具类
于 2022-10-18 13:30:55 首次发布