Axiom 日志库
这个 @axiomhq/logging 软件包允许您从 JavaScript 应用程序中向 Axiom 发送结构化日志.
// lib/axiom/logger.ts
import axiomClient from '@/lib/axiom/axiom';
import { Logger, ConsoleTransport, AxiomJSTransport } from '@axiomhq/logging';
export const logger = new Logger({
transports: [
new AxiomJSTransport({
axiom: axiomClient,
dataset: process.env.AXIOM_DATASET!,
axiomClient: 'my-app/1.0',
}),
new ConsoleTransport({ prettyPrint: true }),
],
});
logger.info('Hello World!');
AxiomJSTransport 在 Axiom 客户端的日志包使用中附加 X-Axiom-Client 头曰. 以上述实例为例,请求使用 X-Axiom-Client 头像 axiom-js/<version> axiom-logging/<version> my-app/1.0。 。 。 .
代理运输
ProxyTransport 用途 SimpleFetchTransport 将日志发送到您的 HTTP 端点。 交付是最好的努力:
- 运输机最多保留了1,000个排队活动加上1批最多1,000个飞行活动。 当队列填满时,它会放下最古老的队列事件来保留最近的活动. 机内批次不变. 这些限制约束事件计数,而不是字节或单个事件大小.
- 与
autoFlush: true,第一个排队事件启动2秒计时器。 后期的事件不会推迟,当没有批量飞行时,一整队就立即开始发送.{ durationMs }设置不同的延迟。 与autoFlush省略或删除false时发送flush()。 。 。 . - 请求一次一个。 网络故障和HTTP 429,500,502,503和504在一秒后最多得到一次重试. 更长的时间
Retry-After很荣幸。 两次尝试和拖延都有一个10秒的最后期限. - 永久失效, 取消呼叫器, 超时, 或疲劳的重试 放弃批量 。 若为
Retry-After无法在截止日期内装入, 批次不提前重试就被丢弃 。 随后的批次也尊重了服务器的冷却,如果无法在自己的最后期限内等待,则会被丢弃. - 投产
console.warn包含数的诊断,不包含日志内容。 每次运输最多每30秒发出一次警告;当发生多滴时,在下一次警告中包括被压制的计数.
flush() 等待发出或发出该呼吁之前接受的事件。 后期事件不延长该呼叫者的目标,同时发出的呼叫共享序列发件人. 解决的冲水不能保证交货。 丢失响应后重试可以重复服务器已经接受的事件 .
更早的版本保留了失败的批次用于后一冲. 上面的受限重试政策取代了这一行为,因此长时间的停用会导致数据丢失而不会让积压无限期地增加.
Schema 验证
Logger 可以验证和输入日志 fields 使用执行标准Schema v1的任何验证符(例如) zod) (中文(简体) ).
import { z } from 'zod';
import { Logger, ConsoleTransport } from '@axiomhq/logging';
const LogFieldsSchema = z
.object({
userId: z.string(),
action: z.enum(['login', 'logout']),
})
.strict();
const logger = new Logger({
transports: [new ConsoleTransport()],
schema: LogFieldsSchema,
onValidationError: (context) => {
console.warn('Dropped invalid log', context.stage, context.reason, context.issues);
},
});
logger.info('User action', { userId: '123', action: 'login' });
运输交付前会丢弃无效的日志 . schema 校验输入 fields 格式化器运行前,以及 outputSchema 能够验证最终格式化的事件 :
const OutputSchema = z.object({
eventName: z.string(),
userId: z.string(),
});
const logger = new Logger({
transports: [new ConsoleTransport()],
schema: LogFieldsSchema,
outputSchema: OutputSchema,
formatters: [
(event) => ({
eventName: event.message,
userId: event.fields.userId,
}),
],
});
未知的密钥行为取决于您的方案配置 :
- 严格的对象计划( 如
z.object(...).strict()拒绝未知密钥 - 非限制性计划可能允许
logger.raw(...) 绕过计划验证.
所需资源
需要20个或以上的节点。 节点.js 18不再支持.
安装
npm install @axiomhq/js @axiomhq/logging
文档
欲了解如何设置和使用 @axiomhq/logging 软件包,参见 axiom.co/docs/指向/标注。 。 。 .