金桃吉 發表於 2025-7-17 09:16:33

执行shell 脚本将日志全部输出到文件的多种方法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">方法 1:直接重定向(推荐)</a></li><li><a href="#_label1">方法 2:追加模式(不覆盖旧日志)</a></li><li><a href="#_label2">方法 3:使用 tee 命令(同时输出到屏幕和文件)</a></li><li><a href="#_label3">方法 4:在脚本内部重定向</a></li><li><a href="#_label4">方法 5:使用 logger 写入系统日志</a></li><li><a href="#_label5">最佳实践</a></li><li><a href="#_label6">验证日志是否生效</a></li><li><a href="#_label7">总结</a></li></ul></div><p>在执行 Shell 脚本时,如果需要将 所有输出(包括标准输出 <code>stdout</code> 和错误输出 <code>stderr</code>) 重定向到日志文件,可以使用以下方法:</p>
<p class="maodian"><a name="_label0"></a></p><h2>方法 1:直接重定向(推荐)</h2>
<div class="jb51code"><pre class="brush:bash;">/appdata/mysql_backup_dump.sh &gt; /var/log/mysql_backup.log 2&gt;&amp;1</pre></div>
<ul><li><strong><code>&gt;</code></strong>:将标准输出(<code>stdout</code>)重定向到 <code>/var/log/mysql_backup.log</code>。</li><li><strong><code>2&gt;&amp;1</code></strong>:将错误输出(<code>stderr</code>)合并到标准输出(即也写入日志文件)。</li><li><strong>效果</strong>:所有输出(包括 <code>echo</code>、<code>mysqldump</code> 正常信息、错误信息)都会写入日志文件。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>方法 2:追加模式(不覆盖旧日志)</h2>
<div class="jb51code"><pre class="brush:bash;">/appdata/mysql_backup_dump.sh &gt;&gt; /var/log/mysql_backup.log 2&gt;&amp;1</pre></div>
<ul><li><strong><code>&gt;&gt;</code></strong>:追加到日志文件(而不是覆盖),适合长期运行的备份任务。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>方法 3:使用 tee 命令(同时输出到屏幕和文件)</h2>
<div class="jb51code"><pre class="brush:bash;">/appdata/mysql_backup_dump.sh 2&gt;&amp;1 | tee -a /var/log/mysql_backup.log</pre></div>
<ul><li><code>tee -a</code>:将输出 同时显示在终端 并 追加到日志文件(<code>-a</code> 表示追加)。</li><li><strong>适用场景</strong>:调试时想实时查看输出,同时保留日志。</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>方法 4:在脚本内部重定向</h2>
<p>如果脚本是自己编写的,可以在脚本开头指定日志文件:</p>
<div class="jb51code"><pre class="brush:bash;">#!/bin/bash
exec &gt; /var/log/mysql_backup.log 2&gt;&amp;1# 所有后续输出都重定向到日志
echo "Backup started at $(date)"
# 备份命令(如 mysqldump)</pre></div>
<ul><li><code>exec</code>:重定向整个脚本的输出,包括后续所有命令。</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>方法 5:使用 logger 写入系统日志</h2>
<p>如果希望日志进入系统日志(如 <code>/var/log/syslog</code> 或 <code>/var/log/messages</code>):</p>
<div class="jb51code"><pre class="brush:bash;">/appdata/mysql_backup_dump.sh &gt; /tmp/backup.log 2&gt;&amp;1
logger -t "MySQL_BACKUP" -f /tmp/backup.log# 写入系统日志
rm -f /tmp/backup.log# 可选:删除临时日志文件</pre></div>
<ul><li><code>logger -t &quot;TAG&quot;</code>:给日志添加标签(方便过滤)。</li><li><code>-f</code>:指定日志文件路径。</li></ul>
<p class="maodian"><a name="_label5"></a></p><h2>最佳实践</h2>
<ol><li><strong>推荐方法 1 或 2</strong>(简单可靠)。</li><li><strong>日志轮转</strong>:使用 <code>logrotate</code> 管理日志文件,避免日志过大:<div class="jb51code"><pre class="brush:bash;"># /etc/logrotate.d/mysql_backup
/var/log/mysql_backup.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
}</pre></div></li><li><strong>在 cron 中记录日志</strong>:<div class="jb51code"><pre class="brush:bash;">0 2 * * * /appdata/mysql_backup_dump.sh &gt; /var/log/mysql_backup.log 2&gt;&amp;1</pre></div></li></ol>
<p class="maodian"><a name="_label6"></a></p><h2>验证日志是否生效</h2>
<div class="jb51code"><pre class="brush:bash;">tail -f /var/log/mysql_backup.log# 实时查看日志</pre></div>
<p>或手动运行脚本并检查日志:</p>
<div class="jb51code"><pre class="brush:bash;">/appdata/mysql_backup_dump.sh &gt; /var/log/mysql_backup.log 2&gt;&amp;1
cat /var/log/mysql_backup.log</pre></div>
<p class="maodian"><a name="_label7"></a></p><h2>总结</h2>
<table><thead><tr><th>方法</th><th>命令</th><th>特点</th></tr></thead><tbody><tr><td><strong>覆盖日志</strong></td><td><code>&gt; log 2&gt;&amp;1</code></td><td>每次运行覆盖旧日志</td></tr><tr><td><strong>追加日志</strong></td><td><code>&gt;&gt; log 2&gt;&amp;1</code></td><td>保留历史日志</td></tr><tr><td><strong>屏幕+文件</strong></td><td><code>2&gt;&amp;1 | tee -a log</code></td><td>调试时使用</td></tr><tr><td><strong>脚本内重定向</strong></td><td><code>exec &gt; log 2&gt;&amp;1</code></td><td>整个脚本生效</td></tr><tr><td><strong>系统日志</strong></td><td><code>logger -t TAG -f log</code></td><td>集成到系统日志</td></tr></tbody></table>
<p>选择最适合你的方式即可!</p>
頁: [1]
查看完整版本: 执行shell 脚本将日志全部输出到文件的多种方法