最近在做数据的转换处理,过程需要查看处理过程,所以要记录日志,就闲着来写了个日志工具类练练手,觉得用着还可以,贴出来,有需要的小朋友,可以直接拿去用:
package com.project.handlesapdata.material.syncMaterial;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*
* @author wangwuji
* 2019年10月31日
* description: 日志输出工具类
*/
public class LogUtil {
public static void main(String[] args) {
LogUtil logUtil = new LogUtil();
logUtil.setMaxLogsize(1);
while (logUtil.fileIndex<2) {
logUtil.info("yyyy-MM-dd-HH-mm-ss yyyy-MM-dd-HH-mm-ss yyyy-MM-dd-HH-mm-ss");
}
logUtil.setWriteTimeONConsole(true);
logUtil.refreshLogFileStorePathConfig("d:/logs/dd");
while (logUtil.fileIndex<10) {
logUtil.info("yyyy-MM-dd-HH-mm-ss yyyy-MM-dd-HH-mm-ss yyyy-MM-dd-HH-mm-ss");
}
}
int fileIndex = 1;
private String formatStr = "yyyy-MM-dd HH-mm-ss";
private SimpleDateFormat sdfDirName = new SimpleDateFormat("yyyyMMdd HHmmss");
private SimpleDateFormat sdfConsoleOupt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String logFileStorePath=null;
private String logPath=null;
private File logFile = null;
private String originFileName="log.txt";
private BufferedWriter bw = null;
private boolean isWriteTimeONConsole=false;
private boolean isCreateDirParentWithTime=true;
private long maxSize=1024*1024*5;//文件最大大小,单位字节,大于这个数字后生成第二个日志文件
public LogUtil() {
initLogConfig();
}
public LogUtil(String logFileStorePath) {
this.logFileStorePath=logFileStorePath;
initLogConfig();
}
public LogUtil(String logFileStorePath,String originFileName) {
this(logFileStorePath);
this.originFileName=originFileName;
initLogConfig();
}
public LogUtil(String logFileStorePath,String originFileName,boolean isWriteTimeONConsole) {
this(logFileStorePath,originFileName);
this.isWriteTimeONConsole=isWriteTimeONConsole;
initLogConfig();
}
public LogUtil(String logFileStorePath,String originFileName,
boolean isWriteTimeONConsole,boolean isCreateDirParentWithTime) {
this(logFileStorePath,originFileName,isWriteTimeONConsole);
this.isCreateDirParentWithTime=isCreateDirParentWithTime;
initLogConfig();
}
public LogUtil(String logFileStorePath,String originFileName,
boolean isWriteTimeONConsole,boolean isCreateDirParentWithTime,long maxSize) {
this(logFileStorePath,originFileName,isWriteTimeONConsole,isCreateDirParentWithTime);
this.maxSize=maxSize;
initLogConfig();
}
private void initLogConfig() {
initFormatStr(this.formatStr);
initLogFileStorePath(this.logFileStorePath);
initLogFile();
}
private void initFormatStr(String formatStr){
sdfDirName = new SimpleDateFormat(formatStr);
}
private void initLogFileStorePath(String logFileStorePath){
if(logFileStorePath==null){
String currentAbsolutePath=this.getClass().getResource("").getPath();//当前class根路径
String curDiskRootPath=currentAbsolutePath.substring(1,4);//当前磁盘分区根路径
logFileStorePath = curDiskRootPath+"/logs";
}
if(isCreateDirParentWithTime){
logPath = logFileStorePath + "/" + sdfDirName.format(new Date());
}else{
logPath = logFileStorePath;
}
}
private void initLogFile(){
File parentDirOflogFile = new File(logPath);
if (!parentDirOflogFile.exists()) {
parentDirOflogFile.mkdirs();
}
logFile = new File(logPath + "/"+this.originFileName);
try {
if (!logFile.exists()) {
logFile.createNewFile();
}
Writer out = new FileWriter(logFile, true);
bw = new BufferedWriter(out);
} catch (IOException e) {
e.printStackTrace();
}
}
private void createNewFile() throws IOException {
String fileName=originFileName.substring(0,originFileName.lastIndexOf("."));
String subfix = originFileName.substring(originFileName.lastIndexOf("."), originFileName.length());
String newName = fileName + fileIndex + subfix;
logFile = new File(logPath + "/" + newName);
logFile.createNewFile();
Writer out = new FileWriter(logFile, true);
bw = new BufferedWriter(out);
fileIndex++;
}
public void refreshLogConfig() {
this.initLogConfig();
}
public void refreshDateFormatConfig(String formatStr) {
sdfDirName = new SimpleDateFormat(formatStr);
}
public void refreshLogFileStorePathConfig(String logFileStorePath) {
initLogFileStorePath(logFileStorePath);
initLogFile();
}
private void writeToDoc(String str) {
try {
if (logFile.length() > maxSize) {
createNewFile();
}
bw.write(str);
bw.newLine();
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public void newLine() {
try {
bw.newLine();
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public String debug(String str) {
String outputInfo=null;
if(isWriteTimeONConsole){
String time = sdfConsoleOupt.format(new Date());
outputInfo=time + ": " + str;
}else{
outputInfo=str;
}
System.out.println(outputInfo);
return outputInfo;
}
public void info(String str) {
writeToDoc(debug(str));
}
private void setFormatStr(String formatStr){
this.formatStr=formatStr;
}
public void setLogFileStorePath(String logFileStorePath) {
this.logFileStorePath = logFileStorePath;
}
public String getLogFileStorePath() {
return logPath;
}
public void setOriginFileName(String originFileName) {
this.originFileName=originFileName;
}
public String getOriginFileName() {
return originFileName;
}
public void setMaxLogsize(int size){
maxSize=1024*1024*size;
}
public long getMaxLogsize(){
return maxSize;
}
public boolean isCreateDirParentWithTime() {
return isCreateDirParentWithTime;
}
public void setCreateDirParentWithTime(boolean isCreateDirParentWithTime) {
this.isCreateDirParentWithTime = isCreateDirParentWithTime;
}
public boolean isWriteTimeONConsole() {
return isWriteTimeONConsole;
}
public void setWriteTimeONConsole(boolean isWriteTimeONConsole) {
this.isWriteTimeONConsole = isWriteTimeONConsole;
}
}
代码中我封装了debug和info两个级别的输出,debug只输出到控制台,info输出到控制台同时输出到日志文件中。main方法中有调用的例子,需要的小伙伴,拿去用吧。有好的改进意见也可以提出来评论下,一块儿改进。