7.5. 使用命名的 Pipe 替换日志文件
许多管理员希望执行一些使用日志数据的特殊配置或操作,例如将访问日志配置为仅记录某些事件。无法使用标准目录服务器日志文件配置文件配置属性,可以将日志数据发送到命名管道,然后使用另一个脚本处理数据。为日志使用命名管道简化了这些特殊任务,如下所示:
- 记录某些事件,如失败的绑定尝试或来自特定用户或 IP 地址的连接
- 与特定正则表达式模式匹配的日志条目
- 将日志保持在一定长度(只记录最后的行数)
- 当发生事件时,发送通知,如电子邮件
使用管道替换日志文件可提高性能,特别是对于具有高操作率的服务器。
命名管道不同于使用脚本从日志缓冲中提取数据,因为数据在日志缓冲区中如何处理。
如果日志被缓冲,服务器性能良好,但重要的数据不会在事件发生后立即写入磁盘(日志文件)。如果服务器崩溃问题,则可能会在数据写入磁盘之前崩溃 - 且没有要提取的脚本的数据。
如果没有缓冲日志[1],写入会在每次操作时刷新到磁盘,从而导致大量磁盘 I/O 和性能下降。
使用管道替换日志磁盘文件具有缓冲区的好处,因为从管道读取的脚本可以在内存中缓冲传入的日志数据(无法通过简单的脚本)。
第 9.4 节 “ds-logpipe.py” 中介绍了脚本的使用和选项详情。基本格式为: ds-logpipe.py
/path/to/named_pipe--userpipe_user--maxlinesnumber--serverpidfilefile.pid--serverpidPID--servertimeoutseconds--plugin=/path/to/plugin.pypluginfile.arg=value
7.5.1. 使用 Named Pipe 进行日志记录 复制链接链接已复制到粘贴板!
目录服务器实例只需通过运行命名的 pipe 日志脚本并提供管道名称即可将命名管道用于其日志记录。(如果服务器已在运行,则必须重新打开日志,但不需要配置。)
ds-logpipe.py /var/log/dirsrv/slapd-example/access
# ds-logpipe.py /var/log/dirsrv/slapd-example/access
以这种方式运行 ds-logpipe.py
具有实施简单且不需要任何目录服务器配置更改的优势。这对快速调试或监控非常有用,特别是当您查找特定类型的事件时。
如果 Directory 服务器实例会频繁或永久使用命名管道而不是真实的文件进行日志记录,则可以重新配置实例以创建名为 pipe 并使用它来记录(因为默认情况下为日志文件)。
需要为实例配置日志配置三个内容:
-
要使用的日志文件必须改为 pipe (
nsslapd channellog
),其中 * 可以访问、错误或审核[2],具体取决于所配置的日志类型。) -
应禁用缓冲,因为脚本已经缓冲了日志条目(
nsslapdimmutablelog-logbuffering
) -
日志轮转应禁用,以便服务器不会尝试轮转命名管道(
nsslapdimmutablelog-maxlogsperdir
,nsslapd channellog-logexpirationtime
, 和nsslapdmechanismlog-logrotationtime
)
这些配置更改可以在 Directory Server 控制台中或使用 ldapmodify
进行。
例如,这会将访问日志切换到 access.pipe
:
进行这些更改会导致服务器关闭当前日志文件,并立即切换到命名管道。这对于调试正在运行的服务器以及特定消息的日志输出非常有用。
7.5.2. 从服务器开始命名的管道 复制链接链接已复制到粘贴板!
可以通过编辑实例的初始化脚本配置文件,启动和关闭指定管道与目录服务器实例。
在服务器启动时,必须将指定管道脚本在实例的 dse.ldif
文件中特别配置。
打开服务器系统的实例配置文件。
/etc/sysconfig/dirsrv-instance_name
/etc/sysconfig/dirsrv-instance_name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告不要编辑
/etc/sysconfig/dirsrv
文件。在文件的末尾,会出现如下行:
Put custom instance specific settings below here.
# Put custom instance specific settings below here.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在该行中,插入
ds-logpipe.py
命令,以在服务器启动时启动。例如:only keep the last 1000 lines of the error log only log failed binds
# only keep the last 1000 lines of the error log python /usr/bin/ds-logpipe.py /var/log/dirsrv/slapd-example/errors.pipe -m 1000 -u dirsrv -s /var/run/dirsrv/slapd-example.pid > /var/log/dirsrv/slapd-example/errors & # only log failed binds python /usr/bin/ds-logpipe.py /var/log/dirsrv/slapd-example/access.pipe -u dirsrv -s /var/run/dirsrv/slapd-example.pid --plugin=/usr/share/dirsrv/data/failedbinds.py failedbinds.logfile=/var/log/dirsrv/slapd-example/access.failedbinds &
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意s
选项都指定服务器将 PID 写入的 .pid 文件,并将脚本设置为在服务器进程中启动和停止。
7.5.3. 在 Named Pipe Log 中使用插件 复制链接链接已复制到粘贴板!
可以调用插件,从命名管道读取日志数据,并对其执行一些操作。使用带有命名 pipe 日志脚本的插件有一些注意事项:
- 对于从命名管道读取的每行,都会调用插件功能。
-
插件功能必须是 Python 脚本,必须以
.py
结尾。 - 任何插件参数都会在命令行中传递给命名的 pipe 日志脚本。
- 在加载插件时,可以指定 pre-operation 功能。
- 当脚本退出时,可以调用 post-operation 功能。
7.5.3.1. 使用命名的 Pipe Log Script 加载插件 复制链接链接已复制到粘贴板!
ds-logpipe.py
有两个选项,用于插件:
-
-
plugin
选项提供插件文件的路径(必须是 Python 脚本,且必须以.py
结尾)。 -
plugin.arg 选项将插件参数传递给命名的 pipe 日志脚本。插件文件名(不包括
.py
扩展名)是 插件,该插件中允许的任何参数都可以是 arg。
例如:
ds-logpipe.py /var/log/dirsrc/slapd-example/errors.pipe --plugin=/usr/share/dirsrv/data/example-funct.py example-funct.regex="warning" > warnings.txt
ds-logpipe.py /var/log/dirsrc/slapd-example/errors.pipe --plugin=/usr/share/dirsrv/data/example-funct.py example-funct.regex="warning" > warnings.txt
如果为同一参数传递了多个值,则它们会被转换为插件字典中的值列表。例如,此脚本为 arg1
提供了两个值:
--plugin=/path/to/pluginname.py pluginname.arg1=foo pluginname.arg1=bar pluginname.arg2=baz
--plugin=/path/to/pluginname.py pluginname.arg1=foo pluginname.arg1=bar pluginname.arg2=baz
在插件中,这转换为:
{'arg1': ['foo', 'bar'], 'arg2': 'baz'}
{'arg1': ['foo', 'bar'],
'arg2': 'baz'}
这是一个带两个键的 Python dict
对象。第一个键是字符串 arg1
,其值是一个 Python 列表对象,它有两个元素(字符串 foo
和 bar
)。第二个键是字符串 arg2
,其值是字符串 baz
。如果参数只有一个值,它将保留为简单字符串。单个参数名称的多个值转换为字符串列表。
7.5.3.2. 编写插件以用于命名的 Pipe Log Script 复制链接链接已复制到粘贴板!
ds-logpipe.py
命令需要在任何插件中有三个功能: 插件()、
pre ()
和 post
()。
任何与 ds-logpipe.py
命令一起使用的插件都必须指定 插件
功能。
插件()
功能针对日志数据中的每一行执行,而 pre ()
和 post ()
函数则分别在脚本启动和停止时运行。
每个函数都可以为其定义任何参数,然后使用 plugin.arg 选项传递给脚本。另外,每个函数都可以具有自己定义的返回值和操作。
例 7.8. 简单命名的 Pipe Log Plug-in