在Linux系统中进行批处理(batch)作业时,有多种方法可以实现日志记录。以下是几种常用的方法:
最简单的方法是将输出重定向到文件:
#!/bin/bash
/path/to/your/script.sh > /var/log/script.log 2>&1
>
重定向标准输出2>&1
将标准错误也重定向到标准输出如果需要同时查看输出和记录日志:
#!/bin/bash
/path/to/your/script.sh | tee /var/log/script.log
要同时记录标准错误:
#!/bin/bash
/path/to/your/script.sh 2>&1 | tee /var/log/script.log
将日志发送到系统日志(syslog):
#!/bin/bash
/path/to/your/script.sh 2>&1 | logger -t script_name
更复杂的日志记录方案:
#!/bin/bash
LOG_FILE="/var/log/script_$(date +%Y%m%d).log"
MAX_LOG_SIZE=10485760 # 10MB
MAX_LOG_FILES=5
# 检查并轮转日志
if [ -f "$LOG_FILE" ]; then
current_size=$(stat -c%s "$LOG_FILE")
if [ "$current_size" -ge "$MAX_LOG_SIZE" ]; then
# 轮转日志
for i in $(seq $MAX_LOG_FILES -1 2); do
if [ -f "${LOG_FILE}.$((i-1))" ]; then
mv "${LOG_FILE}.$((i-1))" "${LOG_FILE}.$i"
fi
done
mv "$LOG_FILE" "${LOG_FILE}.1"
fi
fi
# 执行脚本并记录日志
{
echo "=== 脚本开始于 $(date) ==="
/path/to/your/script.sh
echo "=== 脚本结束于 $(date) ==="
echo "退出状态码: $?"
} >> "$LOG_FILE" 2>&1
创建/etc/logrotate.d/your_script配置文件:
/var/log/script.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd >/dev/null 2>&1 || true
endscript
}
在脚本内部实现日志记录:
#!/bin/bash
# 日志函数
log() {
local log_level=$1
local message=$2
local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
echo "[${timestamp}] [${log_level}] ${message}" >> /var/log/script.log
}
# 使用示例
log "INFO" "脚本开始执行"
# 你的代码
if [ ! -f "/path/to/file" ]; then
log "ERROR" "文件不存在: /path/to/file"
exit 1
fi
log "INFO" "脚本执行完成"
选择哪种方法取决于你的具体需求,简单的重定向通常就足够了,而复杂的应用可能需要更全面的日志解决方案。