布局
布局是appender中用来格式化日志事件输出的方法集。 他们讲日志事件作为参数并返回一个字符串。
Log4js 的appender内置了几个布局,并提供了在appender内置布局不适用的情况下创建自己的appender布局的方法。
在大多数情况下,您不需要配置布局-有些appender不需要定义 Layouts(例如logFaces-UDP): 所有使用布局的appender都将定义一个合理的默认值。
配置
大多数appender配置都会使用一个名为layout
的字段,这是一个对象,通常只有一个字段type
,即下面定义的布局名称。有些布局需要额外的配置选项,这些选项应该包含在同一个对象中。
例子
log4js.configure({
appenders: { out: { type: "stdout", layout: { type: "basic" } } },
categories: { default: { appenders: ["out"], level: "info" } }
});
此配置将stdout的appender默认coloured
布局替换为basic
布局。
内置布局
Basic
type
-basic
基本布局将输出时间戳,级别,类别,然后输出格式化的日志事件数据。
例子
log4js.configure({
appenders: { out: { type: "stdout", layout: { type: "basic" } } },
categories: { default: { appenders: ["out"], level: "info" } }
});
const logger = log4js.getLogger("cheese");
logger.error("Cheese is too ripe!");
将输出为:
[2017-03-30 07:57:00.113] [ERROR] cheese - Cheese is too ripe!
Coloured
type
-coloured
(或colored
)
此布局与basic
相同,只是时间戳,级别和类别将根据日志事件的级别进行着色(如果您的终端/文件支持它-如果您在输出中看到一些奇怪的字符并且没有颜色,那么您应该切换到basic布局
)。 使用的颜色是:
TRACE
- 'blue'DEBUG
- 'cyan'INFO
- 'green'WARN
- 'yellow'ERROR
- 'red'FATAL
- 'magenta'
Message Pass-Through
type
-messagePassThrough
此布局仅格式化日志事件数据,不输出时间戳,级别或类别。它通常用在使用特定格式(例如:gelf)对事件进行序列化的appender中。
例子
log4js.configure({
appenders: {
out: { type: "stdout", layout: { type: "messagePassThrough" } }
},
categories: { default: { appenders: ["out"], level: "info" } }
});
const logger = log4js.getLogger("cheese");
const cheeseName = "gouda";
logger.error("Cheese is too ripe! Cheese was: ", cheeseName);
将输出:
Cheese is too ripe! Cheese was: gouda
Dummy
type
-dummy
此布局仅输出日志事件数据中的第一个值。它是为logstashUDP的 appender 添加的,我不确定除此之外还有其他用途。
例子
log4js.configure({
appenders: { out: { type: "stdout", layout: { type: "dummy" } } },
categories: { default: { appenders: ["out"], level: "info" } }
});
const logger = log4js.getLogger("cheese");
const cheeseName = "gouda";
logger.error("Cheese is too ripe! Cheese was: ", cheeseName);
将输出:
Cheese is too ripe! Cheese was:
模式
type
-pattern
pattern
-string
- 输出格式的说明符,使用如下所述的占位符tokens
-object
(可选) - 要在模式中使用的用户定义的 tokens
模式格式
模式字符串可以包含任何字符,但是从%
开始的序列将被从日志事件和其他环境值中取值替换。
说明符的格式是%[padding].[truncation][field]{[format]}
- padding 和 truncation 是可选的,格式只适用于少数标记(特别是日期)。
例如%5.10p - 将日志级别左移 5 个字符,最多 10 个字符
字段可以为以下值:
%r
ToLocaleTimeString 格式的时间%p
日志级别%c
日志类别%h
主机名%m
日志数据%d
日期, 格式化 - 默认值为ISO8601
, 格式化选项:ISO8601
、ISO8601_WITH_TZ_OFFSET
、ABSOLUTE
、DATE
或任何与date-format 库兼容的字符串。例如:%d{DATE}
、%d{yyyy/MM/dd-hh.mm.ss}
%%
% - 当您想要在输出中使用字符%
时%n
换行%z
进程 ID(来自process.pid
)%f
文件名的完整路径(在类别上需要enableCallStack:true
,请参见配置对象)%f{depth}
路径深度,让您选择仅具有文件名(%f{1}
)或选定数量的目录%l
行号(在类别上需要enableCallStack:true
,请参见配置对象)%o
列位置(在类别上需要enableCallStack:true
,请参见配置对象)%s
调用堆栈(在类别上需要enableCallStack:true
,请参见配置对象)%x{<tokenname>}
将动态令牌添加到您的日志中。 令牌是在 tokens 参数中指定的。%X{<tokenname>}
从 Logger 上下文中添加值。 令牌是上下文值的 key。%[
开始一个彩色块(颜色将从日志级别获取,类似于colouredLayout
)%]
结束一个彩色块
Tokens
用户定义的标记可以是字符串或函数。函数将传递给 log 事件,并应返回一个字符串。 例如,您可以定义一个自定义标记,为用户
输出日志事件的上下文值,如下所示:
log4js.configure({
appenders: {
out: {
type: "stdout",
layout: {
type: "pattern",
pattern: "%d %p %c %x{user} %m%n",
tokens: {
user: function(logEvent) {
return AuthLibrary.currentUser();
}
}
}
}
},
categories: { default: { appenders: ["out"], level: "info" } }
});
const logger = log4js.getLogger();
logger.info("doing something.");
将输出:
2017-06-01 08:32:56.283 INFO default charlie doing something.
您还可以使用 Logger 上下文对象存储令牌(有时称为嵌套诊断上下文或映射的诊断上下文),并在布局中使用它们。
log4js.configure({
appenders: {
out: {
type: "stdout",
layout: {
type: "pattern",
pattern: "%d %p %c %X{user} %m%n"
}
}
},
categories: { default: { appenders: ["out"], level: "info" } }
});
const logger = log4js.getLogger();
logger.addContext("user", "charlie");
logger.info("doing something.");
将输出:
2017-06-01 08:32:56.283 INFO default charlie doing something.
请注意,您还可以将方法添加到 Logger 上下文对象,它们也将传递给 log 事件。
添加自己的布局
您可以在调用log4js.configure
之前调用log4js.addLayout(type, fn)
添加自己的布局。
type
是您要用来在appender配置中引用布局的标签。fn 是一个带有单个对象参数的函数,该参数将包含布局实例的配置,并返回一个布局函数。布局函数接受一个 log 事件参数并返回一个字符串(通常,尽管您可以返回任何内容,只要appender知道如何处理它)。
自定义布局示例
此示例也可以在examples/custom-layout.js中找到
const log4js = require("log4js");
log4js.addLayout("json", function(config) {
return function(logEvent) {
return JSON.stringify(logEvent) + config.separator;
};
});
log4js.configure({
appenders: {
out: { type: "stdout", layout: { type: "json", separator: "," } }
},
categories: {
default: { appenders: ["out"], level: "info" }
}
});
const logger = log4js.getLogger("json-test");
logger.info("this is just a test");
logger.error("of a custom appender");
logger.warn("that outputs json");
log4js.shutdown(() => {});
本示例输出以下内容:
{"startTime":"2017-06-05T22:23:08.479Z","categoryName":"json-test","data":["this is just a test"],"level":{"level":20000,"levelStr":"INFO"},"context":{}},
{"startTime":"2017-06-05T22:23:08.483Z","categoryName":"json-test","data":["of a custom appender"],"level":{"level":40000,"levelStr":"ERROR"},"context":{}},
{"startTime":"2017-06-05T22:23:08.483Z","categoryName":"json-test","data":["that outputs json"],"level":{"level":30000,"levelStr":"WARN"},"context":{}},