在Bash中有组织地登录

在Bash中有组织地登录,bash,logging,Bash,Logging,我有一个脚本,可以删除7天或更久的文件,然后将它们记录到一个文件夹中。它正确地记录和删除了所有内容,但是当我打开日志文件查看时,它非常草率 log=$HOME/Deleted/$(date) find $HOME/OldLogFiles/ -type f -mtime +7 -delete -print > "$log" 日志文件很难读取 文件输出示例:(在记事本中打开时) /home/u0146121/OldLogFiles/file1.txt/home/u0146121/OldLo

我有一个脚本,可以删除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

是否有更好、更干净的日志文件?可能是文件名、删除日期以及它的年代?

用于日志记录,将实际的日志处理留给和。

尝试
日志=$HOME/Deleted/$(日期)
#将其更改为echo-e,并在需要时插入新行

查找$HOME/OldLogFiles/-type f-mtime+7-exec echo{}\;>“$log”

在您的删除脚本中,您可以在顶部添加两个变量,让我们将它们称为“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 "$@"
}
要调用此函数并向其发送消息,我们可以直接键入(脚本中函数下的任意位置):

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

回到你的剧本

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

完成删除后,您可以调用

_logger "deletion of file (or  $FILE) successful."
并且_logger函数将很好地放置日期时间、消息,并为您开始一行新的内容(\r)。函数中的$user由当前视图放置。因为它会说你的用户名


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

您在这里提出了一些问题

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

可能是因为你正在使用的工具来查看它,但是没有更多的信息很难说。记事本是一个Windows应用程序,Windows使用比unix更好的策略来结束文本文件中的行。如果您想确切知道,请使用诸如
hextump
od
之类的工具查看文件中的实际情况。正如评论中所建议的那样,unix主机上的头文件名.log可能会向您显示您所期望的内容,在这种情况下,您将确认行尾理论

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

如何在日志中包含这些额外数据?

您要的是一些物品:

  • 文件名-很简单,你已经知道了
  • 删除日期-很简单,您只需要为每个条目添加一个时间戳
  • 文件时代-更难。文件的时间戳是否足够,或者您是否希望,例如,从文件本身的第一行提取的日期?如果是后者,你需要在问题中加入一个样本。我现在就选择前者
首先,bash版本4及更高版本允许您使用时间格式作为
printf
的一部分,因此您可以执行以下操作:

printf -v log '%s/Deleted/%(%F)T' "$HOME"
find "$HOME/OldLogFiles/" -type f -mtime +7 -ls -delete
但老实说,我认为这是一个黑客,你真正想要的是一个单一的文本文件,可以使用其他工具旋转

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

find
命令的输出可以是已成功删除的文件,但不必只有文件名。考虑以下事项:

printf -v log '%s/Deleted/%(%F)T' "$HOME"
find "$HOME/OldLogFiles/" -type f -mtime +7 -ls -delete
该文件的输出是删除文件之前的整个
ls
行。它包括文件的日期和索引节点号。在这之前加上一个时间戳,你就可以开始了:

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)
读行时
;做
printf'[%(%F%T)T]%s\n'-1“$line”

这样比较容易吗?您将如何开始?手册页将是一个良好的开端。有关syslog及其工具的一般介绍,以及一些logrotate示例,请参阅。如果在记事本以外的其他地方打开它,会发生什么情况?例如,如果您只是执行
head$log
,它是否正确显示?请参阅:-它只是实现了日志记录的基本原理。你需要自己弄清楚日志文件管理逻辑。我不建议用系统日期来命名日志文件。UTC日期更改会造成可怕的混乱*看起来很酷,但我不完全理解。。我是Shell编程的初学者。本质上,我的脚本是一个简单的日志清理