简短的“官方”回答是,不幸的是,你不能。
但是,在大多数情况下(例如,在许多 Linux 发行版上),您可能很幸运拥有一个logger
既支持该--no-act
选项,又自己实现一些消息格式的实现(见下文),在这种情况下,您可以使用 (中等丑陋)这样的命令来放置a)格式正确的消息,b)到文件中,c)不污染系统日志:
logger --no-act -s "Oh dear..." 2>&1 | sed 's/^<[0-9]\+>//' >> /tmp/my.log
(向@BasileStarynkevitch 和@Kieveli 大声喊叫,他们之前都提到了其中的一部分,而不是整个故事。)
笔记:
1)为了匹配通常的日志文件格式,我不得不“删除”在我的 Debian 机器上输出的<PRIVAL>
字段(PRIVAL
= FACILITY
* 8 + )。PRIORITY
你的旅费可能会改变。
2) POSIX 本身并没有定义logger
命令应该如何处理(任何)它的选项。例如,GNU 记录器根本不支持--no-act
。此外,在 2 年前发布此答案的原始版本时,-s
在我的系统上没有对打印输出进行任何格式化,它只是单独回显原始消息,使其完全无用。(我当时没有使用 Systemd,这可能解释了差异,在 logger 源代码中看到了各种与 Systemd 相关的条件调用,但这只是模糊的猜测。)
logger
3)对于这个微不足道的用例,该命令如此“历史上不友好”的最可能原因是它只是系统记录器的一个相当简单的前端。这意味着您提供给它的任何东西基本上都会直接通过syslogd
(或systemd-journald
等),而后者又会进行各种其他进一步的处理和分派(到各种出口:本地和远程的文件、套接字等) ,以及桥接权限级别(因此在您的示例中,您仍然可以登录syslog
或user.log
,例如,即使您可能无权直接写入这些文件)。
为了logger
能够直接正确地记录到文件中,它要么必须(重新)实现系统记录器的一些职责,要么将syslog()
std. 库函数,或者它不会比一个微不足道的 echo one-liner 更有能力(也许比上面的logger
调用更简单!;))。无论哪种方式,这似乎都是个坏主意。
更好的解决方案可能是 POSIX 接口(logger、syslog())有一种方法可以在消息中指定一个 ad-hoc 出口/设施参数(如文件名),这样就可以在不重新配置系统的情况下登录到自定义文件(普通用户无论如何都无权这样做)。
然而,由于缺乏更好的东西,“规范的”Linuxlogger
实现实际上似乎复制了一些 syslog 功能,所以我们大多数人都可以免费享受这种奢侈。;)