详解记录Java Log的几种方式

 更新时间:2021年06月04日 15:47:11   作者:EvelynHouseba  
很多小伙伴不知道如何记录日志,今天特地整理了本篇文章,文中有非常详细的介绍及代码示例,对小伙伴们很有帮助,需要的朋友可以参考下

在Java中记录日志的方式有如下几种:

一、System.out.println(最简单)

1、输出到控制台:System.out.println("XXX");
2、输出到指定文件:

import java.io.PrintStream;
 
PrintStream ps = new PrintStream("D:\\test.txt");
System.setOut(ps);
System.out.println("XXX");

二、java.util.logging(相对简单)

JDK自带的logging.jar中的方法。通过位于JDK安装路径下的jre/lib/logging.properties文件进行配置。

1、默认配置如下:

handlers= java.util.logging.ConsoleHandler
 
.level= INFO
 
# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
 
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

默认是输出到控制台,如果既想在控制台,又想在文件中,要修改如下配置:

handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler

Logger的级别按降序排序如下:

  • SEVERE(最高值)
  • WARNING
  • INFO 
  • CONFIG 
  • FINE 
  • FINER 
  • FINEST(最低值)

默认所有log的输出级别是INFO(.level= INFO),比INFO更低的日志不会显示。
控制台的Log输出级别可以特殊控制,默认也是INFO,可以修改如下配置:

java.util.logging.ConsoleHandler.level = INFO

2、实例

(1)输出到控制台:

Logger log = Logger.getLogger("testLog"); 
log.setLevel(Level.WARNING);
log.warning("xxxx testLog warning");

输出结果:

(2)输出到文件:

FileHandler fileHandler;//文件控制器
try {
    fileHandler = new FileHandler("D:\\temp\\text.log");
	fileHandler.setLevel(Level.INFO);
	fileHandler.setFormatter(new Formatter() {//定义一个匿名类
         //Formatter 接受 LogRecord,并将它转换为一个字符串。 
         @Override
         public String format(LogRecord record) {
             
             Date date = new Date();  
             String sDate = date.toString();  
             return "[" + sDate + "]" + "[" + record.getLevel() + "]" + ":" +  record.getMessage() + "\n";  
         }
    });
 
	Logger log = Logger.getLogger("testLog");
	log.addHandler(fileHandler); 
	log.info("aaa"); 
} catch (SecurityException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

默认状况下, 日志会打印到控制台。添加 filehandler 后, 会同时写入文件。输出结果:


三、log4j(最强大)

可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。具体配置不在此处详述。

1、Log4J的输出级别按降序排序如下:

  • OFF             最高等级,关闭日志
  • FATAL          可能导致应用中止的严重事件错误 
  • ERROR       严重错误,主要是程序错误 
  • WARN         一般警告 
  • INFO           一般显示信息 
  • DEBUG       调试信息 
  • TRACE        比DEBUG更细粒度的事件信息 
  • ALL              最低等级

2、实例

import org.apache.log4j.Logger;
public class Log4jTest {
 
    private static Logger log = Logger.getLogger(Log4jTest.class);
    public void log() {
        log.info("hello this is log4j info log");
    }
 
    public static void main(String[] args) {
        Log4jTest test = new Log4jTest();
        test.log();
    }
}

除了上述几种,还存在logback等其他的日志框架,对于开发者而言,每种日志都有不同的写法。如果以实际的日志框架来进行编写,之后更换日志系统就很麻烦。

由此诞生了以下的门面类日志框架(它们都不是日志的最终实现,只是一套规范),将系统和具体的日志实现框架解耦合。

四、commons-logging(全称:Jakarta Commons Logging

commons-logging是为那些需要建立在不同环境下使用不同日志架构的组件或库的开发者创建的,由commons-logging在运行时决定使用哪种日志架构。

默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的(按照顺序,寻找过程会在找到第一个工具时中止):

  • 首先在classpath下寻找自己的配置文件commons-logging.properties,使用其中定义的Log实现类;
  • 找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,使用其定义的Log实现类;
  • 否则,查看classpath中是否有Log4j的包,有则自动使用Log4j作为日志实现类;
  • 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
  • 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;

在common-logging.properties文件中设置实现Log接口的类:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

commons-logging结合Log4J的实例

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class JCLTest {
 
    private static Log log = LogFactory.getLog(JCLTest.class);
    public void log() {
       
       log.info("hello this is JCL info log");
    }
 
    public static void main(String[] args) {
       JCLTest test = new JCLTest();
       test.log();
    }
}

五、slf4j(全称:Simple Logging Facade for Java,简单日志门面

SLF4j+Log4j 与 JCL+Log4J 的使用方式差不多,主要差异就在 SLF4J 用 jar 来告知用哪种日志实现,而 JCL 是通过配置文件来获得该选择哪个日志实现。

实例

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
 
    private static final Logger log = LoggerFactory.getLogger(Test.class);
    public void test() {
        log.info("hello this is {} info log", "SLF4J");
    }
}

到此这篇关于详解记录Java Log的几种方式的文章就介绍到这了,更多相关Java Log内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java8中的默认垃圾回收器(GC)

    java8中的默认垃圾回收器(GC)

    这篇文章主要介绍了java8中的默认垃圾回收器(GC),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Mybatis的update更新批量与普通解决方式对比

    Mybatis的update更新批量与普通解决方式对比

    这篇文章主要为大家介绍了Mybatis的update更新批量与普通解决方式对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • spring中@Reference注入为空的解决方法

    spring中@Reference注入为空的解决方法

    今天上线遇到了问题,所以抽空记录一下,本文主要介绍了spring中@Reference注入为空的解决方法,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • SpringBoot项目启动报错:命令行太长解决的两种解决方法

    SpringBoot项目启动报错:命令行太长解决的两种解决方法

    SpringBoot项目启动时可能会遇到命令行太长的错误,本文介绍两种解决方法修改.idea\workspace.xml文件和执行maven的clean命令或重启IDEA,这些操作可以有效解决启动问题,需要的朋友可以参考下
    2024-10-10
  • SpringBoot给类进行赋初值的四种方式

    SpringBoot给类进行赋初值的四种方式

    这篇文章主要介绍了springboot给类进行赋初值的四种方式,并通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-08-08
  • Spring web开发教程之Request获取3种方式

    Spring web开发教程之Request获取3种方式

    这篇文章主要给大家介绍了关于Spring web开发教程之Request获取3种方式的相关资料,request对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息,需要的朋友可以参考下
    2023-11-11
  • SpringBoot接口防重复提交的三种解决方案

    SpringBoot接口防重复提交的三种解决方案

    在Web开发中,防止用户重复提交表单是一个常见的需求,用户可能会因为网络延迟、误操作等原因多次点击提交按钮,导致后台接收到多个相同的请求,本文将介绍几种在Spring Boot中实现接口防重复提交的方法,需要的朋友可以参考下
    2024-11-11
  • Java用邻接矩阵存储图的示例代码

    Java用邻接矩阵存储图的示例代码

    邻接矩阵通常采用一个一维数组存储图中节点的信息,采用一个二维数组存储图中节点之间的邻接关系。本文将利用Java实现用邻接矩阵存储图,需要的可以参考一下
    2022-06-06
  • 详解Java解析XML的四种方法

    详解Java解析XML的四种方法

    本篇文章主要介绍了java解析XML的几种方式,XML现在已经成为一种通用的数据交换格式,给数据集成与交互提供了方便,有需要的可以了解一下。
    2016-11-11
  • Java 类与对象重难点详解

    Java 类与对象重难点详解

    类(class)和对象(object)是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型
    2021-11-11

最新评论