java 实现一个简单的日志功能,输出到文件或者输出到控制台

版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/sinat_34820292 https://blog.csdn.net/sinat_34820292/article/details/81504241

项目中简单的记录日志,输出到控制台,上线直接设置输出级别,记录关键信息

这里写图片描述 这里写图片描述

实现了一个简单的日志,使用效果如上图,记录时间,日志类型,调用位置,消息内容。直接上代码,细节看注释


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Log {
    public final static int OUT_CONSOLE=1;
    public final static int OUT_FILE=2;
    public final static int OUT_BOTH=3;
    public final static int DEBUG_LEVEL=0;
    public final static int LOG_LEVEL=3;
    public final static int INFO_LEVEL=6;
    public final static int WARN_LEVEL=9;
    public final static int ERROR_LEVEL=12;
    public final static int FATAL_LEVEL=15;
    protected static int level=DEBUG_LEVEL;// 输出的级别开关,高于指定级别的输出
    protected static int out=OUT_CONSOLE; //输出模式,输出到控制台,文件或者都输出
    public static String logdir="log";    // 保存日志文件的目录
    protected static BufferedWriter bw =null;
    protected static String currentDate = "";
    protected static Date data=null;
    protected static StringBuilder bb=new StringBuilder();
    protected static String marsk=" [ERROE] ";
    /**
     * 日志函数,不受 level 限制,始终打印,最高级别
     * @param s
     */
    synchronized public static void log(Object ...s) {
        bb.delete(0, bb.length());
        bb.append(time());
        bb.append(marsk);
        // 获取调用的位置
        StackTraceElement[] stack = new Exception().getStackTrace();
        bb.append(stack[2].getClassName().replaceAll("\\$\n.$", ""));
        bb.append("::");
        bb.append(stack[2].getMethodName());
        bb.append("()第[");
        bb.append(stack[2].getLineNumber());
        bb.append("]行: ");
        for(Object str : s) {
            bb.append(str);
            bb.append(" ");
        }
        out(bb.toString());
    }
    public static void debug(Object ...s) {
        if(level<=DEBUG_LEVEL) {
            marsk=" [DEBUG] ";
            log(s);
        }

    }
    public static void info(Object ...s) {
        if(level<=INFO_LEVEL){
            marsk=" [INFO ] ";
            log(s);
        }
    }
    public static void warn(Object ...s) {
        if(level<=WARN_LEVEL){
            marsk=" [WARN ] ";
            log(s);
        }
    }
    public static void error(Object ...s) {
        if(level<=ERROR_LEVEL){
            marsk=" [ERROR] ";
            log(s);
        }
    }
    public static void fatal(Object ...s) {
        if(level<=FATAL_LEVEL){
            marsk=" [FATAL] ";
            log(s);
        }
    }
    protected static void out(String s) {
        if(out==OUT_BOTH) {
            System.out.println(s);
            tofile(s);
        }else if(out==OUT_FILE) {
            tofile(s);
        }else if(out==OUT_CONSOLE) {
            System.out.println(s);
        }
    }
    protected static void tofile(String s) {
        getWriter();
        try {
            bw.newLine();
            bw.write(s);
            bw.flush();
        }catch(Exception e) {

        }
    }
    protected static BufferedWriter getWriter() {
        if(currentDate.equals(new SimpleDateFormat("dd").format(data))) {
            return bw;
        }
        File fi=new File(logdir
                +File.separator+new SimpleDateFormat("yyyy年").format(data)
                +File.separator+new SimpleDateFormat("MM月").format(data)
                +File.separator+new SimpleDateFormat("dd").format(data)+"日.log");
        try {
            if(!fi.exists()) {
                if(!fi.getParentFile().exists())
                    fi.getParentFile().mkdirs();
                fi.createNewFile();
            }
            FileOutputStream fiou = new FileOutputStream(fi,true);
            OutputStreamWriter opw = new OutputStreamWriter(fiou, "UTF-8");
            bw= new BufferedWriter(opw);
        }catch(Exception e) {

        }
        return bw;
    }
    protected static String time() {
        data = new Date();
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(data);
    }

    /**
     * 初始化
     * @param out_put_level 日志输出等级,只输出较高等级的 debug < info < warn < error < fatal
     * @param out2where 输出到哪里 OUT_CONSOLE仅仅控制台输出,OUT_FILE仅仅输出到文件,OUT_BOTH均输出
     * @param log_dir 日志保存到哪里
     */
    public static void init(int out_put_level,int out2where,String log_dir) {
        level = out_put_level;
        out=out2where;
        logdir = log_dir;
    }

    public static void main(String[] args) {
        Log.debug("这是一个错误","可变长参数","无需拼接字符串");
    }
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/sinat_34820292/article/details/81504241