有没有办法更改 pkg 的日志记录位置?

Is there a way to change the logging location of a pkg?

我正在使用 pkgbuildproductbuild 构建安装程序。我希望能够在出现任何问题时从我的用户那里收集安装日志。如果这些日志不与他们安装的其他所有内容混合在一起就好了。

默认情况下,所有日志似乎都转到 /var/logs/install.log。有什么方法可以更改我的应用安装程序日志的这个位置吗?

有两种方法可以在 MAC OS X:

上以平面文件格式 (.pkg) 安装应用程序

图形界面

Installer.app(在 El Capitan 上它位于 /System/Library/CoreServices/Installer.app)是 GUI 安装程序方法,它似乎没有任何更改日志的选项,但它确实有查看日志选项(Command+L)

命令行

installer 是具有 -dumplog 的命令行,可用于将日志转储到可重定向到文件的标准输出。

 -dumplog
         Detailed log information is always sent to syslog using the LOG_INSTALL facility (and will wind up in /var/log/install.log).  -dumplog additionally writes this log to
         standard error output.

命令

installer -dumplog -pkg InstallMe.pkg -target / > install.log 2>&1

我最终通过将以下函数添加到我的安装后脚本的末尾来解决这个问题。它检测与当前安装相关的 install.log 的第一行,并将从该行到 install.log 末尾的所有内容复制到一个单独的文件中。

一个警告:如果同时进行多个安装,则可能会混入其他安装的日志。此解决方案只是捕获 install.log 的限时快照,但不会分离日志来自多个安装。

function export_log {
    NOW=`date "+%Y-%m-%d-%H-%M-%S"`
    LOG_NAME="install_log_$NOW.log"

    # Interactive install logs start with a line "<AppName> x.x.x Installation Log". Silent install logs start with a line 
    # "Product archive /path/to/pkg/folder".

    # Must include something like \d in this expression and the pkg filename, that won't match this line itself when it's printed in the log
    STARTING_LINE_OF_LAST_INSTALL=`egrep '(<AppName> \d+\.\d+\.\d+ Installation Log)|(Product archive.*path/to/pkg/folder/\d+.\d+\.\d+/)' /var/log/install.log | tail -n 1`

    # Copy the rest of the log from that line on, up to 10000 lines.
    fgrep --after-context=10000 "$STARTING_LINE_OF_LAST_INSTALL" /var/log/install.log > "$LOGGING_DIR/$LOG_NAME"
}