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
Copy to Clipboard Toggle word wrap

以这种方式运行 ds-logpipe.py 具有实施简单且不需要任何目录服务器配置更改的优势。这对快速调试或监控非常有用,特别是当您查找特定类型的事件时。

如果 Directory 服务器实例会频繁或永久使用命名管道而不是真实的文件进行日志记录,则可以重新配置实例以创建名为 pipe 并使用它来记录(因为默认情况下为日志文件)。

需要为实例配置日志配置三个内容:

  • 要使用的日志文件必须改为 pipe (nsslapd channellog ),其中 * 可以访问、错误或审核[2],具体取决于所配置的日志类型。)
  • 应禁用缓冲,因为脚本已经缓冲了日志条目(nsslapdimmutablelog-logbuffering)
  • 日志轮转应禁用,以便服务器不会尝试轮转命名管道(nsslapdimmutablelog-maxlogsperdir,nsslapd channellog-logexpirationtime, 和 nsslapdmechanismlog-logrotationtime)

这些配置更改可以在 Directory Server 控制台中或使用 ldapmodify 进行。

例如,这会将访问日志切换到 access.pipe

# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=config
changetype: modify
replace: nsslapd-accesslog
nsslapd-accesslog: /var/log/dirsrv/slapd-instance/access.pipe
-
replace: nsslapd-accesslog-logbuffering
nsslapd-accesslog-logbuffering: off
-
replace: nsslapd-accesslog-maxlogsperdir
nsslapd-accesslog-maxlogsperdir: 1
-
replace: nsslapd-accesslog-logexpirationtime
nsslapd-accesslog-logexpirationtime: -1
-
replace: nsslapd-accesslog-logrotationtime
nsslapd-accesslog-logrotationtime: -1
Copy to Clipboard Toggle word wrap
注意

进行这些更改会导致服务器关闭当前日志文件,并立即切换到命名管道。这对于调试正在运行的服务器以及特定消息的日志输出非常有用。

7.5.2. 从服务器开始命名的管道

可以通过编辑实例的初始化脚本配置文件,启动和关闭指定管道与目录服务器实例。

注意

在服务器启动时,必须将指定管道脚本在实例的 dse.ldif 文件中特别配置。

  1. 打开服务器系统的实例配置文件。

    /etc/sysconfig/dirsrv-instance_name
    Copy to Clipboard Toggle word wrap
    警告

    不要编辑 /etc/sysconfig/dirsrv 文件。

  2. 在文件的末尾,会出现如下行:

    # Put custom instance specific settings below here.
    Copy to Clipboard Toggle word wrap

    在该行中,插入 ds-logpipe.py 命令,以在服务器启动时启动。例如:

    # 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 Toggle word wrap
    注意

    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
Copy to Clipboard Toggle word wrap

如果为同一参数传递了多个值,则它们会被转换为插件字典中的值列表。例如,此脚本为 arg1 提供了两个值:

--plugin=/path/to/pluginname.py pluginname.arg1=foo pluginname.arg1=bar pluginname.arg2=baz
Copy to Clipboard Toggle word wrap

在插件中,这转换为:

{'arg1': ['foo', 'bar'],
 'arg2': 'baz'}
Copy to Clipboard Toggle word wrap

这是一个带两个键的 Python dict 对象。第一个键是字符串 arg1,其值是一个 Python 列表对象,它有两个元素(字符串 foobar )。第二个键是字符串 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

def pre(myargs):
    retval = True
    myarg = myargs['argname']
    if isinstance(myarg, list): # handle list of values
    else: # handle single value
    if bad_problem:
        retval = False
    return retval

def plugin(line):
    retval = True
    # do something with line
    if something_is_bogus:
        retval = False
    return retval

def post(): # no arguments
    # do something
    # no return value
Copy to Clipboard Toggle word wrap


[1] 当访问日志中禁用了日志缓冲、错误日志中或审计日志记录时,服务器性能会出现。
[2] 默认情况下不启用审计日志,因此必须先启用此日志,然后才能使用命名管道替换它。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat