簡體   English   中英

如何使用 logger 命令登錄到 linux 中的特定文件?

[英]How can I log to a specific file in linux using logger command?

我將運行以下腳本:

#!/bin/bash
./myprogram

#get exit code
exitvalue=$?

#log exit code value to /var/log/messages
logger -s "exit code of my program is " $exitvalue

但是我不希望將日志消息寫入/var/log/messages因為我沒有 root 權限。 相反,我希望將其寫入主目錄中的文件: /home/myuser/mylog

我應該如何修改上面的logger命令?

我不認為你真的需要(或想要)為此涉及logger / syslog 只需將腳本的最后一行替換為:

echo "Exit code of my program is $exitvalue" >> /some/file/that/you/can/write/to

如果您想使用logger以便消息同時出現在系統日志和您的某些文件中,您可以這樣做

  logger -s your message 2> $HOME/somefile

因為logger-s選項也在stderr輸出,它被重定向到帶有2>的文件

您可能想要使用2>> $HOME/somefile來附加(而不是覆蓋)您的$HOME/somefile (閱讀有關bash重定向的信息),並且(有關詳細信息,請參閱logger(1) )您可能更喜歡傳遞程序選項--id=$$logger

簡短的“官方”答案是,不幸的是,你不能。

但是,在大多數情況下(例如在許多 Linux 發行版上),您可能只是幸運地擁有一個既支持--no-act選項又自己實現一些消息格式的logger實現(見下文),其中如果您可以使用這樣的(中等丑陋的)命令來放置 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,這可能可以解釋差異,在記錄器源代碼中看到各種與 Systemd 相關的條件調用,但這只是模糊的猜測。)

3) 對於這個微不足道的用例, logger命令如此“歷史上不友好”的最可能原因是它只是系統記錄器的一個相當簡單的前端。 這意味着您提供給它的任何內容基本上都會直接通過syslogd (或systemd-journald等),然后進行各種其他進一步處理和分派(到各種出口:文件、套接字等,兩者都本地和遠程),以及橋接權限級別(因此在您的示例中,您仍然可以登錄到sysloguser.log ,例如,即使您可能沒有直接寫入這些文件的權限)。

為了讓logger能夠直接正確地記錄到文件,它必須(重新)實現系統記錄器的一些職責,以及syslog()標准。 庫函數,或者它不會比一個簡單的 echo one-liner 更強大(可能比上面的logger調用更簡單!;))。 無論哪種方式,這似乎都是一個壞主意。

一個更好的解決方案可能是,如果 POSIX 接口( loggersyslog() )有一種方法可以指定一個 ad-hoc 插座/設施參數(如文件名)以及消息,這樣就可以在不重新配置系統的情況下登錄到自定義文件(普通用戶無論如何都無權這樣做)。

然而,由於缺乏更好的東西,“規范的”Linux logger實現實際上似乎復制了一些 syslog 功能,所以我們大多數人可以免費享受這種奢侈。 ;)

我認為您更好的選擇是在您不想寫入 syslog 文件(並且沒有這樣做的權限)的情況下使用date命令而不是logger

有關如何使用date為消息添加日期前綴並將其寫入文件的詳細信息,請參閱“ 回聲之前的時間戳”。

您創建一個如下所示的 bash 函數,調整date格式字符串以獲得您想要的:

echo_time() {
    echo `date +'%b %e %R '` "$@"
}

在您的 bash 腳本中,您將使用:

echo_time "Your message here" >> ${LOGFILE}

這會將以下內容放入您的${LOGFILE}文件中:

Mar 11 08:40 your message here
$ man logger

Logger 為 syslog(3) 系統日志模塊提供了一個 shell 命令接口。

如果您希望將內容記錄到其他位置,則需要更改 syslog 配置。 例如,您可以建立一個在您的主目錄中具有輸出文件的特定設施 不過,您需要成為 root 用戶才能做到這一點。

您可以在腳本文件之上創建一個像這樣的小型記錄器函數:

#! /bin/bash

#LOG FILE location
log_file=/tmp/mylogfile.log

#the LOG function
LOG()
{
time=$(date '+%Y-%m-%d %H:%M:%S')
echo "$time"" >>> "$1 >>${log_file}
}


message= echo "test logger message"
#to send loggers to your log file use
LOG "my message logged to my log file with timestamp = ""$message" 

檢查輸出:

head -1 /tmp/mylogfile.log
2019-09-16 14:17:46 >>> my message logged to my log file with timestamp = test logger message

我可以使用cat -女巫回顯您的輸出然后>> [file]女巫將輸出打印到終端的[file]插圖中,因此命令將是

cat - >> [file]

不利的一面是你必須使用 ctrl+C 或 ctrl+Z 來退出logger更適合在線代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM