详解记录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");
输出结果:
(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");
}
}
来源:https://blog.csdn.net/EvelynHouseba/article/details/117248656


猜你喜欢
- 基本哪些属于引用类型类(object,string),接口、数组、委托引用类型分配在哪里引用类型变量位于线程栈。引用类型实例分配在托管堆上。
- Android权限Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。这包括读写用
- 本文主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一
- 入门Springboot项目创建在IDEA中创建即可。注意点:1、所有文件都需要放在 :Application文件的同级或下级目录中2、ap
- 第1类:嵌套模式package day14;import java.io.FileInputStream;import java.io.Fi
- 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化
- 本文基于shardingsphere-jdbc-core-spring-boot-starter 5.0.0,请注意不同版本的shardin
- 本文实例讲述了C#判断页面中的多个文本框输入值是否有重复的实现方法,分享给大家供大家参考。具体实现方法如下:List<string&g
- 其中第二级目录包含了五个预定义主键分别是:HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MA
- 布局文件中的TextView属性<TextViewandroid:id="@+id/businesscardsingle_c
- XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识
- 在Java移动文件夹及其所有子文件与子文件夹可以有如下的一段简单的方法来说明:public static void moveFolder(S
- 1,现在因为遇到一个读取pdf文件文本信息遇到乱么问题,才找到这个文本字符串的编码转换的实现方式来判断是否存在乱码(0>乱码>2
- 本文实例讲述了Android编程之动态壁纸。分享给大家供大家参考,具体如下:从android 2.1版本起引入了动态壁纸的概念,熟悉andr
- 前言我们了解数组这个概念之前,我们先思考下面几个问题。如果我们需要两个数据,那么直接创建两个变量即可int a;int b;如果需要五个数据
- 使用Java实现图像分割,供大家参考,具体内容如下为减少动画制作过程中的IO操作,我们可以使用连续动画来改善动画播放效率。假如我们有如下的一
- 前言 Gallery的Item使用的是一个ImageView+TextView,并且为其设置了selector,当使用setSe
- 在 MyEclipse 的可视化 Swing 中,有 JTable 控件。JTable 用来显示和编辑常规二维单元表。那么,如何将 数据库S
- 先明确几个概念的区别: padding margin都是边距的含义,关键问题得明白是什么相对什么的边距. padding是控件的内容相对控件
- 通常情况下我们想实现文字的走马灯效果需要在xml文件中这样设置<TextView android:layout_widt