ADC

在 NSWL 客户端系统上自定义日志记录

您可以通过对 NSWL 客户端配置文件 (log.conf) 进行更多修改,在 NetScaler Web 日志记录 (NSWL) 客户端系统上自定义日志记录。使用文本编辑器修改客户端系统上的 log.conf 配置文件。

要自定义日志记录,请使用配置文件定义过滤器和日志属性。

  • 日志过滤器。根据 Web 服务器的主机 IP 地址、域名和主机名筛选日志信息。
  • 日志属性。每个过滤器都有一组关联的日志属性。日志属性定义了如何存储过滤后的日志信息。

示例配置文件

以下是一个示例配置文件:

##########
# This is the NSWL configuration file
# Only the default filter is active
# Remove leading # to activate other filters
##########
##########
# Default filter (default on)
# W3C Format logging, new file is created every hour or on reaching 10MB file size,
# and the file name is Exyymmdd.log
##########
Filter default
begin default
        logFormat               W3C
        logInterval             Hourly
        logFileSizeLimit        10
        logFilenameFormat       Ex%`{`%y%m%d}t.log
end default
##########
# NetScaler caches example
# CACHE_F filter covers all the transaction with HOST name www.netscaler.com and the listed server ip's
##########
#Filter CACHE_F HOST www.netscaler.com IP 192.168.100.89 192.168.100.95 192.168.100.52 192.168.100.53 ON
##########
# netscaler origin server example
# Not interested in Origin server to Cache traffic transaction logging
##########
#Filter ORIGIN_SERVERS IP 192.168.100.64 192.168.100.65 192.168.100.66 192.168.100.67 192.168.100.225 192.168.100.226 192.168.
100.227 192.168.100.228 OFF
##########
# netscaler image server example
# all the image server logging.
##########
#Filter IMAGE_SERVER HOST www.netscaler.images.com IP 192.168.100.71 192.168.100.72 192.168.100.169 192.168.100.170 192.168.10
0.171 ON
##########
# NCSA Format logging, new file is created every day midnight or on reaching 20MB file size,
# and the file name is /datadisk5/netscaler/log/NS<hostname>/Nsmmddyy.log.
# Exclude objects that ends with .gif .jpg .jar.
##########
#begin ORIGIN_SERVERS
#       logFormat               NCSA
#       logInterval             Daily
#       logFileSizeLimit        40
#       logFilenameFormat       /datadisk5/ORGIN/log/%v/NS%`{`%m%d%y}t.log
#       logExclude              .gif .jpg .jar
#end ORIGIN_SERVERS

##########
# NCSA Format logging, new file is created every day midnight or on reaching 20MB file size,
# and the file name is /datadisk5/netscaler/log/NS<hostname>/Nsmmddyy.log with log record timestamp as GMT.
##########
#begin CACHE_F
#       logFormat               NCSA
#       logInterval             Daily
#       logFileSizeLimit        20
#       logFilenameFormat /datadisk5/netscaler/log/%v/NS%`{`%m%d%y}t.log
#       logtime                 GMT
#end CACHE_F

##########
# W3C Format logging, new file on reaching 20MB and the log file path name is
# atadisk6/netscaler/log/server's ip/Exmmyydd.log with log record timestamp as LOCAL.
##########
#begin IMAGE_SERVER
#       logFormat               W3C
#       logInterval             Size
#       logFileSizeLimit        20
#       logFilenameFormat /datadisk6/netscaler/log/%AEx%`{`%m%d%y}t
#       logtime                 LOCAL
#end IMAGE_SERVER

##########
# Virtual Host by Name firm, can filter out the logging based on the host name by,
##########

#Filter VHOST_F IP 10.101.2.151 NETMASK 255.255.255.0
#begin VHOST_F
#       logFormat               W3C
#       logInterval             Daily
#       logFileSizeLimit        10
logFilenameFormat /ns/prod/vhost/%v/Ex%`{`%m%d%y}t
#end VHOST_F

########## END FILTER CONFIGURATION ##########
<!--NeedCopy-->

创建过滤器

您可以在配置文件 (log.conf) 中使用默认筛选器定义,也可以修改筛选器或创建筛选器。您可以创建多个日志筛选器。

注意:

统一日志记录记录未定义过滤器的事务,如果启用了默认筛选器,则使用默认筛选器。可以通过仅定义默认筛选器来完成所有服务器的统一日志记录。

如果服务器托管多个网站,并且每个网站都有自己的域名,并且每个域都与虚拟服务器关联,则可以配置 Web 服务器日志记录以为每个网站创建单独的日志目录。下表显示了用于创建筛选器的参数。

表 1. 用于创建筛选器的参数

参数 说明
筛选器名称 筛选器的名称。筛选器名称可以包含字母数字字符,长度不能超过 59 个字符。超过 59 个字符的过滤器名称将被截断为 59 个字符。
主机名 正在为其记录事务的服务器的主机名。
IP ip 要记录事务的服务器的 IP 地址(例如,如果服务器有多个域,具有一个 IP 地址)。
IP ip 2...ip n: 多个 IP 地址(例如,如果服务器域有多个 IP 地址)。
ip6 IP 要记录事务的服务器的 IPv6 地址。
IP IP 网络掩码掩码 要在子网中使用的 IP 地址和子网掩码组合。
ON | OFF 启用或禁用过滤器来记录事务。如果未选择任何参数,则启用筛选器 (ON)。

要创建过滤器,请在 log.conf 文件中输入以下命令:

  • filter <filterName> <HOST name> | [IP<ip> ] | [IP<ip 2...ip n> ] | <IP ip NETMASK mask> [ON | OFF]

  • filter <filterName> <HOST name> | [IP6 ip/<prefix length>] [ON | OFF]

为虚拟服务器创建筛选器

要为虚拟服务器创建筛选器,请在 log.conf 文件中输入以下命令:

filter <filterName> <VirtualServer IP address>

示例

在以下示例中,您指定的 IP 地址为 192.168.100.0,网络掩码为 255.255.255.0。该过滤器适用于 IP 地址 192.168.100.1 至 192.168.100.254。

Filter F1 HOST www.netscaler.com ON
Filter F2 HOST www.netscaler.com IP 192.168.100.151 ON
Filter F3 HOST www.netscaler.com IP 192.168.100.151 192.165.100.152 ON
Filter F4 IP 192.168.100.151
Filter F5 IP 192.168.100.151 HOST www.netscaler.com OFF
Filter F6 HOST www.netscaler.com HOST www.xyz.com HOST www.abcxyz.com IP 192.168.100.200 ON
Filter F7 IP 192.250.100.0 NETMASK 255.255.255.0
Filter F8 HOST www.xyz.com IP 192.250.100.0 NETMASK 255.255.255.0 OFF
For creating filters for servers having IPv6 addresses.
Filter F9 2002::8/112 ON
Filter F10 HOST www.abcd.com IP6 2002::8 ON

<!--NeedCopy-->

指定日志属性

日志属性将应用于与筛选器关联的所有日志条目。log 属性定义以关键字 BEGIN 开头,以 END 结尾,如下例所示:

BEGIN <filtername>
 logFormat ...
 logFilenameFormat ...
 logInterval ...
 logFileSize ....
 logExclude ....
 logTime ….
 END
<!--NeedCopy-->

定义中的条目可以包括以下内容:

  • 日志格式指定支持 NCSA、W3C 扩展和自定义日志文件格式的 Web 服务器日志记录功能。

默认情况下, logformat 属性为 w3c。要覆盖,请在配置文件中输入自定义或 NCSA,例如:

LogFormat NCSA
<!--NeedCopy-->

注意:

对于 NCSA 和自定义日志格式,本地时间用于时间戳交易和文件轮换。

  • LogInterval 指定创建新日志文件的时间间隔。使用以下值之一:

    • 每小时:每小时创建一个文件。
    • 每日:每天午夜都会创建一个文件。默认值。
    • 每周:每周日午夜创建一个文件。
    • 每月:文件在每月的第一天午夜创建。
    • 无:当 Web 服务器日志记录启动时,文件只创建一次。</span>

示例:

LogInterval Daily
<!--NeedCopy-->

logFilesizeLimit 指定日志文件的最大大小(以 MB 为单位)。它可以用于任何日志间隔(每周、每月等)。当达到最大文件大小限制或定义的日志间隔时间过去时,将创建文件。

要覆盖此行为,请将大小指定为 loginterval 属性,以便仅在达到日志文件大小限制时才创建文件。

默认 LogFileSizeLimit 为 10 MB。

示例:

LogFileSizeLimit 35
<!--NeedCopy-->
  • LogFilenameFormat 指定日志文件的文件名格式。文件的名称可以是以下类型:

    • 静态:指定包含绝对路径和文件名的常量字符串。

      动态:指定包含以下格式的表达式:

      • 服务器 IP 地址
      • 日期 (% {格式} t)
      • URL 后缀 (%x)
      • 主机名 (%v)

示例:

LogFileNameFormat Ex%`{`%m%d%y}t.log
<!--NeedCopy-->

此命令将第一个文件名创建为 Exmmddyy.log,然后每小时创建一个带有文件名的文件:exmmddyy.log.0、exmmddyY.log.1、…、exmmddyY.logn。

示例:

     LogInterval size
     LogFileSize 100
     LogFileNameFormat Ex%`{`%m%d%y}t
<!--NeedCopy-->

小心:

在 logfilenameformat 命令中指定的日期格式 %t 将覆盖该筛选器的日志间隔属性。要防止每天创建一个新文件,而不是达到指定的日志文件大小时,请勿在 logfilenameformat 中使用 %t。

  • LogExclude 防止记录具有指定文件扩展名的事务。

示例:

LogExclude.html
<!--NeedCopy-->

此命令创建一个日志文件,该文件不包括*.html 文件的日志事务。

LogTime 将日志时间指定为格林尼治标准时间或本地。

默认值为:

  • NCSA 日志文件格式:本地
  • W3C 日志文件格式:格林威治标准时间。

了解 NCSA 和 W3C 日志格式

NetScaler 支持以下标准日志文件格式:

  • NCSA 通用日志格式
  • W3C 扩展日志格式

NCSA 通用日志格式

如果日志文件格式为 NCSA,则日志文件将按以下格式显示日志信息:

Client_IP_address -User_Name [Date:Time -TimeZone] "Method Object HTTP_version" HTTP_StatusCode BytesSent
<!--NeedCopy-->

要使用 NCSA 通用日志格式,请在 log.conf 文件的 LogFormat 参数中输入 NCSA

下表介绍了 NCSA 通用日志格式。

参数 说明
client_IP_address 客户端计算机的 IP 地址。
用户名 用户名。
日期 交易的日期。
时间 交易完成的时间。
时区 时区(格林威治标准时间或当地时间)。
Method(方法) 请求方法(例如;GET、POST)。
对象 URL。
http_ver 客户端使用的 HTTP 版本。
http_statusC 响应中的状态代码。
发送的字节数 从服务器发送的字节数。

W3C 扩展日志格式

扩展日志文件包含一系列包含以换行符 (LF) 或顺序回车换行符 (CRLF) 终止的 ASCII 字符的行。日志文件生成器必须遵循运行它们的平台的行终止约定。

对数分析仪必须接受 LF 或 CRLF 形式。每行可能包含指令或条目。如果要使用 W3C 扩展日志格式,请在 log.conf 文件中输入 W3C 作为日志格式参数。

默认情况下,标准 W3C 日志格式在内部定义为自定义日志格式,如下所示:

%`{`%Y-%m-%d%H:%M:%S}t %a %u %S %A %p %m %U %q %s %j %J %T %H %+{user-agent}i %+{cookie} i%+{referer}i
<!--NeedCopy-->

您还可以更改顺序或删除此 W3C 日志格式中的某些字段。例如:

logFormat W3C %`{`%Y-%m-%d%H:%M:%S}t %m %U
<!--NeedCopy-->

W3C 日志条目使用以下格式创建:

#Version: 1.0
#Fields: date time cs-method cs-uri
#Date: 12-Jun-2001 12:34
2001-06-12 12:34:23 GET /sports/football.html 2001-06-12 12:34:30
GET /sports/football.html
<!--NeedCopy-->

参赛作品

条目由一系列与单个 HTTP 事务相关的字段组成。字段用空格分隔。Citrix 建议使用标签字符。如果未使用特定条目中的字段,则短划线 (-) 标记省略字段。

指令

有关日志记录过程的信息,请参阅 指令 表。以英镑符号 (#) 开头的行包含指令。

示例:

以下示例日志文件显示了 W3C 扩展日志格式的日志条目:

#Version: 1.0
#Fields: time cs-method cs-uri
#Date: 12-Jan-1996 00:00:00
00:34:23 GET /sports/football.html
12:21:16 GET /sports/football.html
12:45:52 GET /sports/football.html
12:57:34 GET /sports/football.html
<!--NeedCopy-->

字段

“字段”指令列出了一系列字段标识符,用于指定每个条目中记录的信息。字段标识符可能具有以下表单之一:

  • 标识符: 与整个交易相关。
  • prefix-identifier: 与由值前缀定义的各方之间的信息传输有关。
  • prefix (header): 指定由值前缀定义的各方之间传输的 HTTP 标头字段标头的值。以这种方式指定的字段始终具有类型。

下表介绍了定义的前缀。

前缀 说明
c 客户端
服务器
r 远程
cs 客户端到服务器
sc 服务器到客户端
sr 服务器到远程服务器(代理使用的前缀)
rs 远程服务器到服务器(代理使用的前缀)
x 特定于应用程序的标识符

示例:

以下示例是使用前缀的已定义标识符:

cs-method: 客户端发送到服务器的请求中的方法。

sc(Referer): 回复中的 Referer 字段。

c-ip: 客户端的 IP 地址。

标识符

下表描述了不需要前缀的 W3C 扩展日志格式标识符。

标识符 说明
date 交易完成的日期。
时间 交易完成的时间。
花费的时间 完成事务所用的时间(以秒为单位)。
bytes 传输的字节数。
缓存 记录是否发生了缓存命中。零表示高速缓存未命中。

下表描述了需要前缀的 W3C 扩展日志格式标识符。

标识符 说明
IP IP 地址和端口号。
DNS DNS 名称。
status 状态码。
comment 返回时带有状态码的评论。
method 方法。
url URL。
url-stem URL 的词干部分。
url-query URL 的查询部分。

W3C 扩展日志文件格式允许您选择日志字段。下表显示了这些字段。

字段 说明
日期 交易完成的日期。
时间 交易完成的时间。
客户端 IP 客户端的 IP 地址。
用户名 用户名。
服务名称 服务名称,始终为 HTTP。
服务器 IP 服务器 IP 地址。
服务器端口 服务器端口号
Method(方法) 请求方法(例如;GET、POST)。
Url Stem URL 词干。
URL 查询 URL 的查询部分。
HTTP 状态 响应中的状态代码。
发送的字节数 发送到服务器的字节数(请求大小,包括 HTTP 标头)。
已接收字节数 从服务器接收的字节数(响应大小,包括 HTTP 标头)。
所需时间 交易完成所需的时间(以秒为单位)。
协议版本 客户端正在使用的 HTTP 的版本号。
用户代理 HTTP 协议中的 用户代理 字段。
cookie HTTP 协议的 Cookie 字段。
Referer HTTP 协议的 Referer 字段。

创建自定义日志格式

您可以手动或使用 NSWL 库自定义日志文件数据的显示格式。通过使用自定义日志格式,您可以派生 Apache 当前支持的大多数日志格式。

使用 NSWL 库创建自定义日志格式

根据 Windows 或 Solaris 主机计算机上是否安装了 NSWL 可执行文件,请使用以下 NSWL 库之一:

  • Windows: 位于系统管理器主机上 \ns\bin 目录中的 nswl.lib 库。
  • Solaris: 位于 usr/local/netscaler/bin 中的 libnswl.a 库。
  1. 在 C 源文件中添加系统定义的以下两个 C 函数:

    ns_userdefFieldName ():此函数返回必须作为自定义字段名添加到日志记录中的字符串。

    ns_userdefFieldVal ():此函数实现自定义字段值,然后将其作为字符串返回,该字符串必须添加到日志记录末尾。

  2. 将文件编译为目标文件。
  3. 将目标文件与 NSWL 库(以及可选的第三方库)链接以形成新的 NSWL 可执行文件。
  4. 在配置文件 (log.conf) 的 LogFormat 字符串的末尾添加 %d 个字符串。

示例:

##########
# A new file is created every midnight or on reaching 20MB file size,
# and the file name is
/datadisk5/netscaler/log/NS<hostname>/Nsmmddyy.log and create
digital
#signature field for each record.
BEGIN CACHE_F
    logFormat custom "%a - "%{user-agent}i" [%d/%B/%Y %T -%g] "%x"
%s %b%{referrer}i "%{user-agent}i" "%{cookie}i" %d "
    logInterval Daily
    logFileSizeLimit 20
    logFilenameFormat
/datadisk5/netscaler/log/%v/NS%`{`%m%d%y}t.log
END CACHE_F
<!--NeedCopy-->

手动创建自定义日志格式

要自定义日志文件数据必须显示的格式,请指定一个字符串作为 LogFormat 日志 属性定义的参数。以下是使用字符串创建日志格式的示例:

LogFormat Custom ""%a - "%{user-agent}i" %[%d/%m/%Y]t %U %s %b %T"
<!--NeedCopy-->
  • 字符串可以包含“c”类型的控制字符\ n 和\ t 来表示新的行和制表符。
  • 使用带有文字引号和反斜杠的 Esc 键。

通过在格式字符串中放置% 指令来记录请求的特征,这些指令在日志文件中被值替换。

如果日志文件名格式字符串中存在 %v(主机名)或 %x(URL 后缀)格式说明符,则文件名中的以下字符将替换为日志配置文件名中的下划线符号:

" *. /: < > ? \ |

ASCII 值在 0-31 范围内的字符将被以下内容替换:

%<ASCII value of character in hexadecimal>

例如,具有 ASCII 值 22 的字符被 %16 替换。

小心:

如果 %v 格式说明符存在于日志文件名格式字符串中,则会为每个虚拟主机打开一个单独的文件。为确保持续日志记录,进程可以打开的最大文件数必须足够大。有关更改可打开的文件数的过程,请参阅操作系统文档。

创建 Apache 日志格式

您可以从自定义日志中派生 Apache 当前支持的大多数日志格式。与 Apache 日志格式匹配的自定义日志格式有:

NCSA/ 组合:LogFormat custom %h %l %u [%t] “%r” %s %B “%{referer}i” “%{user-agent}i”

NCSA/Common: LogFormat custom %h %l %u [%t] “%r” %s %B

Referer 日志:日志格式自定义“% {referer} i”->%U

用户代理:logFormat 自定义% {user agent} i

同样,您可以从自定义格式派生其他服务器日志格式。

定义自定义日志格式的参数

下表描述了自定义日志格式。

参数 说明
%a 远程 IPv4 地址。
%A 本地 IPv4 地址。
%a6 远程 IPv6 地址。
%A6 本地 IPv6 地址。
%B 发送的字节,不包括 HTTP 标头(响应大小)。
%b 接收的字节,不包括 HTTP 标头(请求大小)。
%d 用户定义的字段。
%K 客户端端口信息。
%e1 第一个自定义 HTTP 请求标头的值。
%e2 第二个自定义 HTTP 请求标头的值。
%E1 第一个自定义 HTTP 响应标头的值。
%E2 第二个自定义 HTTP 响应标头的值。注意:有关如何导出自定义 HTTP 标头的说明,请参阅为 Web 服务器日志记录配置 NetScaler
%g 格林威治标准时间偏移(例如,太平洋标准时间为 -0800)。
%h 远程主机的 IPv4 地址。
%h6 远程主机的 IPv6 地址。
H 请求协议。
% {Foobar} i Foobar 的内容:发送到服务器的请求中的标题行。该系统支持用户代理、引用和 cookie 标头。此格式的% 后面的 + 通知日志记录客户端使用 + 作为单词分隔符。
%j 接收的字节,包括标头(请求大小)。
%J 发送的字节,包括标头(响应大小)。
%l 远程日志名称(来自identd,如果提供)。
%m 请求方法。
%M 为请求提供服务所用的时间(以微秒为单位)。
% {Foobar} o Foobar 的内容:回复中的标题行。支持用户代理、推荐人和 cookie 标头(包括设置的 cookie 标头)。
%p 为请求提供服务的服务器的规范端口。
%P 管理分区。
%q 查询字符串(前缀为问号 (?)如果存在查询字符串)。
%r 请求的第一行。
%s 内部重定向的请求,这是原始请求的状态。
%t 时间,采用通用日志格式(标准英文时间格式)。
% {format} t 按格式给出的时间格式必须采用 strftime (3) 格式。有关格式说明,请参阅时间格式定义。
%T 为请求提供服务所用的时间(以秒为单位)。
%u 远程用户(来自身份验证;如果返回状态 (%s) 为 401,则可能是虚假用户)。
%U 请求的 URL 路径。
%v 为请求提供服务的服务器的规范名称。
%V6 系统中的虚拟服务器 IPv6 地址(如果使用负载平衡、内容切换和/或缓存重定向)。
%D 打印 HTTP 事务 ID。
%L 交易时间(以毫秒为单位)。
%R HTTP 原因字符串映射到状态码。
%f 源端口日志记录。
%V 虚拟服务器 IPv4 地址。

注意

有关如何导出自定义 HTTP 标头的说明,请参 阅为 Web 服务器日志记录配置 NetScaler

例如,如果将日志格式定义为 %+{user-agent}i,并且用户代理值为 NetScaler 系统 Web Client,则该信息将记录为 NetScaler System+Web+Client。另一种方法是使用双引号。例如,“% {用户代理} i”将其记录为“NetScaler 系统 Web 客户端”。“ 不要对来自 %.. .r、%. . .i 和 %. . .o 的字符串使用 \<Esc\> 键它符合通用日志格式的要求。客户端可以在日志中插入控制字符。因此,在处理原始日志文件时必须小心。

时间格式定义

下表描述了时间格式定义,以了解自定义日志格式表中描述的 %{format}t 字符串的格式部分。方括号 ([]) 中的值表示出现的值的范围。例如,下表中 %d 描述中的 [1,31] 显示了 %d 个从 1 到 31 的范围。

| 参数 | 说明 | | ———— | ———- | | %% | 与% 相同。 | | %a | 区域设置的工作日的缩写名称。 | | %A | 区域设置的工作日的全名 | | %b | 区域设置的月份缩写名称。 | | %B | 区域设置的月份的全名。 | | %C | 世纪数(年份除以 100 并截断为十进制数的整数 [1,99]);个位数前面加一个 0。| | %d | 用户定义的字段。 | | %K | 世纪数(年份除以 100 并截断为十进制数的整数 [1,99]);个位数前面加一个 0。| | %e | 月份中的某一天 [1,31];个位数前面有一个空白。 | | %h | 区域设置的月份缩写名称。 | | %H |小时(24 小时制) [0,23];个位数前面有 0。 | | %I | 小时(12 小时制) [1,12];个位数前面有 0。| | %j | 一年中某天的数字 [1,366];个位数前面有 0。 | | %k | 小时(24 小时制) [0,23];个位数前面有一个空白。 | | %l | 小时(12 小时制) [1,12];个位数前面有一个空白。 | | %m | 一年中的月份数 [1,12];个位数前面加一个 0。 | | %M |分钟 [00,59];前导 0 是允许的,但不是必需的。| | %n | 插入新行。 | | %p | 相当于语言环境的 a.m 或 p.m。 | | %r | 使用 %p 以 12 小时制格式表示的适当时间| | %S | 秒 [00,61];值的范围为 [00,61] 而非 [00,59],以允许偶尔出现闰秒和双闰秒。 | | %3 | 毫秒 [000,999];值的范围为 [000,999]。 | | %6 | 微秒 [000000,999999];值的范围是 [000000,999999]。 | | %9 | 纳秒 [000000000,999999999];值的范围为 [000000000,999999999]。 | | %t | 插入制表符。 | | %u | 以十进制数表示的星期几 [1,7]。1 代表 星期日,2 代表星期二,依此类推。| | %U | 以十进制数表示的一年中的星期数 [00,53],星期日是第 1 周的第一天。|

注意:

如果您指定的转换与上表中描述的任何转换或下一段中列出的任何修改的转换规范不对应,则行为未定义并返回 0。

%U%W 之间的差值(以及修改后的转化次数 %OU%OW 之间的差值)是指被认为是一周的第一天。第 1 周是 1 月份的第一周(对于 %U,从星期日开始,对于 %W,从星期一开始)。周数 0 包含一月份 %U%W 的第一个星期日或星期一之前的天数。

显示服务器日志

您可以配置 NSWL 功能以在控制台上显示服务器日志或将服务器日志重定向到 NetScaler 设备上的目录。

在控制台上显示日志的方法有两种(标准输出): 选项 1:显示控制台上的所有日志。 选项 2:在控制台上只显示选定的日志,筛选条件 logfilenameformatSTDOUT

在 NSWL 客户端系统上自定义日志记录