java常见log日志的使用方法详细解析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: log日志可以debug错误或者在关键位置输出想要的结果java日志使用一般有原生logger、log4j、Slf4j等一般的日志级别都有如下(不同日志不一样的方法参数,注意甄别)科普一下原生日志生成工具,主要引用源代码函数大致有如下方法:(给定消息将被转发到所有注册的输出处理程序对象)具体示例如下:输出截图如下:可以看到小于info级别的信息不会在终端上显示输出通过来控制输出的级别。ALL则输出severe、warning以及info,OF不输出,如果设置WARNING,则只输出severe以

前言

log日志可以debug错误或者在关键位置输出想要的结果

java日志使用一般有原生logger、log4j、Slf4j等

一般的日志级别都有如下(不同日志不一样的方法参数,注意甄别)

日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL

参数 描述
OFF、ON 不输出或者输出所有级别信息,通常使用在setLevel方法中
FATAL 致命错误
ERROR 错误error
WARN 告警信息
INFO info信息
DEBUG 调试信息
TRACE 运行轨迹信息
CONFIG 设定配置信息
FINE 级别轻微信息
FINER 级别更轻微信息
FINEST 级别最轻微信息

1. Java.util.Logger

科普一下原生日志生成工具,主要引用import java.util.logging.Logger;

源代码函数大致有如下方法:
(给定消息将被转发到所有注册的输出处理程序对象)

// 严重信息
public void severe(String msg) { log(Level.SEVERE, msg);}

// 警告信息
public void warning(String msg) { log(Level.WARNING, msg);}

// info信息
 public void info(String msg) {log(Level.INFO, msg);}

// 设定配置信息
public void config(String msg) {log(Level.CONFIG, msg);}

// 级别小信息
public void fine(String msg) {log(Level.FINE, msg);}

// 级别更小信息
public void finer(String msg) {log(Level.FINE, msg);}

// 级别最小信息
public void finest(String msg) {log(Level.FINE, msg);}
AI 代码解读

具体示例如下:

package com.gaokaoli.logger;
import java.util.logging.Logger;

public class text1 {
    public static void main(String []args){
        Logger logger = Logger.getLogger("text1");

        logger.severe("严重信息");
        logger.warning("警示信息");
        logger.info("info信息");

        logger.config("设定配置信息");
        logger.fine("级别小的信息");
        logger.finer("级别更小的信息");
        logger.finest("级别最小的信息");
    }
}
AI 代码解读

输出截图如下:
在这里插入图片描述
可以看到小于info级别的信息不会在终端上显示输出

通过logger.setLevel(Level.ALL);来控制输出的级别。
ALL则输出severe、warning以及info,OF不输出,如果设置WARNING,则只输出severe以及warning;同理可推其他设置;
在这里插入图片描述

方法中也有通过调用提供的供应商函数来构造消息,并将其转发到所有注册的输出处理程序对象。

// 严重信息
public void severe(Supplier<String> msgSupplier) {log(Level.SEVERE, msgSupplier);}

// 警告信息
public void warning(Supplier<String> msgSupplier) {log(Level.WARNING, msgSupplier);}

// info信息
 public void info(Supplier<String> msgSupplier) {log(Level.INFO, msgSupplier); }

// 设定配置信息
public void config(Supplier<String> msgSupplier) {log(Level.CONFIG, msgSupplier);}

// 级别小信息
public void fine(Supplier<String> msgSupplier) {log(Level.FINE, msgSupplier);}

// 级别更小信息
public void finer(Supplier<String> msgSupplier) {log(Level.FINER, msgSupplier);}

// 级别最小信息
public void finest(Supplier<String> msgSupplier) {log(Level.FINEST, msgSupplier);}
AI 代码解读

2. org.apache.logging.log4j

在xml文件中导入依赖包

<dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
       <version>2.14.1</version>
</dependency>

<dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-core</artifactId>
       <version>2.14.1</version>
</dependency>
AI 代码解读

示例代码如下:

package com.gaokaoli.logger;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;


public class test3 {
    public static void main(String []args){
        Logger logger = LogManager.getLogger("text3");
        logger.fatal("fatal错误");
        logger.error("error错误");
        logger.warn("warn警示");
        logger.info("info基本信息");
        logger.debug("debug调试");
        logger.trace("trace 信息");
    }
}
AI 代码解读

输出结果如下:
在这里插入图片描述

其方法大致都有如下:
在这里插入图片描述
具体使用什么方法可对应进行查看(此处省略)

2.1 xml配置文件

如果引入XML配置文件
和上面一样需要引入Jar包,Import类和代码

<?xml version="1.0" encoding="UTF-8"?>

<!--log4j2的一些配置信息输出-->
<!--status:输出自身内部信息,可以不设置。设置为trace,则输出各个详细输出-->
<!--monitorInterval:自动检测修改的配置文件,主要的信息是间隔秒数-->
<configuration status="DEBUG" monitorInterval="60">

    <Properties>
        <!-- 日志存放位置 -->
        <property name="basePath">logs</property>
        <!-- 也可设置为项目根路径或者绝对路径 -->
        <!-- <property name="Path">.</property>   -->

        <!-- 控制台默认输出格式-->
        <!-- "%-5level":日志级别,
             "%l"(字母小写L输出行号,但会影响日志性能):输出具体的错误位置-->
        <!-- %X{traceId} 自定义参数,
             %C:类名,
             %M:方法名,
             %l:行号,
             %m:错误信息,
             %n:换行 -->
        <property name="console_log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}][%thread] %-5level %l %m%n</property>
        
        <!-- 日志文件默认输出格式 -->
        <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}][%thread] %-5level %logger{1.} %m%n</property>

        <!-- 日志默认输出级别 -->
        <property name="output_log_level">INFO</property>

        <!-- 同一文件夹默认可存放日志数量,默认7个(可不设置这个,除非扩充) -->
        <property name="max_file">10</property>
        
        <!-- 多久生成新日志,结合filePattern使用 -->
        <!-- 为1,filePattern是 %d{yyyy-MM-dd},代表间隔一天生成一个文件
             为12,filePattern是%d{yyyy-MM-dd-HH},代表间隔12小时生成一个文件 -->
        <property name="timeInterval">1</property>
        
        <!-- true:保存时间以 0点开始结算-->
        <property name="timeModulate">true</property>

        <!-- 控制台显示最低级别 -->
        <property name="print_console_level">INFO</property>
    </Properties>


    <appenders>
        <!-- 输出到控制台-->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- level以上的才会输出,其他不会输出-->
            <ThresholdFilter level="${print_console_level}" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 输出格式,不设置默认为:%m%n -->
            <PatternLayout pattern="${log_pattern}"/>
        </Console>

        <!-- root 基础日志,框架,系统的日志 -->
        <RollingFile name="RootFile" fileName="${basePath}/root.log" filePattern="${basePath}/root-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="500MB"/>
            </Policies>
            <!-- 全部清理规则都在这里 -->
            <DefaultRolloverStrategy max="${max_file}">
                <Delete basePath="${basePath}" maxDepth="1">
                    <IfFileName glob="*.log.gz"/>
                    <IfLastModified age="6d"/>
                </Delete>
                <Delete basePath="${basePath}" maxDepth="1">
                    <IfFileName glob="gc*.log"/>
                    <IfLastModified age="6d"/>
                </Delete>
                <Delete basePath="${basePath}" maxDepth="1">
                    <IfFileName glob="dump*.hprof"/>
                    <IfLastModified age="6d"/>
                </Delete>
                <Delete basePath="${basePath}" maxDepth="1">
                    <IfFileName glob="hs_err*.log"/>
                    <IfLastModified age="6d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <!-- ERROR日志文件  -->
        <RollingFile name="ErrorFile" fileName="${basePath}/error.log" filePattern="${basePath}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="500MB"/>
            </Policies>
            <DefaultRolloverStrategy max="${max_file}" />
            <Filters>
                <ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>

        <!--  api 摘要日志文件 -->
        <RollingFile name="APIFile" fileName="${basePath}/api.log" filePattern="${basePath}/api-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="500MB"/>
            </Policies>
            <DefaultRolloverStrategy max="${max_file}" />
        </RollingFile>

        <!-- trace 切面日志文件 -->
        <RollingFile name="TraceFile" fileName="${basePath}/trace.log" filePattern="${basePath}/trace-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="500MB"/>
            </Policies>
            <DefaultRolloverStrategy max="${max_file}" />
        </RollingFile>

    </appenders>

    <!--定义AsyncLogger,只有定义了AsyncLogger并引入的appender,appender才会生效-->
    <loggers>

        <!-- 公共common包的日志 -->
        <AsyncLogger name="com.xx.common" additivity="false">
            <appender-ref ref="Console"/>
            <appender-ref ref="ErrorFile"/>
            <appender-ref ref="RootFile"/>
        </AsyncLogger>


        <!-- api摘要日志 -->
        <AsyncLogger name="apiLogger" additivity="false">
            <appender-ref ref="APIFile" />
            <appender-ref ref="Console" />
        </AsyncLogger>

        <!-- error 日志 -->
        <AsyncLogger name="errorLogger" additivity="false">
            <appender-ref ref="ErrorFile" />
            <appender-ref ref="Console" />
        </AsyncLogger>

        <!-- 设置demo业务包下的日志 -->
        <AsyncLogger name="com.xx" additivity="false">
            <appender-ref ref="Console"/>
            <appender-ref ref="ErrorFile"/>
            <appender-ref ref="RootFile"/>
        </AsyncLogger>
        
        <!--建立一个默认的root的AsyncLogger-->
        <AsyncRoot level="${output_log_level}">
            <appender-ref ref="Console"/>
            <appender-ref ref="RootFile"/>
            <appender-ref ref="ErrorFile"/>
        </AsyncRoot>

    </loggers>

</configuration>
AI 代码解读

3. org.slf4j.Logger

目前主流的日志框架,可以使用占位符进行参数占位

主要通过slf4j作为日志输出
在每个类的开头都加入如下:

在xml文件中引入依赖包

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.25</version>
    <scope>compile</scope>
</dependency>
AI 代码解读

如果不引入或者引入错误
会出现如下问题:出现SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.的解决方法

代码中通过引用通过

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
AI 代码解读

具体示例代码如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class text2 {
    public static final Logger logger = LoggerFactory.getLogger(text2.class);
    public static void main(String []args){
        logger.error("error错误");
        logger.warn("warn警示");
        logger.info("info基本信息");
        logger.debug("debug调试");
        logger.trace("trace信息");
    }
}
AI 代码解读

截图如下:
在这里插入图片描述

通过输出结果可看到
==LoggerFactory.getLogger输出的结果带有类的相对路径,便于开发==

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
349
分享
相关文章
|
1月前
|
Java 编译与解释并存使用方法的详细解析
本文介绍了Java编译与解释并存的使用方法及其组件封装技巧。首先讲解了如何通过`javac`编译源代码生成字节码,再由JVM解释执行,并利用JIT编译优化性能。接着详细说明了基于接口的组件设计、实现、注册和动态加载方法,以及通过JAR文件进行模块化封装和依赖注入支持。最后提供了一个完整的组件化应用示例,展示如何根据输入动态选择处理器。这种机制充分发挥了Java的跨平台特性与运行时性能优化能力,适合用于构建灵活、可扩展的应用系统。
28 1
Java SE 与 Java EE 组件封装使用方法及实践指南
本指南详细介绍了Java SE与Java EE的核心技术使用方法及组件封装策略。涵盖集合框架、文件操作、Servlet、JPA、EJB和RESTful API的使用示例,提供通用工具类与基础组件封装建议,如集合工具类、文件工具类、基础Servlet、实体基类和服务基类等。同时,通过分层架构集成示例展示Servlet、EJB和JPA的协同工作,并总结组件封装的最佳实践,包括单一职责原则、接口抽象、依赖注入、事务管理和异常处理等。适合希望提升代码可维护性和扩展性的开发者参考。
57 0
Java 面试资料中相关代码使用方法与组件封装方法解析
这是一份详尽的Java面试资料代码指南,涵盖使用方法与组件封装技巧。内容包括环境准备(JDK 8+、Maven/Gradle)、核心类示例(问题管理、学习进度跟踪)、Web应用部署(Spring Boot、前端框架)、单元测试及API封装。通过问题库管理、数据访问组件、学习进度服务和REST接口等模块化设计,帮助开发者高效组织与复用功能,同时支持扩展如用户认证、AI推荐等功能。适用于Java核心技术学习与面试备考,提升编程与设计能力。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
69 6
Java 面试资料中相关代码使用方法与组件封装方法解析
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
204 1
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
371 1
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
223 3
重学Java基础篇—ThreadLocal深度解析与最佳实践
ThreadLocal 是一种实现线程隔离的机制,为每个线程创建独立变量副本,适用于数据库连接管理、用户会话信息存储等场景。
141 5

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问