在Bash中有组织地登录
我有一个脚本,可以删除7天或更久的文件,然后将它们记录到一个文件夹中。它正确地记录和删除了所有内容,但是当我打开日志文件查看时,它非常草率在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
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更兼容。否则,请告诉我们您真正需要什么
如何在日志中包含这些额外数据?
您要的是一些物品:
- 文件名-很简单,你已经知道了
- 删除日期-很简单,您只需要为每个条目添加一个时间戳
- 文件时代-更难。文件的时间戳是否足够,或者您是否希望,例如,从文件本身的第一行提取的日期?如果是后者,你需要在问题中加入一个样本。我现在就选择前者
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编程的初学者。本质上,我的脚本是一个简单的日志清理