软件封装工具(牛人自制升降工具)

平时Java项目的开发通常需要统一管理日志(Log)的输出,例如控制日志信息输送的目的地(控制台、文件等),控制每一条日志的输出格式,把日志分为不同的级别等。常用的比较成熟的Java日志管理工具有Apache的Log4j等。但有时我们平时一时兴趣想写个小Dmeo或小工具,想较好的控制日志的输出,引入专业的日志管理库又显得比较繁琐,下面我就自己封装一个简单的日志工具类(LogUtils.java)。

大家好,又见面了,我是你们的朋友全栈君。

本文链接: http://blog.csdn.net/xietansheng/article/details/70478082

平时 Java 项目的开发通常需要统一管理日志(Log)的输出,例如控制日志信息输送的目的地(控制台、文件等),控制每一条日志的输出格式,把日志分为不同的级别等。常用的比较成熟的 Java 日志管理工具有 Apache 的 Log4j 等。但有时我们平时一时兴趣想写个小Dmeo或小工具,想较好的控制日志的输出,引入专业的日志管理库又显得比较繁琐,下面我就自己封装一个简单的日志工具类(LogUtils.java),需要用时拷贝即用。

LogUtils工具类支持 4 种日志级别(debug、info、warn、error),可以把日志信息格式化输出到 控制台 或 文件。

使用方法如下:

package com.xiets.log;

import java.io.File;

public class Main { 
   

    private static final String TAG = "Main";

    public static void main(String[] args) throws Exception { 
   
        // (可选) 设置日志输出级别, 默认为 INFO 级别
        LogUtils.setLogOutLevel(LogUtils.Level.DEBUG);

        // (可选) 设置日志输出文件(追加到文件尾部)
        LogUtils.setLogOutFile(new File("MyLog.log"));

        // (可选) 设置日志输出位置(是否输出到控制台 和 是否输出到文件), 默认只输出到控制台, 不输出到文件
        LogUtils.setLogOutTarget(true, true);

        // 输出日志
        LogUtils.debug(TAG, "The debug log.");
        LogUtils.info(TAG, "The info log.");
        LogUtils.warn(TAG, "The warn log.");
        LogUtils.error(TAG, "The error log.");
    }

}

LogUtils.java日志工具类的封装:

package com.xiets.log;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.text.SimpleDateFormat;
import java.util.Date;
/** * 日志输出工具 <br/><br/> * * 可以输出到控制台和指定的文件中, 分为4个级别, 由低到高分别为: debug, info, warn, error * * <br/><br/> * * 输出级别: * * <ul> * <li> debug: 输出 debug, info, warn, error </li> * <li> info: 输出 info, warn, error </li> * <li> warn: 输出 warn, error </li> * <li> error: 输出 error </li> * </ul> * * 默认为 info 输出级别 * * <p/> * * Demo: * * <pre>{@code * // (可选) 设置日志输出级别, 默认为 INFO 级别 * LogUtils.setLogOutLevel(LogUtils.Level.DEBUG); * * // (可选) 设置日志输出文件(追加到文件尾部) * LogUtils.setLogOutFile(new File("MyLog.log")); * * // (可选) 设置日志输出位置(是否输出到控制台 和 是否输出到文件), 默认只输出到控制台, 不输出到文件 * LogUtils.setLogOutTarget(true, true); * * // 输出日志 * LogUtils.debug("TAG", "The debug log."); * LogUtils.info("TAG", "The info log."); * LogUtils.warn("TAG", "The warn log."); * LogUtils.error("TAG", "The error log."); * }</pre> * * @author xietansheng */
public class LogUtils { 

/** 每条 Log 的 tag 输出的最大长度, 超过部分将被截断 */
private static final int TAG_MAX_LENGTH = 20;
/** 每条 Log 的 message 输出的最大长度, 超过部分将被截断 */
private static final int MESSAGE_MAX_LENGTH = 1024;
/** 日期前缀格式化 */
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd HH:mm:ss.SSS");
/** 日志当前的输出级别, 默认为 INFO 级别 */
private static Level logOutLevel = Level.INFO;
/** 是否输出到控制台, 默认输出 */
private static boolean isOutToConsole = true;
/** 是否输出到文件 */
private static boolean isOutToFile = false;
/** 日志输出文件, 追加到文件尾 */
private static File logOutFile;
/** 日志文件输出流, 追加到文件尾 */
private static RandomAccessFile logOutFileStream;
public static void setLogOutLevel(Level currentLevel) { 

if (currentLevel == null) { 

currentLevel = Level.INFO;
}
LogUtils.logOutLevel = currentLevel;
}
public static synchronized void setLogOutFile(File logOutFile) throws IOException { 

LogUtils.logOutFile = logOutFile;
if (logOutFileStream != null) { 

closeStream(logOutFileStream);
logOutFileStream = null;
}
if (LogUtils.logOutFile != null) { 

try { 

logOutFileStream = new RandomAccessFile(LogUtils.logOutFile, "rw");
logOutFileStream.seek(LogUtils.logOutFile.length());
} catch (IOException e) { 

closeStream(logOutFileStream);
logOutFileStream = null;
throw e;
}
}
}
public static void setLogOutTarget(boolean isOutToConsole, boolean isOutToFile) { 

LogUtils.isOutToConsole = isOutToConsole;
LogUtils.isOutToFile = isOutToFile;
}
public static void debug(String tag, String message) { 

printLog(Level.DEBUG, tag, message, false);
}
public static void info(String tag, String message) { 

printLog(Level.INFO, tag, message, false);
}
public static void warn(String tag, String message) { 

printLog(Level.WARN, tag, message, false);
}
public static void error(String tag, String message) { 

printLog(Level.ERROR, tag, message, true);
}
public static void error(String tag, Exception e) { 

if (e == null) { 

error(tag, (String) null);
return;
}
PrintStream printOut = null;
try { 

ByteArrayOutputStream bytesBufOut = new ByteArrayOutputStream();
printOut = new PrintStream(bytesBufOut);
e.printStackTrace(printOut);
printOut.flush();
error(tag, new String(bytesBufOut.toByteArray(), "UTF-8"));
} catch (Exception e1) { 

e1.printStackTrace();
} finally { 

closeStream(printOut);
}
}
private static void printLog(Level level, String tag, String message, boolean isOutToErr) { 

if (level.getLevelValue() >= logOutLevel.getLevelValue()) { 

String log = DATE_FORMAT.format(new Date()) +
" " +
level.getTag() +
"/" +
checkTextLengthLimit(tag, TAG_MAX_LENGTH) +
": " +
checkTextLengthLimit(message, MESSAGE_MAX_LENGTH);
if (isOutToConsole) { 

outLogToConsole(isOutToErr, log);
}
if (isOutToFile) { 

outLogToFile(log);
}
}
}
private static void outLogToConsole(boolean isOutToErr, String log) { 

if (isOutToErr) { 

// System.err 和 System.out 是两个不同的输出流通道, 如果极短时间内连
// 续输出 log 到 err 和 out, 控制台上的打印顺序可能会不完全按时序打印.
System.err.println(log);
} else { 

System.out.println(log);
}
}
private static synchronized void outLogToFile(String log) { 

if (logOutFileStream != null) { 

try { 

logOutFileStream.write((log + "\n").getBytes("UTF-8"));
} catch (IOException e) { 

e.printStackTrace();
}
}
}
private static String checkTextLengthLimit(String text, int maxLength) { 

if ((text != null) && (text.length() >  maxLength)) { 

text = text.substring(0, maxLength - 3) + "...";
}
return text;
}
private static void closeStream(Closeable stream) { 

if (stream != null) { 

try { 

stream.close();
} catch (Exception e) { 

// nothing
}
}
}
public static enum Level { 

DEBUG("D", 1), INFO("I", 2), WARN("W", 3), ERROR("E", 4);
private String tag;
private int levelValue;
private Level(String tag, int levelValue) { 

this.tag = tag;
this.levelValue = levelValue;
}
public String getTag() { 

return tag;
}
public int getLevelValue() { 

return levelValue;
}
}
}

控制台输出结果:

result.png

日志文件输出结果:

result-file.png


软件封装工具(牛人自制升降工具)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128987.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 解决:java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider

    解决:java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider控制台报错:java.lang.NoSuchMethodException:tk.mybatis.mapper.provider.base.BaseSelectProvider.&lt;init&gt;()浏览器访问:http://localhost:8081/category/list?pid=0解决办法:应该导入importtk.mybatis…

  • 拉氏变换应用_拉氏反变换公式表

    拉氏变换应用_拉氏反变换公式表由系统函数零、极点分别决定时域特性(一)零、极点分布与波形特征的对应的零、极点:典型情况极点分布与原函数波形对应关系极点位于s平面坐标原点,冲激响应为阶跃函数 极点位于s平面实轴上,冲激响应具有指数形式,正为指数增长,负为指数衰减 虚轴上共轭极点给出等幅振荡 极点落在s平面左平面内共轭极点对应衰减震荡(左平面衰减,共轭极点振荡)多重极点典型情况(一般几重极点就乘上t的几次方)位于s平面坐标原点的二阶或三阶极点分别给出时间函数为t或他(1/2)t^2 实轴上二阶极点给出t与指数函数的

    2022年10月28日
  • clion 2021 激活码破解方法

    clion 2021 激活码破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 2020年5月份编程语言排行榜「建议收藏」

    2020年5月份编程语言排行榜「建议收藏」前言本文章中语言排名数据来自TIOBE排行榜和PYPL排行榜。这段时间一直在忙,都忘记更新这个排行榜了,今天重操旧业,给大家看一下5月份的编程语言排行榜TIOBE排行榜5月份数据2020年5月TIOBE指数以下是官方说明五月标题:编程语言C又回到了第一位Java和C在4月份已经非常接近了,但是这个月C再次超越了Java。上一次C排名第一是在2015年。我们只能猜测为什么C又是第一名。其中一个原因可能是冠状病毒。这听起来可能很傻,但有些编程语言确实从这种情况中受益。数据科学领域的例子有P

  • firefox修改版_火狐浏览器没有收藏按钮

    firefox修改版_火狐浏览器没有收藏按钮雅虎收藏+的扩展,不是不能用,也不是冲突,现在还没有发现,改造后用的好好的。就是它安装包里的安装文件的版本限制问题,它支持了2.*版本的firefox,ff3就自动把它列为不支持的扩展了,其实都好着呢。所以只需把安装软件改一下就没有问题了。怎么改呢?对于新装“雅虎收藏+”扩展的人:用7-zip或winzip或winrar等解压缩工具打开yahoo.xpi文件。这个xpi其实就是个zi…

    2022年10月28日
  • PG数据库事务隔离级别「建议收藏」

    PG数据库事务隔离级别「建议收藏」Postgres数据库事务隔离级别介绍

    2022年10月11日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号