一、场景说明:
2020/11/1的时候我们团队上线了一个某安的LC计算模块,我们是以Jar的形式去做第三方计算支持。java+mybatis 去做的一个项目没有Spring的支支持我们就调用对应的Main() 去执行代码块。但是在windows下我们使用log4j.properties 是完全没有问题但是不清楚为什么在部署生产的手就会出现日志记录不完整,最后实在是没有办法。我们就用java中的IO流去做了一个日志记录。 下面我们就给大家介绍一下我们的工具类书写。
二、代码演示
public class LoggerUtils{
// 获取当前操作系统(用于换行回车)
private static final boolean isWindos = System.getProperty("os.name").toLowerCase().contains("win");
// 是否需要删除上一月的日志(根据自己系统进行调试)
private static final boolean FLAG_TYPE = false;
// 设置logFile的字符集
private static final CHARACTER_SET = "UTF-8";
// 设置时间格式
private static LocalDateTime now = LocalDateTime.now();
/**
* info 日志输出
*
* @param msg 消息
* @param className 执行类名
* @param filePath 日志存放路径
*/
public static void info(String msg,String filePath,String className){
FileOutputStream fos = null;
OutputStreamWrite osw = null;
try{
// 配置日志文件存放路径
File file = new File(getLogFilePath(filePath,FlAG_TYPE));
// 判断对应了路径是否存在,如果没有就创建一下
if(!file.exists()){
file.createNewFile();
}
// 创建日志文件输出位置,支持续写,设置字符集
fos = new FileOutputStream(file,true);
osw = new OutputStreamWrite(fos,CHARACTER_SET);
// 写入换行
if(isWindows){
osw.write("\r\n");
}else{
osw.write("\n");
}
// 拼接日志输出
StringBuilder sbr = new StringBuilder();
sbr.append(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(now));
sbr.append(" INFO ").append(className).append(" - ");
sbr.append(msg);
osw.write(sbr.toString());
}catch (IOException e){
error("嘻嘻出错了,赶紧解决","D:",LoggerUtils.class.getSimpleName(),e);
}finally{
try{
osw.close();
fos.close();
}catch(IOException e){
error("嘻嘻出错了,赶紧解决","D:",LoggerUtils.class.getSimpleName(),e);
}
}
}
/**
* error 日志输出
*
* @param msg 消息
* @param className 执行类名
* @param filePath 日志存放路径
* @param e 异常日志
*/
public static void error(String msg,String filePath,String className,exception e){
FileOutputStream fos = null;
OutputStreamWrite osw = null;
try{
// 配置日志文件存放路径
File file = new File(getLogFilePath(filePath,FlAG_TYPE));
// 判断对应了路径是否存在,如果没有就创建一下
if(!file.exists()){
file.createNewFile();
}
// 创建日志文件输出位置,支持续写,设置字符集
fos = new FileOutputStream(file,true);
osw = new OutputStreamWrite(fos,CHARACTER_SET);
// 写入换行
if(isWindows){
osw.write("\r\n");
}else{
osw.write("\n");
}
// 拼接日志输出
StringBuilder sbr = new StringBuilder();
sbr.append(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(now));
sbr.append(" ERROR ").append(className).append(" - ");
sbr.append(getExceptionPrintStackTrace(e));
osw.write(sbr.toString());
}catch (IOException e){
error("嘻嘻出错了,赶紧解决","D:",LoggerUtils.class.getSimpleName(),e);
}finally{
try{
osw.close();
fos.close();
}catch(IOException e){
error("嘻嘻出错了,赶紧解决","D:",LoggerUtils.class.getSimpleName(),e);
}
}
}
/**
* 获取日志文件的存放位置,选择是否删除上月的文件夹
*
* @param logIFilePath 文件路径
* @param flag 是否删除上月文件(true:删除,false:不删除)
* @return string 日志文件存放路径
* linux : /home/2020-11/data-log-2020-11-01.log
* windows : D:\\data-log-2020-11-01.log
*/
public static String getLogFilePath(String logFilePath,Boolean flag){
StringBuilder sbr = new StringBuilder();
// 每月的第一天删除上月的日志
if(flag && now.getDayOfMonth()==1){
// 删除文件
new File(logFilePath+"/"+DateTimeFormatter.ofPattern("yyyy-MM").format(now.plusMonths(-1))).delete();
}
if(flag){
sbr.append(logFilePath).append("/");
sbr.append(DateTimeFormatter("yyyy-MM").format(now)).append("/");
sbr.append("data-log-").append(DateTimeFormatter("yyyy-MM-dd").format(now));
sbr.append(".log")
}else{
sbr.append(logFilePath).append("\");
sbr.append("data-log-").append(DateTimeFormatter("yyyy-MM-dd").format(now));
sbr.append(".log")
}
return sbr.toString();
}
/**
* 输出异常日志信息
*
* @param exception 异常信息
* @return str 异常信息
*/
public static String getExceptionPrintStackTrace(Exception exception){
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
exception.printStackTrace(pw);
return sw.toString();
}
}
代码已全部写完,这是使用流的方式记录一下我们的日志。如有错误,请各位路过的大佬提出宝贵意见。
也可以借鉴这个: 第二种方式