log4j2 java api 入门介绍

概述

Log4j 2 API 提供了应用程序应该编码的接口,并提供了实现者创建日志实现所需的适配器组件。

虽然 Log4j 2 在 API 和实现之间被分解,但这样做的主要目的不是允许多个实现,尽管这当然是可能的,而是明确定义在“正常”应用程序代码中可以安全使用哪些类和方法 .

你好世界!

如果没有惯用的 Hello, World 示例,任何介绍都是不完整的。

这是我们的。

首先,从 LogManager 中获取名为“HelloWorld”的 Logger。

接下来,记录器用于编写“Hello, World!” 消息,但是只有当 Logger 配置为允许信息性消息时才会写入消息

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class HelloWorld {private static final Logger logger = LogManager.getLogger("HelloWorld");public static void main(String[] args) {logger.info("Hello, World!");}
}

根据使用的配置,调用 logger.info() 的输出会有很大差异。 有关详细信息,请参阅配置部分。

替换参数

通常,日志记录的目的是提供有关系统中正在发生的事情的信息,这需要包括有关正在操作的对象的信息。

在 Log4j 1.x 中,这可以通过执行以下操作来完成:

if (logger.isDebugEnabled()) {logger.debug("Logging in user " + user.getName() + " with birthday " + user.getBirthdayCalendar());
}

重复这样做会使代码感觉更多的是关于日志记录而不是手头的实际任务。

此外,它会导致日志记录级别被检查两次; 一次调用 isDebugEnabled,一次调用调试方法。 更好的选择是:

logger.debug("Logging in user {} with birthday {}", user.getName(), user.getBirthdayCalendar());

使用上面的代码,日志记录级别只会被检查一次,并且字符串构造只会在启用调试日志记录时发生。

格式化参数

如果 toString() 不是您想要的,Formatter Loggers 会将格式留给您。

为了便于格式化,您可以使用与 Java 的 Formatter 相同的格式字符串。 例如:

public static Logger logger = LogManager.getFormatterLogger("Foo");logger.debug("Logging in user %s with birthday %s", user.getName(), user.getBirthdayCalendar());
logger.debug("Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());
logger.debug("Integer.MAX_VALUE = %,d", Integer.MAX_VALUE);
logger.debug("Long.MAX_VALUE = %,d", Long.MAX_VALUE);

要使用格式化程序记录器,您必须调用 LogManager getFormatterLogger 方法之一。

此示例的输出显示 Calendar toString() 与自定义格式相比过于冗长:

2012-12-12 11:56:19,633 [main] DEBUG: User John Smith with birthday java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=1995,MONTH=4,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=23,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
2012-12-12 11:56:19,643 [main] DEBUG: User John Smith with birthday 05 23, 1995
2012-12-12 11:56:19,643 [main] DEBUG: Integer.MAX_VALUE = 2,147,483,647
2012-12-12 11:56:19,643 [main] DEBUG: Long.MAX_VALUE = 9,223,372,036,854,775,807

混合记录器与格式化记录器

格式化程序记录器对输出格式进行细粒度控制,但缺点是必须指定正确的类型(例如,为 %d 格式参数传递除十进制整数以外的任何内容都会引发异常)。

如果你的主要用途是使用{}风格的参数,但偶尔需要对输出格式进行细粒度的控制,你可以使用printf方法:

public static Logger logger = LogManager.getLogger("Foo");logger.debug("Opening connection to {}...", someDataSource);
logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());

Java 8 lambda 支持延迟日志记录

在 2.4 版中,Logger 接口添加了对 lambda 表达式的支持。

这允许客户端代码延迟记录消息,而无需明确检查是否启用了请求的日志级别。

例如,以前你会写:

// pre-Java 8 style optimization: explicitly check the log level
// to make sure the expensiveOperation() method is only called if necessary
if (logger.isTraceEnabled()) {logger.trace("Some long-running operation returned {}", expensiveOperation());
}

在 Java 8 中,您可以使用 lambda 表达式实现相同的效果。

您不再需要显式检查日志级别:

// Java-8 style optimization: no need to explicitly check the log level:
// the lambda expression is not evaluated if the TRACE level is not enabled
logger.trace("Some long-running operation returned {}", () -> expensiveOperation());

记录器名称

大多数日志记录实现使用分层方案来匹配记录器名称和日志记录配置。

在此方案中,记录器名称层次结构由“.”表示。

记录器名称中的字符,其方式与用于 Java 包名称的层次结构非常相似。

例如,org.apache.logging.appender 和 org.apache.logging.filter 都有 org.apache.logging 作为它们的父级。

在大多数情况下,应用程序通过将当前类的名称传递给 LogManager.getLogger(…) 来命名它们的记录器。

因为这种用法很常见,所以当记录器名称参数被省略或为 null 时,Log4j 2 将其作为默认值提供。

例如,在下面的所有示例中,Logger 的名称都是“org.apache.test.MyTest”。

package org.apache.test;public class MyTest {private static final Logger logger = LogManager.getLogger(MyTest.class);
}

or

package org.apache.test;public class MyTest {private static final Logger logger = LogManager.getLogger(MyTest.class.getName());
}

or

package org.apache.test;public class MyTest {private static final Logger logger = LogManager.getLogger();
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何高效地利用淘宝API接口获取商品数据

在电商领域,能够快速且准确地获取商品数据是至关重要的。淘宝作为中国领先的电商平台,通过其开放的API接口为商家们提供了强大的数据服务功能。本文将验证如何高效地利用淘宝API接口获取商品数据,并提供一套行之有效的策略和步骤。 预备工作…

应急响应-内存分析

在应急响应过程中,除了上述几个通用的排查项,有时也需要对应响应服务器进行内存的提权,从而分析其中的隐藏进程。 内存的获取 内存的获取方法有如下几种: 基于用户模式程序的内存获取;基于内核模式程序的内存获取&a…

常用MQ产品的对比

常用MQ产品的对比 本文整理了常用MQ之间的对比,旨在帮助大家在实际项目中选择MQ产品。 消息队列对比参照表 注: 对照表来自:消息队列对比参照表 ,对比维度比较全面,结果个人比较认同,强烈建议参考。 Rock…

备份数据提示Allowed memory size of 134217728 bytes exhausted的修复方法

今日给一老数据库备份,发现无法备份(有近60万条数据),查看日志,提示报错:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 189263328 bytes) in 解析:…

go语言基础之time时间处理

1.时间类型 Go 语言中使用time.Time类型表示时间。我们可以通过time.Now函数获取当前的时间对象,然后从时间对象中可以获取到年、月、日、时、分、秒等信息。 // timeDemo 时间对象的年月日时分秒 func timeDemo() {now : time.Now() // 获取当前时间fmt.Printf(&…

VitisHLS中读写任意深度的图像文件

一、8bits灰度图像的读写 这里可以使用opencv的库函数&#xff0c;也可以使用赛灵思提供的库函数。实际上&#xff0c;赛灵思的 vision库也是调用opencv的imread和imwrite库函数的&#xff0c;只不过封装了一下而已。 #include <iostream> #include <stdio.h> #in…

python3-cookbook-字典的运算

第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典。大多数情况下使用这些数据结构是很简单的。但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题。 因此,这一章的目的就是讨论这些比较常见的问题和算法。 另外,我们也会…

R语言【taxlist】——clean_strings():清理字符串

Package taxlist version 0.2.4 Description 多个前导的和后随的空格以及错误的编码可能会在处理分类学名称的信息中导致严重的问题。clean_strings() 方法可以清除这些错误。 Usage clean_strings(x, ...)## S4 method for signature character clean_strings(x, from &quo…

Vue的状态管理Vuex

文章目录 一、介绍二、install三、store1、介绍2、创建并全局引入3、单一状态树4、多模块状态树(无命名空间)5、多模块状态树(有命名空间)一、介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库当我们的应用遇到多个组件共享状态(共享状态:多个组件维护1个变…

Docker安装RcoketMQ

1、Docker安装RcoketMQ-4.9.4 在同级文件夹创建目录config&#xff0c;并在里面创建文件broker.conf&#xff0c;文件内容如下&#xff1a; brokerClusterNameDefaultCluster brokerNamebroker-a brokerId0 deleteWhen04 fileReservedTime48 brokerRoleASYNC_MASTER flushDis…

linux系统ansible主机清单和命令

ansible主机清单和命令 主机清单配置主机清单文件配置主机清单方式常用变量 ansible命令ansible-doc命令ansible命令格式ansible配置公私钥ansible 命令集 主机清单 配置主机清单文件 /etc/ansible/hosts //配置主机清单文件配置主机清单方式 ip地址 ansible_ssh_user…

Python网络爬虫实战——实验5:Python爬虫之selenium动态数据采集实战

【实验内容】 本实验主要介绍和使用selenium库在js动态加载网页中数据采集的作用。 【实验目的】 1、理解动态加载网页的概念 2、学习Selenium库基本使用 3、掌握动态加载数据采集流程 【实验步骤】 步骤1理解动态加载网页 步骤2学习使用Selenium库 步骤3 采集河北政府采购…

Python初学者学习记录——python基础综合案例:数据可视化——地图可视化

一、基础地图使用 1、基础地图演示 2、基础地图演示——视觉映射器 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 99),("上海市", 199),("湖南省", 2…

1 月 28日算法练习-前缀和

小郑的蓝桥平衡串 思路&#xff1a;把 L 看成 1&#xff0c;Q 看成 -1&#xff0c;利用前缀和来得到输入串的前缀子串中LQ 的和&#xff0c;利用前缀和差的性质得到子串&#xff0c;通过枚举看它是否平衡。 将L看做1&#xff0c;Q看做&#xff0d;1&#xff0c;只有当某个区间…

如何快速上手一个vue框架

安装nvm 下载nvm-setup.zip&#xff1a; https://github.com/coreybutler/nvm-windows/releases 解压安装nvm&#xff1a; 创建两个文件夹&#xff0c;一个是nvm的安装位置&#xff0c;另一个是node.js的下载位置。不需要配置环境变量和修改setting文件了 检查nvm是否安装成功…

不常见知识点汇总

目录 1.关于输入流&#xff08;cin&#xff09;1.1 cin.fail()1.2 cin.clear()1.3 cin.ignore() 随时补充&#xff01;&#xff01;&#xff01; 1.关于输入流&#xff08;cin&#xff09; 问题描述&#xff1a; int input 0; cin >> input; while (cin.fail()) {cin.…

Linux 增加 SWAP 空间

一、需求 通过阿里云启动项目时&#xff0c;使用Vuepress build编译静态页面时内存需要800MB&#xff0c;导致内存不够&#xff0c;因此考虑使用swap方式&#xff0c;置换一些内存资源存放swap磁盘。 [rootxxx myblog]# npm run docs:dev> myblog1.0.0 docs:dev > vuep…

全角色服务、全场景支撑、全业务应用的新一代智慧教室

新一代智慧教室以“数智化助力高质量人才培养”为核心目标&#xff0c;以AI赋能的智能硬件为基础构建多形态智慧教学环境&#xff0c;以中台为支撑实现数据、设备、系统、业务的互联互通、开放共享&#xff0c;以平台全面覆盖教学应用&#xff0c;采集、汇聚、挖掘、分析课前课…

【解决】IntelliJ IDEA 重命名 Shift + F6 失效

IntelliJ IDEA 重命名 Shift F6 失效 问题解决 问题 Idea 重命名 Shift F6 &#xff0c;一直没反应 解决 调查发现原因是微软新版的输入法冲突了。需要设置【使用以前版本的微软拼音输入法】解决兼容性。 设置 -> 时间和语言 -> 区域 -> 语言选项 -> 键盘选项…

公众号迁移公证书模板在哪里下载?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;公众号迁移的作用可不止变更主体这一个哦&#xff0c;它还可以把个人公众号变成企业公众号&#xff0c;或者把服务号变成订阅号&#xff0c;甚至还能开通留言功能。不过要注意&#xff0c;现在订阅号已经不能变成服…