🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 23.3\. 日志文件维护 把数据库服务器的日志输出保存在一个地方而不是仅仅把它们放到`/dev/null`里是个好主意。 在碰到危险的时候,日志输出是非常宝贵的。不过, 日志输出可能很庞大(特别是在比较高的调试级别上), 而且你不会无休止地保存它们。你需要_滚动_日志文件, 这样生成新的日志文件并且经常抛弃老的。 如果你简单地把`postgres`的stderr重定向到一个文件中, 你会有日志输出,但是截断日志文件的唯一的方法是停止并重启主服务器。 这样做对于PostgreSQL开发环境中是可以的, 但是你肯定不想在生产环境中也这么干。 一个更好的办法是把主服务器的stderr输出发送到某种日志滚动程序里。 我们有一个内置的日志滚动程序,你可以通过在`postgresql.conf` 里设置配置参数`logging_collector`为`true`的办法打开它。 这个程序的控制参数在[Section 18.8.1](#calibre_link-1421)里描述。 你也可以使用这个方法捕获机器上可读CSV(逗号分隔值)格式的日志数据。 另外,如果你准备使用其他服务器软件,你可能更喜欢 使用一个外部日志滚动程序(比如 PostgreSQL中 Apache附带的rotatelogs工具),为了做到这一点, 你可以将stderr的输出重定向到所需程序。如果你用`pg_ctl`启动服务器, 那么stderr已经重定向到stdout,因此你只需要一个管道命令,比如: ``` pg_ctl start | rotatelogs /var/log/pgsql_log 86400 ``` 另外一种生产级的管理日志输出的方法就是把它们发送给syslog并且让syslog 处理滚动。要利用这个工具,我们需要设置`postgresql.conf`里的`log_destination`为 `syslog`(记录syslog日志)。 然后在你想强迫syslog守护进程开始写入一个新日志文件的时候, 就可以发送一个`SIGHUP`信号给它。如果你想自动滚动日志文件,那么我们可以配置 logrotate程序处理syslog的日志文件。 不过,在很多系统上,syslog不是非常可靠,特别是在大型日志信息的情况下; 它可能在你最需要那些信息的时候截断或者丢弃它们。还有,在Linux上, syslog会把每个消息刷新到磁盘上,导致很低下的性能。 你可以在syslog配置文件里面的文件名开头使用"`-`"来关闭这个行为。 请注意上面描述的所有解决方案关注的是在可配置的间隔上开始一个新的日志文件, 它们并没有删除不再需要的旧日志文件。你可能还需要设置一个批处理, 周期地删除旧日志文件。另外一个可能的解法是配置日志滚动程序, 让它周期地覆盖旧的日志文件。 [pgBadger](http://dalibo.github.io/pgbadger/) 是一个外部项目,做复杂的日志文件分析。 当重要信息出现在日志文件中时,[check_postgres](http://bucardo.org/wiki/Check_postgres) 提供了Nagios警告,以及许多其他特殊条件的检测。