当前位置: 首页 > news >正文

简单的springboot log4j2日志配置

简单的springboot log4j2日志配置

在这里插入图片描述

1.简介

Log4j2 是 Apache Software Foundation 开发的一个日志记录工具,它是 Log4j 的后续版本,并且在多个方面进行了改进。以下是 Log4j2 的一些关键特性:

  • 性能提升:Log4j2 在设计上做了很多优化来提高日志记录的效率。例如,它使用了更高效的查找表来减少日志记录时的开销。

  • 可靠性增强:Log4j2 支持异步日志记录,这有助于提高应用程序的整体性能。异步处理可以避免日志记录阻塞应用程序线程。

  • 灵活性增加:Log4j2 提供了一个可插拔的架构,允许用户根据需要选择不同的布局、appender 和其他组件。这种模块化的设计使得配置更加灵活。

  • 简化配置:Log4j2 使用 XML、JSON 或 YAML 文件进行配置,相较于 Log4j 的 XML 配置,提供了更多的灵活性和易用性。
    丰富的功能集:Log4j2 包含了许多高级功能,如支持多种日志级别、过滤器、布局以及多种输出目的地(比如文件、控制台、数据库等)。

  • 安全性改进:鉴于之前在 Log4j 中发现的安全问题,Log4j2 在设计时考虑到了安全性,尤其是在处理外部输入数据时更为谨慎。

Log4j2 是一个广泛使用的日志框架,在 Java 应用程序中非常受欢迎。然而,值得注意的是,Log4j2 也曾经历过一些严重的安全漏洞,比如著名的 Log4Shell 漏洞(CVE-2021-44228),这是一个远程代码执行漏洞,影响了大量的系统和服务。因此,在使用 Log4j2 时,确保使用最新版本并及时应用安全更新是非常重要的。

在 Java 日志领域还有其他的日志框架,Log4j2、Log4j、Logback 和 SLF4J 这几个框架扮演着不同的角色,相互之间还有些许关联,此处整理一下它们之间的关系如下:

  • Log4j
    Log4j 是 Apache 软件基金会开发的第一个日志框架,它为 Java 应用程序提供了强大的日志功能。由于其稳定性和广泛的使用,Log4j 成为了早期 Java 应用的标准日志解决方案之一。
  • Log4j2
    Log4j2 是 Log4j 的继任者,它在 Log4j 的基础上进行了大量的改进,包括性能优化、新的配置方式(XML、JSON 或 YAML)、异步日志处理等功能。虽然两者名称相似,但是 Log4j2 并不向后兼容 Log4j。
  • Logback
    Logback 是 Log4j 的另一个替代品,由 Log4j 的原始作者 Ceki Gülcü 创建。它旨在作为 Log4j 的一个改进版本,并且与 Log4j 具有较高的兼容性。Logback 同样支持异步日志记录,并且具有更好的性能。
  • SLF4J (Simple Logging Facade for Java)
    SLF4J 不是一个实际的日志实现,而是一个抽象层或门面(Facade)。它的目的是提供一个简单的 API,以便于开发者编写日志代码,同时允许在运行时动态地绑定到不同的日志框架(如 Logback、Log4j、java.util.logging 等)。这样可以在不影响应用代码的情况下更换底层的日志实现。

这些日志框架之间的关系可以总结为:

  • SLF4J 是一个日志门面,它提供了一套统一的日志 API。
  • Logback 默认实现了 SLF4J 接口,可以直接与 SLF4J 一起工作。
  • Log4j 和 Log4j2 可以通过适配器(如 slf4j-log4j12 或 log4j-slf4j-impl)与 SLF4J 一起使用。
  • Log4j 和 Log4j2 是独立的日志框架,直接提供日志功能,不需要通过 SLF4J。

在实际应用中,通常会选择一个具体的日志框架(如 Logback 或 Log4j2),并通过 SLF4J 来编写日志代码,以提高代码的可移植性和灵活性。我们项目使用的是log4j2日志框架进行配置,下面主要对log4j2日志框架配置进行梳理方便日后复习使用。

2. 具体使用配置

我们整体的使用需要先引入pom文件,将服务ip信息存入到系统变量中,供log4j2配置文件使用, 再进行log4j2配置文件配置,最后在代码中可以使用slf4j日志门脸进行日志调用,添加日志后通过elk 我们可以快速定为到线上的问题,哪个服务在哪个机器上,具体发生了哪些问题,提高生产问题排错效率,具体配置日志格式如下:

  • [%d{yyyy-MM-dd’T’HH:mm:ss.SSSZZ}] 日期 美国时间
  • [%level{length=5}] 日志级别
  • [%traceId] 链路追踪id,skyWalking使用
  • [%logger] 记录日志的类或包的全限定名。这有助于在日志输出中明确标识日志来源
  • [${sys:hostName}] 自定义主机名称,System.setProperty(“hostName”, NetUtil.getLocalHostName());
  • [${sys:ip}] 自定义系统ip信息 ,System.setProperty(“ip”, NetUtil.getLocalIp());
  • [${sys:applicationName}] 应用名称
  • [%F,%L,%C,%M] / [当前执行类, 行号, 全类名, 方法名称]
  • [%m] 日志输出内容
  • ##自己特殊约定
  • '%ex'%n 两个引号将异常包裹,打出异常时候方便解析 如何抛异常 和 换行

log4j2有8个级别 从低到高为 ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF,我们作为web服务器,主要配置level为 INFO 级别

等级描述
ALL最低等级,用于打印所有日志记录信息
TRACE追踪程序运行到哪里
DEBUG消息颗粒度强调调试层面日志信息,展示详细执行信息
INFO消息颗粒度突出强调应用正常的执行逻辑日志信息
WARN输出警告
ERROR输出错误日志信息
FATAL输出每个严重错误时间,会导致应用程序退出日志
OFF最高等级,关闭所有日志记录

常用的文件追加器 appenders 信息如下

Appenders名称具体作用
FlumeAppender将几个不同源的日志汇集、集中到一处
RewriteAppender对日志事件进行掩码或注入信息
RollingFileAppender对日志文件进行封存
RoutingAppender在输出地之间进行筛选路由
SMTPAppender将LogEvent发送到指定邮件列表
SocketAppender将LogEvent以普通格式发送到远程主机
SyslogAppender将LogEvent以RFC 5424格式发送到远程主机
AsynchAppender将一个LogEvent异步地写入多个不同输出地
ConsoleAppender将LogEvent输出到控制台
FailoverAppender维护一个队列,系统将尝试向队列中的Appender依次输出LogEvent,直到有一个成功为止

PatternLayout 是最重要也是最常用的控制输出内容的节点,包括类名、时间、行号、日志级别、序号等都可以控制,同时还可以指定日志格式,可以使用正则表达式处理输出结果。

PatternLayout中包含的特殊字符包括\t,\n,\r,\f,用\输出单斜线,用%%输出%,下面是PatternLayout的参数

参数名称类型描述
charsetString输出的字符集。如果没有指定,则使用系统默认的字符集输出
patternString详见后面的pattern的表格
replaceRegexReplacement替换部分输出中的String。这将会调用一个与RegexReplacement转换器相同的函数,不同的是这是针对整个消息的
alwaysWriteExceptionsboolean默认为true。总是输出异常,即使没有定义异常对应的pattern,也会被附在所有pattern的最后。设为false则不会输出异常
headerString可选项。包含在每个日志文件的顶部
footerString可选项。包含在每个日志文件的尾部
noConsoleNoAnsiboolean默认为false。如果为true,且System.console()是null,则不会输出ANSI转义码

下面RegexReplacement参数

Appenders名称具体作用
FlumeAppender将几个不同源的日志汇集、集中到一处

2.1 pom配置

在spring boot项目中,默认使用的日志框架是Logback,所以我们需要排除掉其自身引用的日志框架再引入log4j2日志jar包。引入pom内容如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.3.4</version>
</dependency>

2.2 ip信息初始化到系统变量中

通过代码获取ip信息,具体工具类NetUtil实现如下

package cn.git.elk.util;import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketAddress;
import java.net.SocketChannel;
import java.net.UnknownHostException;
import java.nio.channels.SocketChannel;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @program: bank-credit-sy* @description: $NetUtil 获取ip地址hostname工具类* @author: lixuchun* @create: 2021-02-04 14:52*/
public class NetUtil {   // 正则表达式模式,用于匹配 IP 地址private static Pattern pattern;// IP 地址分隔符限制长度private static Integer BLOCKS_LIMIT_LENGTH_2 = 2;// 默认主机名private static String HOST = "0.0.0.0";/*** 格式化输入的地址字符串,确保其包含主机名和端口号,并默认设置端口为 80。* @param address 地址字符串* @return 格式化后的地址字符串*/public static String normalizeAddress(String address){// 将地址字符串按冒号分割成数组String[] blocks = address.split(":");// 检查地址是否有效if(blocks.length > BLOCKS_LIMIT_LENGTH_2){throw new IllegalArgumentException(address + " is invalid");}// 获取主机名String host = blocks[0];// 默认端口号为 80int port = 80;// 如果地址包含端口号,则提取端口号if(blocks.length > 1){port = Integer.valueOf(blocks[1]);} else {// 使用默认端口 80address += ":" + port;} // 格式化并返回地址String serverAddr = String.format("%s:%d", host, port);return serverAddr;}/*** 如果输入地址中的主机名为“0.0.0.0”,则用本地 IP 地址替换后返回格式化的地址。* @param address 地址字符串* @return 格式化后的地址字符串*/public static String getLocalAddress(String address){// 将地址字符串按冒号分割成数组String[] blocks = address.split(":");// 检查地址是否有效if(blocks.length != BLOCKS_LIMIT_LENGTH_2){throw new IllegalArgumentException(address + " is invalid address");} // 获取主机名String host = blocks[0];// 获取端口号int port = Integer.valueOf(blocks[1]);// 如果主机名为“0.0.0.0”,则替换为本地 IP 地址if(HOST.equals(host)){return String.format("%s:%d", NetUtil.getLocalIp(), port);}// 否则直接返回原地址return address;}/*** 检查给定的 IP 是否匹配优先级列表中的前缀,并返回匹配的索引。* @param ip IP 地址* @param prefix 优先级列表* @return 匹配的索引*/private static int matchedIndex(String ip, String[] prefix){// 遍历优先级列表for(int i=0; i<prefix.length; i++){String p = prefix[i];// 如果前缀为“*”,则检查 IP 是否为内网地址if("*".equals(p)){if(ip.startsWith("127.") ||ip.startsWith("10.") ||	ip.startsWith("172.") ||ip.startsWith("192.")){continue;}return i;} else {// 检查 IP 是否以指定前缀开头if(ip.startsWith(p)){return i;}} }// 如果没有匹配,则返回 -1return -1;}/*** 获取本地 IP 地址,根据优先级选择最优 IP 地址;如果没有指定优先级,则使用默认优先级顺序。* @param ipPreference IP 优先级字符串* @return 本地 IP 地址*/public static String getLocalIp(String ipPreference) {// 如果未指定优先级,则使用默认优先级if(ipPreference == null){ipPreference = "*>10>172>192>127";}// 分割优先级字符串String[] prefix = ipPreference.split("[> ]+");try {// 编译正则表达式模式pattern = Pattern.compile(PATTEN_COMPARE_RULES);// 获取所有网络接口Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();// 初始化最佳匹配 IP 和索引String matchedIp = null;int matchedIdx = -1;// 遍历所有网络接口while (interfaces.hasMoreElements()) {NetworkInterface ni = interfaces.nextElement();// 获取每个网络接口的所有 IP 地址Enumeration<InetAddress> en = ni.getInetAddresses(); // 遍历所有 IP 地址while (en.hasMoreElements()) {InetAddress addr = en.nextElement();String ip = addr.getHostAddress();  // 匹配 IP 地址Matcher matcher = pattern.matcher(ip);if (matcher.matches()) {  // 获取匹配的索引int idx = matchedIndex(ip, prefix);if(idx == -1) {continue;}// 更新最佳匹配 IP 和索引if(matchedIdx == -1){matchedIdx = idx;matchedIp = ip;} else {if(matchedIdx > idx){matchedIdx = idx;matchedIp = ip;}}} } } // 如果找到最佳匹配 IP,则返回;否则返回“127.0.0.1”if(matchedIp != null) {return matchedIp;}return "127.0.0.1";} catch (Exception e) { return "127.0.0.1";}}/*** 获取本地 IP 地址,默认使用优先级顺序。* @return 本地 IP 地址*/public static String getLocalIp() {return getLocalIp("*>10>172>192>127");}/*** 返回给定 SocketChannel 对象的远程地址信息。* @param channel SocketChannel 对象* @return 远程地址信息*/public static String remoteAddress(SocketChannel channel){// 获取远程地址SocketAddress addr = channel.socket().getRemoteSocketAddress();// 格式化并返回地址信息String res = String.format("%s", addr);return res;}/*** 返回给定 SocketChannel 对象的本地地址信息,去掉可能存在的冒号前缀。* @param channel SocketChannel 对象* @return 本地地址信息*/public static String localAddress(SocketChannel channel){// 获取本地地址SocketAddress addr = channel.socket().getLocalSocketAddress();// 格式化并返回地址信息String res = String.format("%s", addr);// 如果地址不为空,则去掉第一个字符(通常是“/”)return addr == null ? res : res.substring(1);}/*** 获取当前 Java 进程 ID。* @return 进程 ID*/public static String getPid(){// 获取运行时管理对象RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();// 获取名称String name = runtime.getName();// 查找“@”符号的位置int index = name.indexOf("@");if (index != -1) {// 提取进程 IDreturn name.substring(0, index);}// 如果未找到,则返回 nullreturn null;}/*** 获取本地主机名。* @return 本地主机名*/public static String getLocalHostName() {try {// 获取本地 IP 地址并提取主机名return (InetAddress.getLocalHost()).getHostName();} catch (UnknownHostException uhe) {// 处理异常情况String host = uhe.getMessage();if (host != null) {int colon = host.indexOf(':');if (colon > 0) {// 提取主机名部分return host.substring(0, colon);}}// 如果无法获取主机名,则返回“UnknownHost”return "UnknownHost";}}
}

初始化ip信息到系统变量中代码部分如下

package cn.git.init;import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;/** * @description: 初始化设置ip hostname等信息通用类* @program: bank-credit-sy* @author: lixuchun* @create: 2024-01-03*/
@Component
public class InitLogIpHost implements EnvironmentAware {private static Environment environment;@PostConstructpublic void initIpHostEnvInfo() {// 设置 applicationNameSystem.setProperty("applicationName", environment.getProperty("spring.application.name"));// 设置 ipSystem.setProperty("ip", NetUtil.getLocalIp());// 设置 hostnameSystem.setProperty("hostName", NetUtil.getLocalHostName());}/*** Set the {@code Environment} that this component runs in.** @param environment*/@Overridepublic void setEnvironment(Environment environment) {InitLogIpHost.environment = environment;}
}

2.3 log4j2.xml日志文件配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration schema="Log4J-V2.0.xsd" monitorInterval="600"><!-- 配置全局属性 --><Properties><!-- 日志文件保存的基本路径 --><Property name="LOG_HOME">logs</Property><!-- 日志文件的基础名称 --><property name="FILE_NAME">docker-server</property><!-- 日志输出格式 --><property name="patternLayout">[%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ}] [%level{length=5}] [%traceId] [%logger] [${sys:hostName}] [${sys:ip}] [${sys:applicationName}] [%F,%L,%C,%M] [%m] ## '%ex'%n</property></Properties><!-- 定义不同的日志输出目的地 --><Appenders><!-- 控制台输出 --><Console name="CONSOLE" target="SYSTEM_OUT"><!-- 使用定义的日志格式 --><PatternLayout pattern="${patternLayout}"/><!-- 只允许 info 级别及以上的日志输出到控制台 --><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/></Console><!-- 应用程序日志滚动文件 --><RollingRandomAccessFile name="appAppender" fileName="${LOG_HOME}/app-${FILE_NAME}.log" filePattern="${LOG_HOME}/app-${FILE_NAME}-%d{yyyy-MM-dd}-%i.log" ><!-- 使用定义的日志格式 --><PatternLayout pattern="${patternLayout}" /><!-- 滚动策略 --><Policies><!--根据当前filePattern配置"%d{yyyy-MM-dd}",每interval天滚动一次"%d{yyyy-MM-dd HH-mm}" 则为每interval分钟滚动一次--><TimeBasedTriggeringPolicy interval="1"/><!-- 文件大小超过 500MB 时滚动 --><SizeBasedTriggeringPolicy size="500MB"/></Policies><!-- DefaultRolloverStrategy 属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖 --><DefaultRolloverStrategy max="20"/></RollingRandomAccessFile><!-- Druid SQL 日志滚动文件 --><RollingRandomAccessFile name="druidSqlRollingFile" fileName="${LOG_HOME}/druid/app-${FILE_NAME}-druid.log" filePattern="${LOG_HOME}/app-${FILE_NAME}-druid-%d{yyyy-MM-dd}-%i.log" ><!-- 使用定义的日志格式 --><PatternLayout pattern="${patternLayout}" /><!-- 滚动策略 --><Policies><!-- 每天滚动一次 --><TimeBasedTriggeringPolicy interval="1"/><!-- 文件大小超过 500MB 时滚动 --><SizeBasedTriggeringPolicy size="500MB"/></Policies><!-- 最多保留 20 个旧日志文件 --><DefaultRolloverStrategy max="20"/></RollingRandomAccessFile><!-- skywalking GRPC 日志客户端 Appender --><GRPCLogClientAppender name="grpc-log"><!-- 使用简单的日志格式 --><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></GRPCLogClientAppender></Appenders><!-- 定义不同日志记录器 --><Loggers><!-- 关闭 org.apache.kafka 包下的所有日志输出 --><logger name="org.apache.kafka" level="off"/><!-- 设置 druid 包的日志级别为 error,并关闭继承父 Logger 的行为 --><logger name="druid" level="error" additivity="false"><appender-ref ref="druidSqlRollingFile"/></logger><!-- 设置 cn.git.* 包的日志级别为 info,并关闭继承父 Logger 的行为 --><logger name="cn.git.*" level="info" additivity="false"><AppenderRef ref="grpc-log"/></logger><!-- 创建一个异步 Logger,用于处理 cn.git.* 包的日志,并指定日志输出到 appAppender --><AsyncLogger name="cn.git.*" level="info" includeLocation="true"><AppenderRef ref="appAppender"/></AsyncLogger><!-- 设置根 Logger 的日志级别为 info,并指定日志输出到控制台、appAppender 和 grpc-log --><root level="info"><AppenderRef ref="CONSOLE"/><Appender-Ref ref="appAppender"/><AppenderRef ref="grpc-log"/></root></Loggers>
</Configuration>

3. 测试

我们启动服务,然后在定时任务中打印一个简单的日志信息,并且运行时候可能会报错,task代码如下

package cn.git.task;import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/** * @description: 简单定时任务* @program: bank-credit-sy* @author: lixuchun* @create: 2024-07-10*/
@Slf4j
@Component
@EnableScheduling
public class TimerTask {/*** 每5秒执行一次*/@Scheduled(cron = "0/5 * * * * ?")public void timer() {log.info("定时任务执行 : " + System.currentTimeMillis());if (System.currentTimeMillis() % 2 == 0) {throw new RuntimeException("异常啦!");}}
}

我们观察运行结果日志信息如下

"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:61667,suspend=y,server=n -Dvisualvm.id=6066284867800 -javaagent:C:\Users\Administrator.DESKTOP-40G9I84\AppData\Local\JetBrains\IdeaIC2020.3\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\idea_workspace_activiti_change\docker-hello\target\classes;D:\apache-maven-3.6.3\repos\org\projectlombok\lombok\1.18.6\lombok-1.18.6.jar;D:\apache-maven-3.6.3\repos\cn\hutool\hutool-all\5.5.7\hutool-all-5.5.7.jar;D:\apache-maven-3.6.3\repos\com\alibaba\fastjson\1.2.83\fastjson-1.2.83.jar;D:\apache-maven-3.6.3\repos\org\springframework\boot\spring-boot-starter-web\2.3.8.RELEASE\spring-boot-starter-web-2.3.8.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\boot\spring-boot-starter\2.3.8.RELEASE\spring-boot-starter-2.3.8.RELEASE.jar;D:\apache-maven-3.6.3\repos\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\apache-maven-3.6.3\repos\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;D:\apache-maven-3.6.3\repos\org\springframework\boot\spring-boot-starter-json\2.3.8.RELEASE\spring-boot-starter-json-2.3.8.RELEASE.jar;D:\apache-maven-3.6.3\repos\com\fasterxml\jackson\core\jackson-databind\2.11.4\jackson-databind-2.11.4.jar;D:\apache-maven-3.6.3\repos\com\fasterxml\jackson\core\jackson-annotations\2.11.4\jackson-annotations-2.11.4.jar;D:\apache-maven-3.6.3\repos\com\fasterxml\jackson\core\jackson-core\2.11.4\jackson-core-2.11.4.jar;D:\apache-maven-3.6.3\repos\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.4\jackson-datatype-jdk8-2.11.4.jar;D:\apache-maven-3.6.3\repos\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.4\jackson-datatype-jsr310-2.11.4.jar;D:\apache-maven-3.6.3\repos\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.4\jackson-module-parameter-names-2.11.4.jar;D:\apache-maven-3.6.3\repos\org\springframework\boot\spring-boot-starter-tomcat\2.3.8.RELEASE\spring-boot-starter-tomcat-2.3.8.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;D:\apache-maven-3.6.3\repos\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;D:\apache-maven-3.6.3\repos\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;D:\apache-maven-3.6.3\repos\org\springframework\spring-web\5.2.12.RELEASE\spring-web-5.2.12.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\spring-beans\5.2.12.RELEASE\spring-beans-5.2.12.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\spring-webmvc\5.2.12.RELEASE\spring-webmvc-5.2.12.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\spring-aop\5.2.12.RELEASE\spring-aop-5.2.12.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\spring-context\5.2.12.RELEASE\spring-context-5.2.12.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\spring-expression\5.2.12.RELEASE\spring-expression-5.2.12.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\boot\spring-boot-starter-log4j2\2.3.8.RELEASE\spring-boot-starter-log4j2-2.3.8.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\apache\logging\log4j\log4j-slf4j-impl\2.13.3\log4j-slf4j-impl-2.13.3.jar;D:\apache-maven-3.6.3\repos\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\apache-maven-3.6.3\repos\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;D:\apache-maven-3.6.3\repos\org\apache\logging\log4j\log4j-core\2.13.3\log4j-core-2.13.3.jar;D:\apache-maven-3.6.3\repos\org\apache\logging\log4j\log4j-jul\2.13.3\log4j-jul-2.13.3.jar;D:\apache-maven-3.6.3\repos\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\apache-maven-3.6.3\repos\com\lmax\disruptor\3.3.4\disruptor-3.3.4.jar;D:\apache-maven-3.6.3\repos\org\springframework\spring-core\5.2.12.RELEASE\spring-core-5.2.12.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\spring-jcl\5.2.12.RELEASE\spring-jcl-5.2.12.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\boot\spring-boot-autoconfigure\2.3.8.RELEASE\spring-boot-autoconfigure-2.3.8.RELEASE.jar;D:\apache-maven-3.6.3\repos\org\springframework\boot\spring-boot\2.3.8.RELEASE\spring-boot-2.3.8.RELEASE.jar;D:\apache-maven-3.6.3\repos\com\huaban\jieba-analysis\1.0.2\jieba-analysis-1.0.2.jar;D:\apache-maven-3.6.3\repos\org\apache\commons\commons-lang3\3.10\commons-lang3-3.10.jar;D:\apache-maven-3.6.3\repos\com\github\whvcse\easy-captcha\1.6.2\easy-captcha-1.6.2.jar;D:\apache-maven-3.6.3\repos\com\jcraft\jsch\0.1.55\jsch-0.1.55.jar;D:\apache-maven-3.6.3\repos\commons-net\commons-net\3.7\commons-net-3.7.jar;D:\IntelliJ IDEA Community Edition 2020.3.1\lib\idea_rt.jar" cn.git.helloApplication
Connected to the target VM, address: '127.0.0.1:61667', transport: 'socket'.   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::        (v2.3.8.RELEASE)[2024-09-09T09:41:36.395+08:00] [INFO] [mainraceId] [cn.git.helloApplication] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [StartupInfoLogger.java,55,org.springframework.boot.StartupInfoLogger,logStarting] [Starting helloApplication on smallBigPower with PID 18696 (D:\idea_workspace_activiti_change\docker-hello\target\classes started by Administrator in D:\idea_workspace_activiti_change\docker-hello)] ## ''
[2024-09-09T09:41:36.401+08:00] [INFO] [mainraceId] [cn.git.helloApplication] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [SpringApplication.java,651,org.springframework.boot.SpringApplication,logStartupProfileInfo] [No active profile set, falling back to default profiles: default] ## ''
[2024-09-09T09:41:37.169+08:00] [INFO] [mainraceId] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [TomcatWebServer.java,108,org.springframework.boot.web.embedded.tomcat.TomcatWebServer,initialize] [Tomcat initialized with port(s): 8088 (http)] ## ''
[2024-09-09T09:41:37.179+08:00] [INFO] [mainraceId] [org.apache.coyote.http11.Http11NioProtocol] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [DirectJDKLog.java,173,org.apache.juli.logging.DirectJDKLog,log] [Initializing ProtocolHandler ["http-nio-8088"]] ## ''
[2024-09-09T09:41:37.180+08:00] [INFO] [mainraceId] [org.apache.catalina.core.StandardService] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [DirectJDKLog.java,173,org.apache.juli.logging.DirectJDKLog,log] [Starting service [Tomcat]] ## ''
[2024-09-09T09:41:37.180+08:00] [INFO] [mainraceId] [org.apache.catalina.core.StandardEngine] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [DirectJDKLog.java,173,org.apache.juli.logging.DirectJDKLog,log] [Starting Servlet engine: [Apache Tomcat/9.0.41]] ## ''
[2024-09-09T09:41:37.229+08:00] [INFO] [mainraceId] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [DirectJDKLog.java,173,org.apache.juli.logging.DirectJDKLog,log] [Initializing Spring embedded WebApplicationContext] ## ''
[2024-09-09T09:41:37.229+08:00] [INFO] [mainraceId] [org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [ServletWebServerApplicationContext.java,285,org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext,prepareWebApplicationContext] [Root WebApplicationContext: initialization completed in 796 ms] ## ''
[2024-09-09T09:41:37.263+08:00] [INFO] [mainraceId] [cn.git.init.AnalyzerInit] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [AnalyzerInit.java,44,cn.git.init.AnalyzerInit,analyzerInit] [开始加载分词词典信息,获取自定义词典路径[/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dict]] ## ''
main dict load finished, time elapsed 373 ms
user dict D:\idea_workspace_activiti_change\docker-hello\target\classes\dict\custom.dict load finished, tot words:7839, time elapsed:9ms
[2024-09-09T09:41:37.647+08:00] [INFO] [mainraceId] [cn.git.init.AnalyzerInit] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [AnalyzerInit.java,48,cn.git.init.AnalyzerInit,analyzerInit] [加载自定义词典信息完毕] ## ''
[2024-09-09T09:41:37.785+08:00] [INFO] [mainraceId] [cn.git.init.AnalyzerInit] [smallBigPower] [${sys:ip}] [${sys:applicationName}] [AnalyzerInit.java,61,cn.git.init.AnalyzerInit,analyzerInit] [数据库中敏感分词加载完毕!] ## ''
[2024-09-09T09:41:38.093+08:00] [INFO] [mainraceId] [org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor] [smallBigPower] [192.168.220.1] [docker-hello] [ExecutorConfigurationSupport.java,181,org.springframework.scheduling.concurrent.ExecutorConfigurationSupport,initialize] [Initializing ExecutorService 'applicationTaskExecutor'] ## ''
[2024-09-09T09:41:38.770+08:00] [INFO] [mainraceId] [org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler] [smallBigPower] [192.168.220.1] [docker-hello] [ExecutorConfigurationSupport.java,181,org.springframework.scheduling.concurrent.ExecutorConfigurationSupport,initialize] [Initializing ExecutorService 'taskScheduler'] ## ''
[2024-09-09T09:41:38.778+08:00] [INFO] [mainraceId] [org.apache.coyote.http11.Http11NioProtocol] [smallBigPower] [192.168.220.1] [docker-hello] [DirectJDKLog.java,173,org.apache.juli.logging.DirectJDKLog,log] [Starting ProtocolHandler ["http-nio-8088"]] ## ''
[2024-09-09T09:41:38.795+08:00] [INFO] [mainraceId] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] [smallBigPower] [192.168.220.1] [docker-hello] [TomcatWebServer.java,220,org.springframework.boot.web.embedded.tomcat.TomcatWebServer,start] [Tomcat started on port(s): 8088 (http) with context path ''] ## ''
[2024-09-09T09:41:38.804+08:00] [INFO] [mainraceId] [cn.git.helloApplication] [smallBigPower] [192.168.220.1] [docker-hello] [StartupInfoLogger.java,61,org.springframework.boot.StartupInfoLogger,logStarted] [Started helloApplication in 2.72 seconds (JVM running for 3.189)] ## ''
[2024-09-09T09:41:40.008+08:00] [INFO] [scheduling-1raceId] [cn.git.task.TimerTask] [smallBigPower] [192.168.220.1] [docker-hello] [TimerTask.java,24,cn.git.task.TimerTask,timer] [定时任务执行 : 1725846100008] ## ''
[2024-09-09T09:41:40.009+08:00] [ERROR] [scheduling-1raceId] [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler] [smallBigPower] [192.168.220.1] [docker-hello] [TaskUtils.java,95,org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler,handleError] [Unexpected error occurred in scheduled task] ## ' java.lang.RuntimeException: 异常啦!at cn.git.task.TimerTask.timer(TimerTask.java:26)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)at java.util.concurrent.FutureTask.run(FutureTask.java)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:748)
'
Disconnected from the target VM, address: '127.0.0.1:61667', transport: 'socket'Process finished with exit code -1

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何在实际应用中优化AI大模型性能
  • 学习大模型最佳书籍推荐:NUS尤洋教授所著新书《实战AI大模型》,得到李开复、颜水成、周鸿祎大牛鼎力推荐
  • 如何通过商品id商品链接来获取淘宝商品主图详情图等数据?
  • 828华为云征文 | 基于Docker与Jenkins实现自动化部署
  • 大模型推理--KV Cache
  • SCL 常见问题
  • 异常整理(JAVA基础)
  • 【C++】STL容器详解【上】
  • Java——堆
  • 路灯集中控制器与智慧照明:塑造未来城市的智能光影
  • 亦菲喊你来学机器学习(20) --PCA数据降维
  • 江协科技stm32————11-5 硬件SPI读写W25Q64
  • explicit 的作用(如何避免编译器进行隐式类型转换)
  • 并发编程:synchronized 关键字
  • 【Linux】Linux 可重入函数
  • ➹使用webpack配置多页面应用(MPA)
  • 10个确保微服务与容器安全的最佳实践
  • Brief introduction of how to 'Call, Apply and Bind'
  • C语言笔记(第一章:C语言编程)
  • Docker入门(二) - Dockerfile
  • ERLANG 网工修炼笔记 ---- UDP
  • gulp 教程
  • iOS编译提示和导航提示
  • Java基本数据类型之Number
  • js 实现textarea输入字数提示
  • js对象的深浅拷贝
  • miaov-React 最佳入门
  • rc-form之最单纯情况
  • Redis的resp协议
  • 简单数学运算程序(不定期更新)
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 使用Swoole加速Laravel(正式环境中)
  • 数据仓库的几种建模方法
  • 算法-插入排序
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • ###项目技术发展史
  • #AngularJS#$sce.trustAsResourceUrl
  • (1)bark-ml
  • (2)STL算法之元素计数
  • (42)STM32——LCD显示屏实验笔记
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (笔记)M1使用hombrew安装qemu
  • (二)linux使用docker容器运行mysql
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十)Flink Table API 和 SQL 基本概念
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转载)深入super,看Python如何解决钻石继承难题
  • .gitignore
  • .net core 6 redis操作类
  • .NET Core使用NPOI导出复杂,美观的Excel详解