AI 自动补全的这句日志能正常打印吗?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 最近用上了 GitHub Copilot,它的能力不时让我惊叹。

最近用上了 GitHub Copilot,它的能力不时让我惊叹,于是越来越多地面向 tab 编程,机械键盘的损耗都小了许多:-p

这天,它给我自动生成了一句像这样的日志打印代码:

try {
    // ...
} catch (Exception e) {
    log.error("Xxx 操作出错,订单号 {},操作人 {}", orderNumber, operatorName, e);
}

我盯着这行熟悉又陌生的代码——没错平时我自己也会这么写,但此时竟然产生了一丝不确定,它真的能按期望的效果,先打印出这句话,然后完整打印异常堆栈吗?

既然有疑惑,那就刨根问底一下。

为什么疑惑?

问了自己这个问题之后,我回想了一下,可能是因为以前遇到过这个:

图片

如果最后一个参数不是 Throwable 类型,那 IDEA 会给出警告:

More arguments provided (3) than placeholders specified (2)

那为什么最后多出来的那个参数是 Throwable,IDE 就认为正常了呢?这就是本文要探索的问题。

消除疑惑

遇事不决,command + click 一下。可以看到方法的定义是这样的:

public void error(String format, Object... arguments);

可惜想看具体实现的时候发现实现类太多,索性写一个测试用例 debug 跟一下,一路 F7 进去(这里用的日志框架是 log4j2):

org.apache.logging.slf4j.Log4jLogger#error(java.lang.String, java.lang.Object...)
org.apache.logging.log4j.spi.AbstractLogger#logIfEnabled(java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.Marker, java.lang.String, java.lang.Object...)
org.apache.logging.log4j.spi.AbstractLogger#logMessage(java.lang.String, org.apache.logging.log4j.Level, org.apache.logging.log4j.Marker, java.lang.String, java.lang.Object...)
org.apache.logging.log4j.message.ParameterizedMessageFactory#newMessage(java.lang.String, java.lang.Object...)
org.apache.logging.log4j.message.ParameterizedMessage#ParameterizedMessage(java.lang.String, java.lang.Object...)
org.apache.logging.log4j.message.ParameterizedMessage#init

秘密就在这里了:

// org.apache.logging.log4j.message.ParameterizedMessage

private void init(final String messagePattern) {
    this.messagePattern = messagePattern;
    final int len = Math.max(1, messagePattern == null ? 0 : messagePattern.length() >> 1); // divide by 2
    this.indices = new int[len]; // LOG4J2-1542 ensure non-zero array length
    // 计算占位符个数
    final int placeholders = ParameterFormatter.countArgumentPlaceholders2(messagePattern, indices);
    initThrowable(argArray, placeholders);
    this.usedCount = Math.min(placeholders, argArray == null ? 0 : argArray.length);
}

private void initThrowable(final Object[] params, final int usedParams) {
    if (params != null) {
        final int argCount = params.length;
        // 如果占位符个数比参数个数少,且最后一个参数是 throwable 类型,
        // 则将最后一个参数赋值给 Message 的成员
        if (usedParams < argCount && this.throwable == null && params[argCount - 1] instanceof Throwable) {
            this.throwable = (Throwable) params[argCount - 1];
        }
    }
}

然后在调用堆栈回溯几步有:

// org.apache.logging.log4j.spi.AbstractLogger

protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
        final Object... params) {
    final Message msg = messageFactory.newMessage(message, params);
    logMessageSafely(fqcn, level, marker, msg, msg.getThrowable());
}

至此基本上清晰了。

结论

经过分析及实际运行验证:

  • AI 生成的代码可以按期望效果打印;

  • 如果有比占位符多的非 Throwable 类型参数,会被忽略掉。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
4月前
|
人工智能 运维 监控
日志太多根本看不过来?教你用AI,让日志自己“说人话”!
日志太多根本看不过来?教你用AI,让日志自己“说人话”!
742 0
|
7月前
|
机器学习/深度学习 人工智能 编解码
AI视频生成也能自动补全!Wan2.1 FLF2V:阿里通义开源14B视频生成模型,用首尾两帧生成过渡动画
万相首尾帧模型是阿里通义开源的14B参数规模视频生成模型,基于DiT架构和高效视频压缩VAE,能够根据首尾帧图像自动生成5秒720p高清视频,支持多种风格变换和细节复刻。
1313 9
AI视频生成也能自动补全!Wan2.1 FLF2V:阿里通义开源14B视频生成模型,用首尾两帧生成过渡动画
|
5月前
|
数据采集 人工智能 运维
甭再盯死日志了,AI已经悄悄替你盯着网络流量了
甭再盯死日志了,AI已经悄悄替你盯着网络流量了
218 0
|
6月前
|
人工智能 运维 监控
兄弟,你还在翻日志看故障?AI都快替你写日报了!
兄弟,你还在翻日志看故障?AI都快替你写日报了!
386 7
|
7月前
|
人工智能 自然语言处理 安全
Purple AI带来的新可能 对 第三方日志源以及多语言问题支持
随着网络威胁日益复杂,SentinelOne推出Purple AI,以生成式人工智能助力安全团队高效检测与防护。Purple AI简化威胁搜寻、调查流程,支持多语言提问及扩展第三方日志源(如Palo Alto Networks、ZScaler等),提升数据可见性与响应速度。其多语言功能打破语言障碍,促进全球协作,赋能每个组织在不断演变的威胁中保持领先,构建更安全的未来。
56 2
Purple AI带来的新可能 对 第三方日志源以及多语言问题支持
|
6月前
|
机器学习/深度学习 人工智能 运维
日志别只会“看”,现在是该让AI帮你“算”了!
日志别只会“看”,现在是该让AI帮你“算”了!
315 9
|
12月前
|
存储 人工智能 关系型数据库
拥抱Data+AI|解码Data+AI助力游戏日志智能分析
「拥抱Data+AI」系列第2篇:阿里云DMS+AnalyticDB助力游戏日志数据分析与预测
拥抱Data+AI|解码Data+AI助力游戏日志智能分析
|
9月前
|
存储 人工智能 编解码
Pippo:Meta放出AI大招!单张照片秒转3D人像多视角视频,AI自动补全身体细节
Pippo 是 Meta 推出的图像到视频生成模型,能够从单张照片生成 1K 分辨率的多视角高清人像视频,支持全身、面部或头部的生成。
623 9
Pippo:Meta放出AI大招!单张照片秒转3D人像多视角视频,AI自动补全身体细节
|
10月前
|
机器学习/深度学习 人工智能 运维
智能日志分析:用AI点亮运维的未来
智能日志分析:用AI点亮运维的未来
3013 15