详解记录Java Log的几种方式

作者:EvelynHouseba 时间:2022-11-10 16:38:19 

目录
  • 一、System.out.println(最简单)

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

  • 三、log4j(最强大)

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

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

在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");

输出结果:

详解记录Java Log的几种方式

(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 后, 会同时写入文件。输出结果:

详解记录Java Log的几种方式
详解记录Java Log的几种方式

三、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等其他的日志框架,对于开发者而言,每种日志都有不同的写法。如果以实际的日志框架来进行编写,之后更换日志系统就很麻烦。

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

详解记录Java Log的几种方式

四、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");
   }
}

来源:https://blog.csdn.net/EvelynHouseba/article/details/117248656

标签:Java,Log,日志
0
投稿

猜你喜欢

  • Android手机闹钟服务AlarmManagerk开发案例

    2023-05-21 14:15:28
  • C#实现类型的比较示例详解

    2022-02-18 18:17:44
  • 利用Spring Data MongoDB持久化文档数据的方法教程

    2023-05-05 02:36:54
  • 解决VSCode调试react-native android项目错误问题

    2023-10-14 02:02:11
  • Java 调用Restful API接口的几种方式(HTTPS)

    2021-06-19 02:26:55
  • spring boot使用thymeleaf为模板的基本步骤介绍

    2023-12-13 15:07:23
  • C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

    2021-10-21 09:08:21
  • Springboot2.0处理自定义异常并返回json

    2021-06-01 03:42:24
  • SpringCloud用Zookeeper搭建配置中心的方法

    2022-12-17 18:16:18
  • JAVA实现扫描线算法(超详细)

    2023-06-30 13:33:20
  • C#设计模式实现之迭代器模式

    2023-05-31 19:21:58
  • C#在子线程中更新窗口部件的写法

    2022-04-01 09:57:50
  • 解决java执行cmd命令调用ffmpeg报错Concat error - No such filter '[0,0]'问题

    2023-03-14 20:35:11
  • ZooKeeper入门教程一简介与核心概念

    2022-11-24 18:36:00
  • Flutter 日历组件简单实现

    2023-10-21 11:04:35
  • Java文件断点续传实现原理解析

    2022-08-21 02:05:39
  • C#使用GZipStream解压缩数据文件的方法

    2022-09-22 15:40:34
  • 详解xamarin Android 实现ListView万能适配器

    2022-11-26 02:12:33
  • java 微信随机红包算法代码实例

    2022-12-03 12:29:08
  • Spring Cloud Gateway网关XSS过滤方式

    2021-08-07 13:16:53
  • asp之家 软件编程 m.aspxhome.com