Log4j2-11-log4j2 Layout 布局入门介绍

Layout 布局

Appender使用Layout将LogEvent格式化为一种表单,以满足将要消费日志事件的任何需求。

在Log4j中。x和Logback布局被期望将事件转换为字符串。

在Log4j 2布局返回一个字节数组。这使得Layout的结果可以在更多类型的appender中使用。然而,这意味着您需要配置大多数布局与Charset,以确保字节数组包含正确的值。

使用Charset的布局的根类是org.apache.logging.log4j.core.layout。其中默认是UTF-8。每个扩展AbstractStringLayout的布局都可以提供自己的默认值。请参阅下面的每个布局。

Log4j 2.4.1为ISO-8859-1和US-ASCII字符集添加了一个自定义字符编码器,以便将Java 8内置的一些性能改进带到Log4j中,以便在Java 7上使用。对于只记录ISO-8859-1字符的应用程序,指定此字符集将显著提高性能。

CSV布局

该布局创建逗号分隔值(CSV)记录,并需要Apache Commons CSV。

CSV布局可以以两种方式使用:首先,使用CsvParameterLayout记录事件参数,以创建自定义数据库,通常记录到为此目的唯一配置的日志记录器和文件附加程序。其次,使用CsvLogEventLayout记录事件以创建数据库,作为使用完整的DBMS或使用支持CSV格式的JDBC驱动程序的替代方案。

CsvParameterLayout将事件的参数转换为CSV记录,忽略消息。

要记录CSV记录,您可以使用常用的Logger方法info(), debug()等:

logger.info("Ignored", value1, value2, value3);

得到 csv 格式:

value1, value2, value3

个人理解

csv 格式不太适合,因为日志中很多信息都会出现。

JSON布局

注意:JsonTemplate被认为已弃用。JsonTemplateLayout 提供了更多的功能,应该使用它。

附加一系列JSON事件作为序列化为字节的字符串。

完整格式良好的JSON vs.片段JSON

如果配置complete=“true”,则追加器输出格式良好的JSON文档。

默认情况下,使用complete=“false”,您应该将输出作为外部文件包含在单独的文件中,以形成格式良好的JSON文档。

如果complete=“false”,则appender不会在文档的开头、“]“和末尾写入JSON开放数组字符”[”,也不会在记录之间写入逗号","。

模式

日志事件遵循以下模式:

{
  "instant" : {
    "epochSecond" : 1493121664,
    "nanoOfSecond" : 118000000
  },
  "thread" : "main",
  "level" : "INFO",
  "loggerName" : "HelloWorld",
  "marker" : {
    "name" : "child",
    "parents" : [ {
      "name" : "parent",
      "parents" : [ {
        "name" : "grandparent"
      } ]
    } ]
  },
  "message" : "Hello, world!",
  "thrown" : {
    "commonElementCount" : 0,
    "message" : "error message",
    "name" : "java.lang.RuntimeException",
    "extendedStackTrace" : [ {
      "class" : "logtest.Main",
      "method" : "main",
      "file" : "Main.java",
      "line" : 29,
      "exact" : true,
      "location" : "classes/",
      "version" : "?"
    } ]
  },
  "contextStack" : [ "one", "two" ],
  "endOfBatch" : false,
  "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
  "contextMap" : {
    "bar" : "BAR",
    "foo" : "FOO"
  },
  "threadId" : 1,
  "threadPriority" : 5,
  "source" : {
    "class" : "logtest.Main",
    "method" : "main",
    "file" : "Main.java",
    "line" : 29
  }
}

个人理解

如果我们相对日志进行分析处理,那么输出 json 格式,其实还是很方便的。

不过 json 相对 pattern 而言,内容会多一些。

一般可以把固定的内容放在前面,从而直接截断解析即可。

模式布局 Pattern Layout

灵活的布局,可配置模式字符串。这个类的目标是格式化LogEvent并返回结果。结果的格式取决于转换模式。

转换模式与c语言中printf函数的转换模式密切相关。转换模式由字面文本和称为转换说明符的格式控制表达式组成。

注意,任何文本,包括特殊字符,都可以包含在转换模式中。特殊字符包括 \t、\n、\r、\f。使用 \\ 在输出中插入一个反斜杠。

每个转换说明符都以百分号(%)开头,后跟可选的格式修饰符和转换字符。转换字符指定数据的类型,例如类别、优先级、日期、线程名称。格式修饰符控制诸如字段宽度、填充、左右对齐等内容。下面是一个简单的例子。

让转换模式为 %-5p [%t]: %m%n,并假设Log4j环境被设置为使用PatternLayout。然后是语句

Logger logger = LogManager.getLogger("MyLogger");
logger.debug("Message 1");
logger.warn("Message 2");

可以得到:

DEBUG [main]: Message 1
WARN  [main]: Message 2

PatternLayout Parameters

Parameter NameTypeDescription
charsetString将syslog字符串转换为字节数组时使用的字符集。字符串必须是有效的字符集。如果未指定,此布局将使用平台默认字符集。
patternString由下表中的一个或多个转换模式组成的组合模式字符串。不能用模式选择器指定。
patternSelectorPatternSelector一个组件,用于分析LogEvent中的信息并确定应该使用哪种模式来格式化事件。pattern和patternSelector参数是互斥的。
replaceRegexReplacement允许替换部分结果字符串。如果已配置,则replace元素必须指定要匹配的正则表达式和替换。它执行一个类似于RegexReplacement转换器的功能,但是它应用于整个消息,而转换器仅应用于其模式生成的String。
alwaysWriteExceptionsboolean如果为真(默认情况下是这样),即使模式不包含异常转换,也总是写入异常。这意味着,如果您没有在模式中包含输出异常的方法,那么默认的异常格式化程序将被添加到模式的末尾。将其设置为false将禁用此行为,并允许您从模式输出中排除异常。
headerString要包含在每个日志文件顶部的可选头字符串。
footerString要包含在每个日志文件底部的可选页脚字符串。
disableAnsiboolean如果为true(默认为false),则不输出ANSI转义码。
noConsoleNoAnsiboolean如果为true(默认为false)且System.console()为null,则不输出ANSI转义码。

个人理解

这里可以指定自己的 replace 策略。

然后 RewriteAppender 也支持,我们可以有多种方式实现。

灵活性

@Plugin(
    name = "replace",
    category = "Core",
    printObject = true
)
public final class RegexReplacement {
    private static final Logger LOGGER = StatusLogger.getLogger();
    private final Pattern pattern;
    private final String substitution;

    private RegexReplacement(Pattern pattern, String substitution) {
        this.pattern = pattern;
        this.substitution = substitution;
    }

    public String format(String msg) {
        return this.pattern.matcher(msg).replaceAll(this.substitution);
    }

这里是直接把 regex 对应的信息转换为固定的 substitution。

如果我们想把手机号掩盖中间4位,感觉就不是很适合。

应该还是重写 RewritePolicy 比较灵活。

RFC5424布局

顾名思义,Rfc5424Layout按照RFC 5424(增强的Syslog规范)格式化LogEvents。

尽管该规范主要针对通过Syslog发送消息,但这种格式对于其他目的非常有用,因为项目在消息中作为自描述键/值对传递。

序列化的布局

SerializedLayout使用Java序列化简单地将LogEvent序列化为字节数组。SerializedLayout不接受任何参数。

此布局自2.9版起已弃用。Java序列化具有固有的安全性弱点,不再推荐使用这种布局。另一个包含相同信息的布局是JsonLayout,配置了properties=“true”。

Syslog布局

SyslogLayout将LogEvent格式化为与Log4j 1.2使用的相同格式匹配的BSD Syslog记录。

参考资料

https://logging.apache.org/log4j/2.x/manual/layouts.html

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.30号c++

浅拷贝和深拷贝(重点) 1> 每个类中系统都会提供一个默认的拷贝构造函数,如果程序员显性定义出拷贝构造函数,则系统取消默认提供。 2> 系统提供的拷贝构造函数,是将一个类对象的所有数据成员给另一个对象的所有…

###C语言程序设计-----C语言学习(8)## 斐波那契数列问题,素数问题,人数分配问题。

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 今天,我们主要分享三个问题如何用C语言去求解,1.斐波…

图片怎么裁剪成想要的尺寸?教你快速图片裁剪的方法

图片怎么裁剪成想要的尺寸?图片裁剪属于我们日常生活中比较常见的图片处理方式了,不管是改变图片打下,还是需要将图片中一些不需要的部分裁减掉,都需要用到这个功能,除了使用软件之外,我们还可以通过在线裁…

【Django自学】Django入门:如何使用django开发一个web项目(非常详细)

测试机器:windows11 x64 python版本:3.11 一、安装Django 安装步骤非常简单,使用pip安装就行 pip install django安装完成之后,python的 Scripts 文件夹下,会多一个 django-admin.exe (管理创建django项目的工具)。…

超声波风速风向传感器的优势及应用

TH-WQX2随着科技的不断发展,传感器技术日益成为众多领域中不可或缺的一部分。其中,超声波风速风向传感器凭借其独特的优势,在气象、能源、环保等领域中发挥着越来越重要的作用。 首先,超声波风速风向传感器无需机械转动部件&#…

【Vue】2-10、Vue 组件

一、组件化开发 组件化开发指的是根据封装的思想,把页面上可重用的 UI 结构封装为组件,从而方便项目的开发和维护。 二、Vue 组件的组成 template:组件的模板结构script:组件的 JavaScript 行为style:组件的样式 &…

Vim实战:使用 Vim实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

C++提取ICO图标(PE文件资源提取)

最近需要写一个提取EXE或者DLL图标资源的功能, 网上找了很久, 要么功能不好用, 最后结果如下: 1.很多是加载为HICON句柄后转换为图片保存, 全损画质..., 2.后来找了个还能用的, 详见 https://github.com/TortoiseGit/TortoiseGit/blob/master/src/Utils/IconExtractor.cpp …

git远程仓库基本操作

目录 gitremote (查看远程仓库) git remote add [仓库名] [url] git clone [url](克隆远程仓库到本地) git push [名][分支名](提交到远程仓库)​编辑 git pull [名][分支名]从远程仓库拉取​编辑 注意操作…

opencv学习 特征提取

内容来源于《opencv4应用开发入门、进阶与工程化实践》 图像金字塔 略 拉普拉斯金字塔 对输入图像进行reduce操作会生成不同分辨率的图像,对这些图像进行expand操作,然后使用reduce减去expand之后的结果,就会得到拉普拉斯金字塔图像。 …

Java 代理详解

Java 代理详解 文章目录 Java 代理详解1. 代理模式2. 静态代理3. 动态代理3.1. JDK 动态代理机制3.1.1. 介绍3.1.2. JDK 动态代理类使用步骤3.1.3. 代码示例 3.2. CGLIB 动态代理机制3.2.1. 介绍3.2.2. CGLIB 动态代理类使用步骤3.2.3. 代码示例 3.3. JDK 动态代理和 CGLIB 动态…

SD-WAN和专线混合组网:企业出海网络解决方案

目前,有很多国内企业涉足海外业务,如跨境电商、游戏、社交网络、区块链等。都会使用海外服务器。同时,这些企业在国内还有自己的机房,IDC或者使用国内其他云厂商的机房。如果他们想要相互通信或传输数据该怎么办?在成本…

最小步数模型

AcWing 1107. 魔板 #include <bits/stdc.h> using namespace std;char g[2][4]; const int N 10; unordered_map<string, pair<char, string> > pre; unordered_map<string, int> d;void Set(string s) {for(int i0; i<4; i) g[0][i] s[i];for(in…

骨传导如何使用,跟传统耳机有什么不同吗?

骨传导耳机的使用方法跟传统耳机是一样的&#xff0c;都是通过蓝牙连接来使用&#xff0c;不同的是&#xff0c;有些骨传导耳机自带内存&#xff0c;可以当做MP3来使用&#xff01; 此外&#xff0c;骨传导耳机的佩戴方式和传声方式跟传统耳机也有所不同&#xff0c;首先骨传导…

2024年美赛赛前复习大纲

CC数模-优质解答 引言 数学建模是一个将数学理论和方法应用于解决现实世界问题的过程。在数学建模比赛中&#xff0c;学生需要运用自己的数学知识和技能&#xff0c;解决给定的复杂问题。这不仅是一次展示自己能力的机会&#xff0c;也是一次学习和成长的过程。随着比赛的临近…

网络安全03---Nginx 解析漏洞复现

目录 一、准备环境 二、实验开始 2.1上传压缩包并解压 2.2进入目录&#xff0c;开始制作镜像 2.3可能会受之前环境影响&#xff0c;删除即可 ​编辑 2.4制作成功结果 2.5我们的环境一个nginx一个php 2.6访问漏洞 2.7漏洞触发结果 2.8上传代码不存在漏洞 2.9补充&#…

elementUI中表单校验的清空校验以及手动校验

this.$refs.表单.clearValidate(),这个可以传入字符串或者字符串数组&#xff0c;字符串对应的是我们自定义的rule里面的属性名&#xff0c;rule的属性名对应的是el-form-item的prop。这个api目前遇到的场景是el-radio切换时v-if展示不同的表单内容&#xff0c;但是当有校验提示…

力扣931. 下降路径最小和

动态规划 思路&#xff1a; 假设 dp[i][j] 为坐标 (i, j) 的路径最小和&#xff1b;则 dp[i][j] 上一状态&#xff1a; dp[i - 1][j] &#xff08;上一行正上方&#xff09;dp[i - 1][j - 1]&#xff08;上一行的左侧&#xff09;dp[i - 1][j 1]&#xff08;上一行的右侧&…

9.SELinux

目录 1. 概述 1.1. 概念 1.2. 作用&#xff1a; 1.3. SELinux与传统的权限区别 2. SELinux工作原理 2.1. 名词解释 2.1.1. 主体&#xff08;Subject&#xff09; 2.1.2. 目标&#xff08;Object&#xff09; 2.1.3. 策略&#xff08;Policy&#xff09; 2.1.4. 安全上…

纯静态微信小程序水果商城

首页代码 <view class"container"><!-- 轮播图 --><view class"swiper-container"><swiper class"screen-swiper" indicator-dots"true" circular"true" autoplay"true" interval"300…