有组织地登录 Bash

Posted

技术标签:

【中文标题】有组织地登录 Bash【英文标题】:Organized logging in Bash 【发布时间】:2013-06-27 19:41:20 【问题描述】:

我有这个脚本可以删除 7 天或更早的文件,然后将它们记录到一个文件夹中。它会正确记录并删除所有内容,但是当我打开日志文件进行查看时,它非常草率。

log=$HOME/Deleted/$(date) 
find $HOME/OldLogFiles/ -type f -mtime +7 -delete -print > "$log"

日志文件难以阅读

示例文件输出:(在记事本中打开时)

/home/u0146121/OldLogFiles/file1.txt/home/u0146121/OldLogFiles/file2.txt/home/u0146121/OldLogFiles/file3.txt

有没有更好更干净的记录文件?可能是文件名、删除日期以及它的年龄?

【问题讨论】:

如果你用记事本以外的方式打开它会发生什么?例如。如果你只是做head $log,它显示正常吗? 参见:github.com/codeforester/base/blob/master/lib/stdlib.sh - 它只是实现了日志记录的基础。日志文件管理逻辑需要自己搞清楚。 【参考方案1】:

试试 日志=$HOME/已删除/$(日期); # 将其更改为 echo -e 并在需要时插入新行 找到 $HOME/OldLogFiles/ -type f -mtime +7 -exec echo \; > "$log"

【讨论】:

【参考方案2】:

使用logger 进行日志记录,并将实际的日志处理留给sysloglogrotate

【讨论】:

这样更容易吗?您将如何开始? 手册页将是一个好的开始。有关 syslog 及其设施的一般介绍,请参阅 here,有关一些 logrotate 示例,请参阅 here。【参考方案3】:

在删除脚本中,您可以在顶部添加 2 个变量,我们称它们为“timeDate”和“logDestination”。它们看起来像这样:

timeDate=$(date "+%d/%m/%Y %T")                         
logDestination=/home/$USER/.deleteLog; touch $logDestination

现在 $(date "+%d/%m/%Y %T") 部分只是获取当前日期和时间。它关闭以获取系统日期;日期 (+%d) 然后月份和年份 (%m) (%Y) b.t.w 大写 Y 返回全年,如 YYYY。然后它将日期和时间存储在变量中以供以后使用。

logDestination 变量为我们保存一个目录或文件路径,指向一个名为 .deleteLog 的文件。现在后面的触摸部分不是完全必要的,但如果文件不存在或被意外删除或重命名,它将使文件存在。

在 bash 脚本和许多编程语言中,人们会创建方法或函数,它们只是通常只完成一项工作的简单代码段。下面的这个函数旨在将消息写入日志文件:

##  Logging function
function _logger () 
        echo -e "$timeDate $user - $@\r" >> $log
 

该功能的简单解释是它能够接收某种形式的信息。如果您查看上面的函数,请注意“$@”符号,如果您愿意,这是一个占位符,它将放置您指向该函数的所有字符串(文本)。这是一个可以接收多个字符串或输入的函数的更精简版本:

function _example () 
    echo -e "$@"

要调用这个函数并给它一个消息,我们可以直接输入(脚本中函数下的任何位置):

example "hello"

这个字符串“hello”被赋予函数,函数中的 echo 行将“hello”输出到您的终端或屏幕。 echo 行中的 -e 有助于 echo 区分活动部分,最好使用“man echo”来让您了解它的行为修改。

回到你的脚本。

假设您有一个删除目录内容的行(我建议小心谨慎,不鼓励这样的行,但是嗯)。

删除后你可以调用;

_logger "deletion of file (or  $FILE) successful."

_logger 函数会很好地为您放置日期时间、消息并开始一个新行 (\r)。函数中的 $user 由您当前的视图放置。因为它会说你的用户名。

函数可以多次调用,节省代码重复,让脚本看起来更整洁。

【讨论】:

我不建议使用系统日期提取来命名您的日志文件。 UTC 日期更改 造成的可怕混乱。 *颤抖 这看起来很酷,但我不完全理解它。我是Shell 编程的初学者。基本上我的脚本是一个简单的清理记录删除的文件。 我已修改我的答案以更具描述性。您最简单的解决方法是添加 \r 以使日志文件将每个日志输入放在一个新行上。 什么是古怪的日期格式?我可以建议您在出现此类情况时建议 ISO8601 吗?标准对每个人都有帮助。【参考方案4】:

你在这里问了一些事情......

为什么我的日志文件在记事本中看起来很奇怪?

可能是因为您用于查看它的工具,但如果没有更多信息,很难说。记事本是一个 Windows 应用程序,Windows 使用一种不同于 unix 的策略来结束文本文件中的行。如果您想确切知道,请使用hexdumpod 之类的工具来查看您的文件中真正发生了什么。正如 cmets 中所建议的那样,unix 主机上的head filename.log 可能会向您展示您的期望,在这种情况下,您将确认行尾理论。

如果记事本是您的首选工具,那么我们可以向您展示如何转换文件以使其与 Windows 更兼容。否则,请告诉我们您真正需要什么。

如何在我的日志中包含额外数据?

您要几件商品:

文件名 - 很简单,你已经知道了。 删除日期 - 很简单,您只需要每个条目的时间戳。 文件的年龄 - 更难。文件的时间戳是否足够,或者您是否想要从文件本身的第一行提取的日期?如果是后者,您需要在问题中包含一个示例。我暂时选择前者。

首先,bash 版本 4 及更高版本允许您将时间格式用作 printf 的一部分,因此您可以执行以下操作:

printf -v log '%s/Deleted/%(%F)T' "$HOME"

但老实说,我认为这是一个 hack,而您真正想要的是使用其他工具旋转的单个文本文件。

log=/var/log/whatever.log

“其他工具”取决于您的操作系统。在 FreeBSD 中,查看 /etc/newsyslog.conf。在 Linux 中,请参阅您的发行版的文档,查找“logrotate”之类的内容。

find 命令的输出可以是已成功删除的文件,但您不必只需 个文件名。考虑以下几点:

find "$HOME/OldLogFiles/" -type f -mtime +7 -ls -delete

这个输出是整个ls 行,之前文件被删除。它包括文件的日期和 inode 编号。以时间戳开头,您可能会很高兴:

find "$HOME/OldLogFiles/" -type f -mtime +7 -ls -delete | sed "s/^/[$(printf '%(%F %T)T')] /"

或者,如果您更喜欢不使用 sed:

while read line; do
    printf '[%(%F %T)T] %s\n' -1 "$line"
done < <(find "$HOME/OldLogFiles/" -type f -mtime +7 -ls -delete)

在这个版本中,-1 被 printf 的 %T 解释为“现在”。

根据需要重定向到$log

最后,这可能是“最佳”选项,避免完全在 bash 中管理日志文件,而是使用系统的 logger 命令。 POSIX version 非常简单,但您可以在 BSD、Linux 等中控制系统日志样式。

【讨论】:

以上是关于有组织地登录 Bash的主要内容,如果未能解决你的问题,请参考以下文章

bash的登录与登录成功显示信息对的修改

解决llinux登录显示bash-4.2问题

用户登录时显示 -bash-4.2$ 问题

登录linux,提示:/bin/bash: Permission denied 。登录不成功。这个要怎么办啊??

基于 SAML 2.0 的跨域单点登录 - 概念

与其他组织启用单点登录的流程是啥?