<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>wp-cli debugging Archives - WP-CLI Mastery</title>
	<atom:link href="https://wpclimastery.com/blog/tag/wp-cli-debugging/feed/" rel="self" type="application/rss+xml" />
	<link>https://wpclimastery.com/blog/tag/wp-cli-debugging/</link>
	<description>Automate WordPress Like a DevOps Pro.</description>
	<lastBuildDate>Mon, 24 Nov 2025 11:16:47 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://wpclimastery.com/wp-content/uploads/2025/11/cropped-favicon-32x32.webp</url>
	<title>wp-cli debugging Archives - WP-CLI Mastery</title>
	<link>https://wpclimastery.com/blog/tag/wp-cli-debugging/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Professional Logging and Debugging for WP-CLI Automation Scripts</title>
		<link>https://wpclimastery.com/blog/professional-logging-and-debugging-for-wp-cli-automation-scripts/</link>
		
		<dc:creator><![CDATA[Krasen]]></dc:creator>
		<pubDate>Sat, 10 Jan 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[Bash Scripting for WordPress]]></category>
		<category><![CDATA[bash debug mode]]></category>
		<category><![CDATA[bash logging]]></category>
		<category><![CDATA[script logging]]></category>
		<category><![CDATA[wordpress automation logging]]></category>
		<category><![CDATA[wp-cli debugging]]></category>
		<guid isPermaLink="false">https://wpclimastery.com/?p=165</guid>

					<description><![CDATA[<p>Your WordPress automation script fails at 3 AM, but you have no idea what went wrong—no logs, no error messages, no trace of what happened. Debugging production scripts without proper...</p>
<p>The post <a href="https://wpclimastery.com/blog/professional-logging-and-debugging-for-wp-cli-automation-scripts/">Professional Logging and Debugging for WP-CLI Automation Scripts</a> appeared first on <a href="https://wpclimastery.com">WP-CLI Mastery</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Your WordPress automation script fails at 3 AM, but you have no idea what went wrong—no logs, no error messages, no trace of what happened. Debugging production scripts without proper logging means guessing, recreating issues, and wasting hours troubleshooting.</p>



<p>Professional logging transforms opaque scripts into transparent, debuggable systems. Track every operation, capture errors with context, monitor script health, and diagnose failures instantly with comprehensive logs that tell the complete story.</p>



<p>In this guide, you’ll learn professional logging and debugging techniques for WP-CLI automation scripts, from basic logging to advanced monitoring systems used by DevOps teams managing critical WordPress infrastructure.</p>



<h3 class="wp-block-heading" id="why-logging">Why Logging Matters for Automation Scripts</h3>



<p><a href="https://www.gnu.org/software/bash/manual/bash.html#Redirections">Bash scripting without logging</a> is like driving blindfolded—you don’t know what’s happening until something crashes.</p>



<h4 class="wp-block-heading" id="problems-without-proper-logging">Problems Without Proper Logging</h4>



<p><strong>Silent failures</strong>: Scripts fail without leaving any trace of what went wrong.</p>



<p><strong>No audit trail</strong>: Can’t verify what scripts did or when they ran.</p>



<p><strong>Difficult debugging</strong>: Recreating issues requires guessing and trial-and-error.</p>



<p><strong>No monitoring</strong>: Can’t track script health or detect degrading performance.</p>



<p><strong>Compliance issues</strong>: Can’t prove what operations were performed when.</p>



<h4 class="wp-block-heading" id="professional-logging-benefits">Professional Logging Benefits</h4>



<p><strong>Instant diagnosis</strong>: Know exactly what failed and why from log messages.</p>



<p><strong>Complete audit trail</strong>: Track every operation for compliance and debugging.</p>



<p><strong>Proactive monitoring</strong>: Detect issues before they become critical failures.</p>



<p><strong>Performance tracking</strong>: Identify bottlenecks and optimization opportunities.</p>



<p><strong>Team collaboration</strong>: Share logs for troubleshooting across teams.</p>



<p>According to <a href="https://cloud.google.com/architecture/devops">DevOps best practices</a>, comprehensive logging reduces mean time to recovery (MTTR) by 80%.</p>



<h3 class="wp-block-heading" id="basic-logging">Basic Logging Implementation</h3>



<p>Start with fundamental logging patterns for WP-CLI scripts.</p>



<h4 class="wp-block-heading" id="simple-log-function">Simple Log Function</h4>



<div class="sourceCode" id="cb1">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true"></a><span class="co"># basic-logging.sh</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true"></a></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">"/var/log/wp-automation.log"</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true"></a></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true"></a><span class="fu">log()</span> <span class="kw">{</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"[</span><span class="va">$(</span><span class="fu">date</span> <span class="st">'+%Y-%m-%d %H:%M:%S'</span><span class="va">)</span><span class="st">] </span><span class="va">$@</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">tee</span> -a <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true"></a></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true"></a><span class="co"># Usage</span></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true"></a><span class="ex">log</span> <span class="st">"Script started"</span></span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true"></a><span class="ex">log</span> <span class="st">"Updating WordPress plugins..."</span></span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true"></a></span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true"></a><span class="ex">wp</span> plugin update --all</span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true"></a></span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="va">$?</span> <span class="ot">-eq</span> 0<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">"✓ Plugins updated successfully"</span></span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true"></a><span class="kw">else</span></span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">"✗ Plugin update failed"</span></span>
<span id="cb1-20"><a href="#cb1-20" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb1-21"><a href="#cb1-21" aria-hidden="true"></a></span>
<span id="cb1-22"><a href="#cb1-22" aria-hidden="true"></a><span class="ex">log</span> <span class="st">"Script completed"</span></span></code></pre>
</div>



<p><strong>Key Elements</strong>:</p>



<ul class="wp-block-list">
<li>Timestamp for every log entry</li>



<li><code>tee</code> outputs to both terminal and file</li>



<li>Exit codes checked and logged</li>
</ul>



<h4 class="wp-block-heading" id="logging-command-output">Logging Command Output</h4>



<div class="sourceCode" id="cb2">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true"></a></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">"/var/log/wp-updates.log"</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true"></a></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true"></a><span class="fu">log()</span> <span class="kw">{</span></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"[</span><span class="va">$(</span><span class="fu">date</span> <span class="st">'+%Y-%m-%d %H:%M:%S'</span><span class="va">)</span><span class="st">] </span><span class="va">$@</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">tee</span> -a <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true"></a></span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true"></a><span class="ex">log</span> <span class="st">"Starting WordPress update"</span></span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true"></a></span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true"></a><span class="co"># Capture command output and log it</span></span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true"></a><span class="va">OUTPUT=$(</span><span class="ex">wp</span> core update <span class="op">2&gt;&amp;1</span><span class="va">)</span></span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true"></a><span class="va">EXIT_CODE=$?</span></span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true"></a></span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"</span><span class="va">$OUTPUT</span><span class="st">"</span> <span class="op">&gt;&gt;</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true"></a></span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="va">$EXIT_CODE</span> <span class="ot">-eq</span> 0<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb2-18"><a href="#cb2-18" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">"✓ WordPress updated successfully"</span></span>
<span id="cb2-19"><a href="#cb2-19" aria-hidden="true"></a><span class="kw">else</span></span>
<span id="cb2-20"><a href="#cb2-20" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">"✗ WordPress update failed with exit code </span><span class="va">$EXIT_CODE</span><span class="st">"</span></span>
<span id="cb2-21"><a href="#cb2-21" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">"Output: </span><span class="va">$OUTPUT</span><span class="st">"</span></span>
<span id="cb2-22"><a href="#cb2-22" aria-hidden="true"></a><span class="kw">fi</span></span></code></pre>
</div>



<p>Learn about <a href="https://www.gnu.org/software/bash/manual/bash.html#Redirections">Bash redirection</a> for capturing output.</p>



<h3 class="wp-block-heading" id="log-levels">Log Levels and Structured Logging</h3>



<p>Implement professional log levels for better organization.</p>



<h4 class="wp-block-heading" id="multi-level-logging-system">Multi-Level Logging System</h4>



<div class="sourceCode" id="cb3">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true"></a><span class="co"># logging-levels.sh</span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true"></a></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">"/var/log/wp-automation.log"</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true"></a><span class="va">LOG_LEVEL=</span><span class="st">"</span><span class="va">${LOG_LEVEL:-</span>INFO<span class="va">}</span><span class="st">"</span>  # <span class="ex">Default</span> to INFO</span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true"></a></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true"></a><span class="co"># Log level hierarchy: DEBUG &lt; INFO &lt; WARN &lt; ERROR</span></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true"></a><span class="bu">declare</span> -A <span class="va">LOG_LEVELS=([DEBUG]=</span>0 <span class="va">[INFO]=</span>1 <span class="va">[WARN]=</span>2 <span class="va">[ERROR]=</span>3<span class="va">)</span></span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true"></a></span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true"></a><span class="fu">log()</span> <span class="kw">{</span></span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">level=</span><span class="st">"</span><span class="va">$1</span><span class="st">"</span></span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true"></a>    <span class="bu">shift</span></span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">message=</span><span class="st">"</span><span class="va">$@</span><span class="st">"</span></span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">timestamp=$(</span><span class="fu">date</span> <span class="st">'+%Y-%m-%d %H:%M:%S'</span><span class="va">)</span></span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true"></a></span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true"></a>    <span class="co"># Check if we should log this level</span></span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true"></a>    <span class="kw">if</span><span class="bu"> [</span> <span class="st">"</span><span class="va">${LOG_LEVELS[$level]}</span><span class="st">"</span> <span class="ot">-ge</span> <span class="st">"</span><span class="va">${LOG_LEVELS[$LOG_LEVEL]}</span><span class="st">"</span><span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb3-18"><a href="#cb3-18" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"[</span><span class="va">$timestamp</span><span class="st">] [</span><span class="va">$level</span><span class="st">] </span><span class="va">$message</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">tee</span> -a <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb3-19"><a href="#cb3-19" aria-hidden="true"></a>    <span class="kw">fi</span></span>
<span id="cb3-20"><a href="#cb3-20" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb3-21"><a href="#cb3-21" aria-hidden="true"></a></span>
<span id="cb3-22"><a href="#cb3-22" aria-hidden="true"></a><span class="fu">log_debug()</span> <span class="kw">{</span> <span class="ex">log</span> DEBUG <span class="st">"</span><span class="va">$@</span><span class="st">"</span><span class="kw">;</span> <span class="kw">}</span></span>
<span id="cb3-23"><a href="#cb3-23" aria-hidden="true"></a><span class="fu">log_info()</span> <span class="kw">{</span> <span class="ex">log</span> INFO <span class="st">"</span><span class="va">$@</span><span class="st">"</span><span class="kw">;</span> <span class="kw">}</span></span>
<span id="cb3-24"><a href="#cb3-24" aria-hidden="true"></a><span class="fu">log_warn()</span> <span class="kw">{</span> <span class="ex">log</span> WARN <span class="st">"</span><span class="va">$@</span><span class="st">"</span><span class="kw">;</span> <span class="kw">}</span></span>
<span id="cb3-25"><a href="#cb3-25" aria-hidden="true"></a><span class="fu">log_error()</span> <span class="kw">{</span> <span class="ex">log</span> ERROR <span class="st">"</span><span class="va">$@</span><span class="st">"</span><span class="kw">;</span> <span class="kw">}</span></span>
<span id="cb3-26"><a href="#cb3-26" aria-hidden="true"></a></span>
<span id="cb3-27"><a href="#cb3-27" aria-hidden="true"></a><span class="co"># Usage examples</span></span>
<span id="cb3-28"><a href="#cb3-28" aria-hidden="true"></a><span class="ex">log_debug</span> <span class="st">"Starting database backup process"</span></span>
<span id="cb3-29"><a href="#cb3-29" aria-hidden="true"></a><span class="ex">log_info</span> <span class="st">"Backing up WordPress database"</span></span>
<span id="cb3-30"><a href="#cb3-30" aria-hidden="true"></a><span class="ex">log_warn</span> <span class="st">"Database size exceeds 1GB, this may take a while"</span></span>
<span id="cb3-31"><a href="#cb3-31" aria-hidden="true"></a><span class="ex">log_error</span> <span class="st">"Database backup failed: disk full"</span></span></code></pre>
</div>



<h4 class="wp-block-heading" id="structured-log-format">Structured Log Format</h4>



<div class="sourceCode" id="cb4">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true"></a><span class="co"># structured-logging.sh</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true"></a></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true"></a><span class="fu">log_structured()</span> <span class="kw">{</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">level=</span><span class="st">"</span><span class="va">$1</span><span class="st">"</span></span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">component=</span><span class="st">"</span><span class="va">$2</span><span class="st">"</span></span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">action=</span><span class="st">"</span><span class="va">$3</span><span class="st">"</span></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true"></a>    <span class="bu">shift</span> 3</span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">message=</span><span class="st">"</span><span class="va">$@</span><span class="st">"</span></span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true"></a></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">timestamp=$(</span><span class="fu">date</span> <span class="st">'+%Y-%m-%d %H:%M:%S'</span><span class="va">)</span></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">hostname=$(</span><span class="fu">hostname</span><span class="va">)</span></span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true"></a></span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true"></a>    <span class="co"># JSON-like format for easy parsing</span></span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"{</span><span class="dt">\"</span><span class="st">timestamp</span><span class="dt">\"</span><span class="st">:</span><span class="dt">\"</span><span class="va">$timestamp</span><span class="dt">\"</span><span class="st">,</span><span class="dt">\"</span><span class="st">level</span><span class="dt">\"</span><span class="st">:</span><span class="dt">\"</span><span class="va">$level</span><span class="dt">\"</span><span class="st">,</span><span class="dt">\"</span><span class="st">host</span><span class="dt">\"</span><span class="st">:</span><span class="dt">\"</span><span class="va">$hostname</span><span class="dt">\"</span><span class="st">,</span><span class="dt">\"</span><span class="st">component</span><span class="dt">\"</span><span class="st">:</span><span class="dt">\"</span><span class="va">$component</span><span class="dt">\"</span><span class="st">,</span><span class="dt">\"</span><span class="st">action</span><span class="dt">\"</span><span class="st">:</span><span class="dt">\"</span><span class="va">$action</span><span class="dt">\"</span><span class="st">,</span><span class="dt">\"</span><span class="st">message</span><span class="dt">\"</span><span class="st">:</span><span class="dt">\"</span><span class="va">$message</span><span class="dt">\"</span><span class="st">}"</span> <span class="op">&gt;&gt;</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true"></a></span>
<span id="cb4-17"><a href="#cb4-17" aria-hidden="true"></a>    <span class="co"># Human-readable format for terminal</span></span>
<span id="cb4-18"><a href="#cb4-18" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"[</span><span class="va">$timestamp</span><span class="st">] [</span><span class="va">$level</span><span class="st">] [</span><span class="va">$component</span><span class="st">] </span><span class="va">$action</span><span class="st">: </span><span class="va">$message</span><span class="st">"</span></span>
<span id="cb4-19"><a href="#cb4-19" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb4-20"><a href="#cb4-20" aria-hidden="true"></a></span>
<span id="cb4-21"><a href="#cb4-21" aria-hidden="true"></a><span class="co"># Usage</span></span>
<span id="cb4-22"><a href="#cb4-22" aria-hidden="true"></a><span class="ex">log_structured</span> INFO <span class="st">"wordpress"</span> <span class="st">"plugin-update"</span> <span class="st">"Updating all plugins"</span></span>
<span id="cb4-23"><a href="#cb4-23" aria-hidden="true"></a><span class="ex">log_structured</span> ERROR <span class="st">"database"</span> <span class="st">"backup"</span> <span class="st">"Failed to create backup: Permission denied"</span></span></code></pre>
</div>



<h3 class="wp-block-heading" id="debugging-techniques">Debugging Techniques</h3>



<p>Advanced debugging patterns for troubleshooting scripts.</p>



<h4 class="wp-block-heading" id="bash-debug-mode">Bash Debug Mode</h4>



<div class="sourceCode" id="cb5">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true"></a></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true"></a><span class="co"># Enable debug mode with -x flag</span></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-x</span>  # Print each command before executing</span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true"></a></span>
<span id="cb5-6"><a href="#cb5-6" aria-hidden="true"></a><span class="co"># Or use for specific sections</span></span>
<span id="cb5-7"><a href="#cb5-7" aria-hidden="true"></a><span class="kw">{</span></span>
<span id="cb5-8"><a href="#cb5-8" aria-hidden="true"></a>    <span class="kw">set</span> <span class="ex">-x</span></span>
<span id="cb5-9"><a href="#cb5-9" aria-hidden="true"></a>    <span class="ex">wp</span> plugin update --all</span>
<span id="cb5-10"><a href="#cb5-10" aria-hidden="true"></a>    <span class="ex">wp</span> theme update --all</span>
<span id="cb5-11"><a href="#cb5-11" aria-hidden="true"></a>    <span class="kw">set</span> <span class="ex">+x</span></span>
<span id="cb5-12"><a href="#cb5-12" aria-hidden="true"></a><span class="kw">}</span> <span class="op">2&gt;&amp;1</span> <span class="kw">|</span> <span class="fu">tee</span> -a debug.log</span>
<span id="cb5-13"><a href="#cb5-13" aria-hidden="true"></a></span>
<span id="cb5-14"><a href="#cb5-14" aria-hidden="true"></a><span class="co"># Verbose WP-CLI output</span></span>
<span id="cb5-15"><a href="#cb5-15" aria-hidden="true"></a><span class="ex">wp</span> --debug plugin list</span></code></pre>
</div>



<h4 class="wp-block-heading" id="function-tracing">Function Tracing</h4>



<div class="sourceCode" id="cb6">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true"></a></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true"></a><span class="co"># Enable function call tracing</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-o</span> functrace</span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true"></a></span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true"></a><span class="co"># Trace function for debugging</span></span>
<span id="cb6-7"><a href="#cb6-7" aria-hidden="true"></a><span class="fu">trace()</span> <span class="kw">{</span></span>
<span id="cb6-8"><a href="#cb6-8" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"[TRACE] Function: </span><span class="va">${FUNCNAME[1]}</span><span class="st">, Line: </span><span class="va">${BASH_LINENO[0]}</span><span class="st">"</span> <span class="op">&gt;&gt;</span> trace.log</span>
<span id="cb6-9"><a href="#cb6-9" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb6-10"><a href="#cb6-10" aria-hidden="true"></a></span>
<span id="cb6-11"><a href="#cb6-11" aria-hidden="true"></a><span class="fu">backup_database()</span> <span class="kw">{</span></span>
<span id="cb6-12"><a href="#cb6-12" aria-hidden="true"></a>    <span class="ex">trace</span></span>
<span id="cb6-13"><a href="#cb6-13" aria-hidden="true"></a>    <span class="ex">log_info</span> <span class="st">"Starting database backup"</span></span>
<span id="cb6-14"><a href="#cb6-14" aria-hidden="true"></a>    <span class="ex">wp</span> db export backup.sql.gz</span>
<span id="cb6-15"><a href="#cb6-15" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb6-16"><a href="#cb6-16" aria-hidden="true"></a></span>
<span id="cb6-17"><a href="#cb6-17" aria-hidden="true"></a><span class="fu">update_plugins()</span> <span class="kw">{</span></span>
<span id="cb6-18"><a href="#cb6-18" aria-hidden="true"></a>    <span class="ex">trace</span></span>
<span id="cb6-19"><a href="#cb6-19" aria-hidden="true"></a>    <span class="ex">log_info</span> <span class="st">"Updating plugins"</span></span>
<span id="cb6-20"><a href="#cb6-20" aria-hidden="true"></a>    <span class="ex">wp</span> plugin update --all</span>
<span id="cb6-21"><a href="#cb6-21" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb6-22"><a href="#cb6-22" aria-hidden="true"></a></span>
<span id="cb6-23"><a href="#cb6-23" aria-hidden="true"></a><span class="co"># Call functions</span></span>
<span id="cb6-24"><a href="#cb6-24" aria-hidden="true"></a><span class="ex">backup_database</span></span>
<span id="cb6-25"><a href="#cb6-25" aria-hidden="true"></a><span class="ex">update_plugins</span></span></code></pre>
</div>



<h4 class="wp-block-heading" id="variable-state-logging">Variable State Logging</h4>



<div class="sourceCode" id="cb7">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true"></a></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true"></a><span class="fu">log_var()</span> <span class="kw">{</span></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">var_name=</span><span class="st">"</span><span class="va">$1</span><span class="st">"</span></span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">var_value=</span><span class="st">"</span><span class="va">${!var_name}</span><span class="st">"</span></span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true"></a>    <span class="ex">log_debug</span> <span class="st">"Variable </span><span class="va">$var_name</span><span class="st"> = '</span><span class="va">$var_value</span><span class="st">'"</span></span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true"></a></span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true"></a><span class="co"># Usage</span></span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true"></a><span class="va">BACKUP_DIR=</span><span class="st">"/backups"</span></span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true"></a><span class="va">SITE_URL=</span><span class="st">"https://example.com"</span></span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true"></a><span class="va">PLUGIN_COUNT=$(</span><span class="ex">wp</span> plugin list --format=count<span class="va">)</span></span>
<span id="cb7-13"><a href="#cb7-13" aria-hidden="true"></a></span>
<span id="cb7-14"><a href="#cb7-14" aria-hidden="true"></a><span class="ex">log_var</span> BACKUP_DIR</span>
<span id="cb7-15"><a href="#cb7-15" aria-hidden="true"></a><span class="ex">log_var</span> SITE_URL</span>
<span id="cb7-16"><a href="#cb7-16" aria-hidden="true"></a><span class="ex">log_var</span> PLUGIN_COUNT</span></code></pre>
</div>



<p>Learn about <a href="https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html">Bash debugging</a> techniques.</p>



<h3 class="wp-block-heading" id="error-context">Error Context and Stack Traces</h3>



<p>Capture comprehensive error information for debugging.</p>



<h4 class="wp-block-heading" id="error-handler-with-context">Error Handler with Context</h4>



<div class="sourceCode" id="cb8">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true"></a></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">"/var/log/wp-errors.log"</span></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true"></a></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true"></a><span class="fu">error_handler()</span> <span class="kw">{</span></span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">exit_code=$?</span></span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">line_number=$1</span></span>
<span id="cb8-9"><a href="#cb8-9" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">bash_lineno=${BASH_LINENO[0]}</span></span>
<span id="cb8-10"><a href="#cb8-10" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">function_name=${FUNCNAME[1]:-</span>main<span class="va">}</span></span>
<span id="cb8-11"><a href="#cb8-11" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">command=</span><span class="st">"</span><span class="va">${BASH_COMMAND}</span><span class="st">"</span></span>
<span id="cb8-12"><a href="#cb8-12" aria-hidden="true"></a></span>
<span id="cb8-13"><a href="#cb8-13" aria-hidden="true"></a>    <span class="kw">{</span></span>
<span id="cb8-14"><a href="#cb8-14" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"=========================================="</span></span>
<span id="cb8-15"><a href="#cb8-15" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"ERROR OCCURRED"</span></span>
<span id="cb8-16"><a href="#cb8-16" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"=========================================="</span></span>
<span id="cb8-17"><a href="#cb8-17" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Timestamp: </span><span class="va">$(</span><span class="fu">date</span> <span class="st">'+%Y-%m-%d %H:%M:%S'</span><span class="va">)</span><span class="st">"</span></span>
<span id="cb8-18"><a href="#cb8-18" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Exit Code: </span><span class="va">$exit_code</span><span class="st">"</span></span>
<span id="cb8-19"><a href="#cb8-19" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Line Number: </span><span class="va">$line_number</span><span class="st">"</span></span>
<span id="cb8-20"><a href="#cb8-20" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Function: </span><span class="va">$function_name</span><span class="st">"</span></span>
<span id="cb8-21"><a href="#cb8-21" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Command: </span><span class="va">$command</span><span class="st">"</span></span>
<span id="cb8-22"><a href="#cb8-22" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Script: </span><span class="va">$0</span><span class="st">"</span></span>
<span id="cb8-23"><a href="#cb8-23" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Working Directory: </span><span class="va">$(</span><span class="bu">pwd</span><span class="va">)</span><span class="st">"</span></span>
<span id="cb8-24"><a href="#cb8-24" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"User: </span><span class="va">$(</span><span class="fu">whoami</span><span class="va">)</span><span class="st">"</span></span>
<span id="cb8-25"><a href="#cb8-25" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Hostname: </span><span class="va">$(</span><span class="fu">hostname</span><span class="va">)</span><span class="st">"</span></span>
<span id="cb8-26"><a href="#cb8-26" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"=========================================="</span></span>
<span id="cb8-27"><a href="#cb8-27" aria-hidden="true"></a>    <span class="kw">}</span> <span class="kw">|</span> <span class="fu">tee</span> -a <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb8-28"><a href="#cb8-28" aria-hidden="true"></a></span>
<span id="cb8-29"><a href="#cb8-29" aria-hidden="true"></a>    <span class="co"># Capture environment state</span></span>
<span id="cb8-30"><a href="#cb8-30" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"Environment Variables:"</span> <span class="op">&gt;&gt;</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb8-31"><a href="#cb8-31" aria-hidden="true"></a>    <span class="fu">env</span> <span class="op">&gt;&gt;</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb8-32"><a href="#cb8-32" aria-hidden="true"></a></span>
<span id="cb8-33"><a href="#cb8-33" aria-hidden="true"></a>    <span class="bu">exit</span> <span class="va">$exit_code</span></span>
<span id="cb8-34"><a href="#cb8-34" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb8-35"><a href="#cb8-35" aria-hidden="true"></a></span>
<span id="cb8-36"><a href="#cb8-36" aria-hidden="true"></a><span class="bu">trap</span> <span class="st">'error_handler ${LINENO}'</span> ERR</span>
<span id="cb8-37"><a href="#cb8-37" aria-hidden="true"></a></span>
<span id="cb8-38"><a href="#cb8-38" aria-hidden="true"></a><span class="co"># Script operations that might fail</span></span>
<span id="cb8-39"><a href="#cb8-39" aria-hidden="true"></a><span class="ex">wp</span> db export backup.sql.gz</span>
<span id="cb8-40"><a href="#cb8-40" aria-hidden="true"></a><span class="ex">wp</span> plugin update --all</span></code></pre>
</div>



<h4 class="wp-block-heading" id="stack-trace-function">Stack Trace Function</h4>



<div class="sourceCode" id="cb9">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true"></a></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true"></a><span class="fu">print_stack_trace()</span> <span class="kw">{</span></span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">frame=</span>0</span>
<span id="cb9-5"><a href="#cb9-5" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"Stack Trace:"</span> <span class="op">&gt;&amp;2</span></span>
<span id="cb9-6"><a href="#cb9-6" aria-hidden="true"></a></span>
<span id="cb9-7"><a href="#cb9-7" aria-hidden="true"></a>    <span class="kw">while</span> <span class="bu">caller</span> <span class="va">$frame</span><span class="kw">;</span> <span class="kw">do</span></span>
<span id="cb9-8"><a href="#cb9-8" aria-hidden="true"></a>        <span class="kw">((</span>frame++<span class="kw">))</span></span>
<span id="cb9-9"><a href="#cb9-9" aria-hidden="true"></a>    <span class="kw">done</span> <span class="kw">|</span> <span class="kw">while</span> <span class="bu">read</span> <span class="va">line</span> <span class="va">func</span> <span class="va">file</span>; <span class="kw">do</span></span>
<span id="cb9-10"><a href="#cb9-10" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"  at </span><span class="va">$func</span><span class="st"> (</span><span class="va">$file</span><span class="st">:</span><span class="va">$line</span><span class="st">)"</span> <span class="op">&gt;&amp;2</span></span>
<span id="cb9-11"><a href="#cb9-11" aria-hidden="true"></a>    <span class="kw">done</span></span>
<span id="cb9-12"><a href="#cb9-12" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb9-13"><a href="#cb9-13" aria-hidden="true"></a></span>
<span id="cb9-14"><a href="#cb9-14" aria-hidden="true"></a><span class="fu">error_with_trace()</span> <span class="kw">{</span></span>
<span id="cb9-15"><a href="#cb9-15" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"ERROR: </span><span class="va">$@</span><span class="st">"</span> <span class="op">&gt;&amp;2</span></span>
<span id="cb9-16"><a href="#cb9-16" aria-hidden="true"></a>    <span class="ex">print_stack_trace</span></span>
<span id="cb9-17"><a href="#cb9-17" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb9-18"><a href="#cb9-18" aria-hidden="true"></a></span>
<span id="cb9-19"><a href="#cb9-19" aria-hidden="true"></a><span class="co"># Usage</span></span>
<span id="cb9-20"><a href="#cb9-20" aria-hidden="true"></a><span class="fu">backup_db()</span> <span class="kw">{</span></span>
<span id="cb9-21"><a href="#cb9-21" aria-hidden="true"></a>    <span class="kw">if</span> ! <span class="ex">wp</span> db export backup.sql.gz<span class="kw">;</span> <span class="kw">then</span></span>
<span id="cb9-22"><a href="#cb9-22" aria-hidden="true"></a>        <span class="ex">error_with_trace</span> <span class="st">"Database backup failed"</span></span>
<span id="cb9-23"><a href="#cb9-23" aria-hidden="true"></a>        <span class="bu">return</span> 1</span>
<span id="cb9-24"><a href="#cb9-24" aria-hidden="true"></a>    <span class="kw">fi</span></span>
<span id="cb9-25"><a href="#cb9-25" aria-hidden="true"></a><span class="kw">}</span></span></code></pre>
</div>



<h3 class="wp-block-heading" id="log-rotation">Log Rotation and Management</h3>



<p>Prevent logs from consuming all disk space.</p>



<h4 class="wp-block-heading" id="manual-log-rotation">Manual Log Rotation</h4>



<div class="sourceCode" id="cb10">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true"></a><span class="co"># rotate-logs.sh - Rotate log files</span></span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true"></a></span>
<span id="cb10-4"><a href="#cb10-4" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">"/var/log/wp-automation.log"</span></span>
<span id="cb10-5"><a href="#cb10-5" aria-hidden="true"></a><span class="va">MAX_SIZE_MB=</span>10</span>
<span id="cb10-6"><a href="#cb10-6" aria-hidden="true"></a><span class="va">KEEP_DAYS=</span>30</span>
<span id="cb10-7"><a href="#cb10-7" aria-hidden="true"></a></span>
<span id="cb10-8"><a href="#cb10-8" aria-hidden="true"></a><span class="co"># Check log file size</span></span>
<span id="cb10-9"><a href="#cb10-9" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="ot">-f</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span><span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb10-10"><a href="#cb10-10" aria-hidden="true"></a>    <span class="va">FILE_SIZE=$(</span><span class="fu">du</span> -m <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">cut</span> -f1<span class="va">)</span></span>
<span id="cb10-11"><a href="#cb10-11" aria-hidden="true"></a></span>
<span id="cb10-12"><a href="#cb10-12" aria-hidden="true"></a>    <span class="kw">if</span><span class="bu"> [</span> <span class="st">"</span><span class="va">$FILE_SIZE</span><span class="st">"</span> <span class="ot">-gt</span> <span class="st">"</span><span class="va">$MAX_SIZE_MB</span><span class="st">"</span><span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb10-13"><a href="#cb10-13" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Rotating log file (</span><span class="va">${FILE_SIZE}</span><span class="st">MB)"</span></span>
<span id="cb10-14"><a href="#cb10-14" aria-hidden="true"></a></span>
<span id="cb10-15"><a href="#cb10-15" aria-hidden="true"></a>        <span class="co"># Archive with timestamp</span></span>
<span id="cb10-16"><a href="#cb10-16" aria-hidden="true"></a>        <span class="va">ARCHIVE=</span><span class="st">"</span><span class="va">${LOG_FILE}</span><span class="st">.</span><span class="va">$(</span><span class="fu">date</span> +%Y%m%d-%H%M%S<span class="va">)</span><span class="st">.gz"</span></span>
<span id="cb10-17"><a href="#cb10-17" aria-hidden="true"></a>        <span class="fu">gzip</span> -c <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span> <span class="op">&gt;</span> <span class="st">"</span><span class="va">$ARCHIVE</span><span class="st">"</span></span>
<span id="cb10-18"><a href="#cb10-18" aria-hidden="true"></a></span>
<span id="cb10-19"><a href="#cb10-19" aria-hidden="true"></a>        <span class="co"># Clear current log</span></span>
<span id="cb10-20"><a href="#cb10-20" aria-hidden="true"></a>        <span class="op">&gt;</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb10-21"><a href="#cb10-21" aria-hidden="true"></a></span>
<span id="cb10-22"><a href="#cb10-22" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">"Log rotated to: </span><span class="va">$ARCHIVE</span><span class="st">"</span></span>
<span id="cb10-23"><a href="#cb10-23" aria-hidden="true"></a>    <span class="kw">fi</span></span>
<span id="cb10-24"><a href="#cb10-24" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb10-25"><a href="#cb10-25" aria-hidden="true"></a></span>
<span id="cb10-26"><a href="#cb10-26" aria-hidden="true"></a><span class="co"># Delete old archives</span></span>
<span id="cb10-27"><a href="#cb10-27" aria-hidden="true"></a><span class="fu">find</span> <span class="st">"</span><span class="va">$(</span><span class="fu">dirname</span> <span class="va">$LOG_FILE)</span><span class="st">"</span> -name <span class="st">"</span><span class="va">$(</span><span class="fu">basename</span> <span class="va">$LOG_FILE)</span><span class="st">.*.gz"</span> -mtime +<span class="va">$KEEP_DAYS</span> -delete</span></code></pre>
</div>



<h4 class="wp-block-heading" id="using-logrotate">Using logrotate</h4>



<div class="sourceCode" id="cb11">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true"></a><span class="co"># /etc/logrotate.d/wp-automation</span></span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true"></a></span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true"></a><span class="ex">/var/log/wp-automation.log</span> {</span>
<span id="cb11-4"><a href="#cb11-4" aria-hidden="true"></a>    <span class="ex">daily</span></span>
<span id="cb11-5"><a href="#cb11-5" aria-hidden="true"></a>    <span class="ex">rotate</span> 7</span>
<span id="cb11-6"><a href="#cb11-6" aria-hidden="true"></a>    <span class="ex">compress</span></span>
<span id="cb11-7"><a href="#cb11-7" aria-hidden="true"></a>    <span class="ex">delaycompress</span></span>
<span id="cb11-8"><a href="#cb11-8" aria-hidden="true"></a>    <span class="ex">missingok</span></span>
<span id="cb11-9"><a href="#cb11-9" aria-hidden="true"></a>    <span class="ex">notifempty</span></span>
<span id="cb11-10"><a href="#cb11-10" aria-hidden="true"></a>    <span class="ex">create</span> 0640 www-data www-data</span>
<span id="cb11-11"><a href="#cb11-11" aria-hidden="true"></a>    <span class="ex">sharedscripts</span></span>
<span id="cb11-12"><a href="#cb11-12" aria-hidden="true"></a>    <span class="ex">postrotate</span></span>
<span id="cb11-13"><a href="#cb11-13" aria-hidden="true"></a>        <span class="co"># Optional: restart service if needed</span></span>
<span id="cb11-14"><a href="#cb11-14" aria-hidden="true"></a>    <span class="ex">endscript</span></span>
<span id="cb11-15"><a href="#cb11-15" aria-hidden="true"></a>}</span></code></pre>
</div>



<p>Learn about <a href="https://linux.die.net/man/8/logrotate">logrotate configuration</a>.</p>



<h3 class="wp-block-heading" id="performance-logging">Performance and Timing Logs</h3>



<p>Track script performance and identify bottlenecks.</p>



<h4 class="wp-block-heading" id="execution-time-logging">Execution Time Logging</h4>



<div class="sourceCode" id="cb12">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true"></a></span>
<span id="cb12-3"><a href="#cb12-3" aria-hidden="true"></a><span class="fu">log_timed()</span> <span class="kw">{</span></span>
<span id="cb12-4"><a href="#cb12-4" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">description=</span><span class="st">"</span><span class="va">$1</span><span class="st">"</span></span>
<span id="cb12-5"><a href="#cb12-5" aria-hidden="true"></a>    <span class="bu">shift</span></span>
<span id="cb12-6"><a href="#cb12-6" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">command=</span><span class="st">"</span><span class="va">$@</span><span class="st">"</span></span>
<span id="cb12-7"><a href="#cb12-7" aria-hidden="true"></a></span>
<span id="cb12-8"><a href="#cb12-8" aria-hidden="true"></a>    <span class="ex">log_info</span> <span class="st">"Starting: </span><span class="va">$description</span><span class="st">"</span></span>
<span id="cb12-9"><a href="#cb12-9" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">start_time=$(</span><span class="fu">date</span> +%s<span class="va">)</span></span>
<span id="cb12-10"><a href="#cb12-10" aria-hidden="true"></a></span>
<span id="cb12-11"><a href="#cb12-11" aria-hidden="true"></a>    <span class="co"># Execute command</span></span>
<span id="cb12-12"><a href="#cb12-12" aria-hidden="true"></a>    <span class="bu">eval</span> <span class="st">"</span><span class="va">$command</span><span class="st">"</span></span>
<span id="cb12-13"><a href="#cb12-13" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">exit_code=$?</span></span>
<span id="cb12-14"><a href="#cb12-14" aria-hidden="true"></a></span>
<span id="cb12-15"><a href="#cb12-15" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">end_time=$(</span><span class="fu">date</span> +%s<span class="va">)</span></span>
<span id="cb12-16"><a href="#cb12-16" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">duration=$((</span>end_time - start_time<span class="va">))</span></span>
<span id="cb12-17"><a href="#cb12-17" aria-hidden="true"></a></span>
<span id="cb12-18"><a href="#cb12-18" aria-hidden="true"></a>    <span class="kw">if</span><span class="bu"> [</span> <span class="va">$exit_code</span> <span class="ot">-eq</span> 0<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb12-19"><a href="#cb12-19" aria-hidden="true"></a>        <span class="ex">log_info</span> <span class="st">"✓ Completed: </span><span class="va">$description</span><span class="st"> (</span><span class="va">${duration}</span><span class="st">s)"</span></span>
<span id="cb12-20"><a href="#cb12-20" aria-hidden="true"></a>    <span class="kw">else</span></span>
<span id="cb12-21"><a href="#cb12-21" aria-hidden="true"></a>        <span class="ex">log_error</span> <span class="st">"✗ Failed: </span><span class="va">$description</span><span class="st"> (</span><span class="va">${duration}</span><span class="st">s, exit code: </span><span class="va">$exit_code</span><span class="st">)"</span></span>
<span id="cb12-22"><a href="#cb12-22" aria-hidden="true"></a>    <span class="kw">fi</span></span>
<span id="cb12-23"><a href="#cb12-23" aria-hidden="true"></a></span>
<span id="cb12-24"><a href="#cb12-24" aria-hidden="true"></a>    <span class="bu">return</span> <span class="va">$exit_code</span></span>
<span id="cb12-25"><a href="#cb12-25" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb12-26"><a href="#cb12-26" aria-hidden="true"></a></span>
<span id="cb12-27"><a href="#cb12-27" aria-hidden="true"></a><span class="co"># Usage</span></span>
<span id="cb12-28"><a href="#cb12-28" aria-hidden="true"></a><span class="ex">log_timed</span> <span class="st">"Database export"</span> <span class="st">"wp db export backup.sql.gz"</span></span>
<span id="cb12-29"><a href="#cb12-29" aria-hidden="true"></a><span class="ex">log_timed</span> <span class="st">"Plugin updates"</span> <span class="st">"wp plugin update --all"</span></span>
<span id="cb12-30"><a href="#cb12-30" aria-hidden="true"></a><span class="ex">log_timed</span> <span class="st">"Cache flush"</span> <span class="st">"wp cache flush"</span></span></code></pre>
</div>



<h4 class="wp-block-heading" id="performance-benchmarking">Performance Benchmarking</h4>



<div class="sourceCode" id="cb13">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true"></a></span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true"></a><span class="fu">benchmark()</span> <span class="kw">{</span></span>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">operation=</span><span class="st">"</span><span class="va">$1</span><span class="st">"</span></span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">iterations=</span><span class="st">"</span><span class="va">${2:-</span>10<span class="va">}</span><span class="st">"</span></span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true"></a></span>
<span id="cb13-7"><a href="#cb13-7" aria-hidden="true"></a>    <span class="ex">log_info</span> <span class="st">"Benchmarking: </span><span class="va">$operation</span><span class="st"> (</span><span class="va">$iterations</span><span class="st"> iterations)"</span></span>
<span id="cb13-8"><a href="#cb13-8" aria-hidden="true"></a></span>
<span id="cb13-9"><a href="#cb13-9" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">total_time=</span>0</span>
<span id="cb13-10"><a href="#cb13-10" aria-hidden="true"></a></span>
<span id="cb13-11"><a href="#cb13-11" aria-hidden="true"></a>    <span class="kw">for</span> <span class="ex">i</span> in <span class="va">$(</span><span class="fu">seq</span> 1 <span class="va">$iterations)</span><span class="kw">;</span> <span class="kw">do</span></span>
<span id="cb13-12"><a href="#cb13-12" aria-hidden="true"></a>        <span class="bu">local</span> <span class="va">start=$(</span><span class="fu">date</span> +%s%N<span class="va">)</span></span>
<span id="cb13-13"><a href="#cb13-13" aria-hidden="true"></a>        <span class="bu">eval</span> <span class="st">"</span><span class="va">$operation</span><span class="st">"</span> <span class="op">&gt;</span>/dev/null <span class="op">2&gt;&amp;1</span></span>
<span id="cb13-14"><a href="#cb13-14" aria-hidden="true"></a>        <span class="bu">local</span> <span class="va">end=$(</span><span class="fu">date</span> +%s%N<span class="va">)</span></span>
<span id="cb13-15"><a href="#cb13-15" aria-hidden="true"></a></span>
<span id="cb13-16"><a href="#cb13-16" aria-hidden="true"></a>        <span class="bu">local</span> <span class="va">duration=$((</span> (end - start) / 1000000 <span class="va">))</span>  # <span class="va">Convert</span> <span class="va">to</span> <span class="va">milliseconds</span></span>
<span id="cb13-17"><a href="#cb13-17" aria-hidden="true"></a>        <span class="va">total_time=$((</span>total_time + duration<span class="va">))</span></span>
<span id="cb13-18"><a href="#cb13-18" aria-hidden="true"></a>    <span class="kw">done</span></span>
<span id="cb13-19"><a href="#cb13-19" aria-hidden="true"></a></span>
<span id="cb13-20"><a href="#cb13-20" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">avg_time=$((</span>total_time / iterations<span class="va">))</span></span>
<span id="cb13-21"><a href="#cb13-21" aria-hidden="true"></a></span>
<span id="cb13-22"><a href="#cb13-22" aria-hidden="true"></a>    <span class="ex">log_info</span> <span class="st">"Benchmark results: </span><span class="va">${avg_time}</span><span class="st">ms average (</span><span class="va">${iterations}</span><span class="st"> runs)"</span></span>
<span id="cb13-23"><a href="#cb13-23" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb13-24"><a href="#cb13-24" aria-hidden="true"></a></span>
<span id="cb13-25"><a href="#cb13-25" aria-hidden="true"></a><span class="co"># Usage</span></span>
<span id="cb13-26"><a href="#cb13-26" aria-hidden="true"></a><span class="ex">benchmark</span> <span class="st">"wp option get siteurl"</span> 5</span></code></pre>
</div>



<h3 class="wp-block-heading" id="log-analysis">Log Aggregation and Analysis</h3>



<p>Analyze logs for insights and troubleshooting.</p>



<h4 class="wp-block-heading" id="log-analysis-scripts">Log Analysis Scripts</h4>



<div class="sourceCode" id="cb14">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true"></a><span class="co"># analyze-logs.sh - Extract insights from logs</span></span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true"></a></span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">"/var/log/wp-automation.log"</span></span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true"></a></span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"WordPress Automation Log Analysis"</span></span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"=================================="</span></span>
<span id="cb14-8"><a href="#cb14-8" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">""</span></span>
<span id="cb14-9"><a href="#cb14-9" aria-hidden="true"></a></span>
<span id="cb14-10"><a href="#cb14-10" aria-hidden="true"></a><span class="co"># Count log levels</span></span>
<span id="cb14-11"><a href="#cb14-11" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"Log Levels:"</span></span>
<span id="cb14-12"><a href="#cb14-12" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"  ERROR:   </span><span class="va">$(</span><span class="fu">grep</span> -c <span class="st">'\[ERROR\]'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span><span class="va">)</span><span class="st">"</span></span>
<span id="cb14-13"><a href="#cb14-13" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"  WARN:    </span><span class="va">$(</span><span class="fu">grep</span> -c <span class="st">'\[WARN\]'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span><span class="va">)</span><span class="st">"</span></span>
<span id="cb14-14"><a href="#cb14-14" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"  INFO:    </span><span class="va">$(</span><span class="fu">grep</span> -c <span class="st">'\[INFO\]'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span><span class="va">)</span><span class="st">"</span></span>
<span id="cb14-15"><a href="#cb14-15" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">""</span></span>
<span id="cb14-16"><a href="#cb14-16" aria-hidden="true"></a></span>
<span id="cb14-17"><a href="#cb14-17" aria-hidden="true"></a><span class="co"># Recent errors</span></span>
<span id="cb14-18"><a href="#cb14-18" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"Recent Errors (last 10):"</span></span>
<span id="cb14-19"><a href="#cb14-19" aria-hidden="true"></a><span class="fu">grep</span> <span class="st">'\[ERROR\]'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">tail</span> -10</span>
<span id="cb14-20"><a href="#cb14-20" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">""</span></span>
<span id="cb14-21"><a href="#cb14-21" aria-hidden="true"></a></span>
<span id="cb14-22"><a href="#cb14-22" aria-hidden="true"></a><span class="co"># Most common operations</span></span>
<span id="cb14-23"><a href="#cb14-23" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"Most Frequent Operations:"</span></span>
<span id="cb14-24"><a href="#cb14-24" aria-hidden="true"></a><span class="fu">grep</span> -oP <span class="st">'(?&lt;=\] ).*?(?=:)'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">sort</span> <span class="kw">|</span> <span class="fu">uniq</span> -c <span class="kw">|</span> <span class="fu">sort</span> -rn <span class="kw">|</span> <span class="fu">head</span> -10</span>
<span id="cb14-25"><a href="#cb14-25" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">""</span></span>
<span id="cb14-26"><a href="#cb14-26" aria-hidden="true"></a></span>
<span id="cb14-27"><a href="#cb14-27" aria-hidden="true"></a><span class="co"># Script execution times</span></span>
<span id="cb14-28"><a href="#cb14-28" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">"Average Execution Times:"</span></span>
<span id="cb14-29"><a href="#cb14-29" aria-hidden="true"></a><span class="fu">grep</span> -oP <span class="st">'Completed.*?\(\K[0-9]+(?=s\))'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">awk</span> <span class="st">'{sum+=$1; count++} END {print "Average: " sum/count "s"}'</span></span></code></pre>
</div>



<h4 class="wp-block-heading" id="error-report-generation">Error Report Generation</h4>



<div class="sourceCode" id="cb15">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true"></a><span class="co"># generate-error-report.sh</span></span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true"></a></span>
<span id="cb15-4"><a href="#cb15-4" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">"/var/log/wp-automation.log"</span></span>
<span id="cb15-5"><a href="#cb15-5" aria-hidden="true"></a><span class="va">REPORT_FILE=</span><span class="st">"/tmp/error-report-</span><span class="va">$(</span><span class="fu">date</span> +%Y%m%d<span class="va">)</span><span class="st">.txt"</span></span>
<span id="cb15-6"><a href="#cb15-6" aria-hidden="true"></a><span class="va">EMAIL=</span><span class="st">"admin@example.com"</span></span>
<span id="cb15-7"><a href="#cb15-7" aria-hidden="true"></a></span>
<span id="cb15-8"><a href="#cb15-8" aria-hidden="true"></a><span class="kw">{</span></span>
<span id="cb15-9"><a href="#cb15-9" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"WordPress Automation Error Report"</span></span>
<span id="cb15-10"><a href="#cb15-10" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"Generated: </span><span class="va">$(</span><span class="fu">date</span><span class="va">)</span><span class="st">"</span></span>
<span id="cb15-11"><a href="#cb15-11" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"=================================="</span></span>
<span id="cb15-12"><a href="#cb15-12" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">""</span></span>
<span id="cb15-13"><a href="#cb15-13" aria-hidden="true"></a></span>
<span id="cb15-14"><a href="#cb15-14" aria-hidden="true"></a>    <span class="co"># Errors in last 24 hours</span></span>
<span id="cb15-15"><a href="#cb15-15" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"Errors in Last 24 Hours:"</span></span>
<span id="cb15-16"><a href="#cb15-16" aria-hidden="true"></a>    <span class="fu">grep</span> <span class="st">'\[ERROR\]'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">grep</span> <span class="st">"</span><span class="va">$(</span><span class="fu">date</span> +%Y-%m-%d<span class="va">)</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">nl</span></span>
<span id="cb15-17"><a href="#cb15-17" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">""</span></span>
<span id="cb15-18"><a href="#cb15-18" aria-hidden="true"></a></span>
<span id="cb15-19"><a href="#cb15-19" aria-hidden="true"></a>    <span class="co"># Failed operations</span></span>
<span id="cb15-20"><a href="#cb15-20" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"Failed Operations:"</span></span>
<span id="cb15-21"><a href="#cb15-21" aria-hidden="true"></a>    <span class="fu">grep</span> <span class="st">'✗ Failed'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">tail</span> -20</span>
<span id="cb15-22"><a href="#cb15-22" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">""</span></span>
<span id="cb15-23"><a href="#cb15-23" aria-hidden="true"></a></span>
<span id="cb15-24"><a href="#cb15-24" aria-hidden="true"></a>    <span class="co"># Critical errors</span></span>
<span id="cb15-25"><a href="#cb15-25" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"Critical Issues:"</span></span>
<span id="cb15-26"><a href="#cb15-26" aria-hidden="true"></a>    <span class="fu">grep</span> -i <span class="st">'critical\|fatal\|emergency'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span> <span class="kw">|</span> <span class="fu">tail</span> -10</span>
<span id="cb15-27"><a href="#cb15-27" aria-hidden="true"></a></span>
<span id="cb15-28"><a href="#cb15-28" aria-hidden="true"></a><span class="kw">}</span> <span class="op">&gt;</span> <span class="st">"</span><span class="va">$REPORT_FILE</span><span class="st">"</span></span>
<span id="cb15-29"><a href="#cb15-29" aria-hidden="true"></a></span>
<span id="cb15-30"><a href="#cb15-30" aria-hidden="true"></a><span class="co"># Email report if errors found</span></span>
<span id="cb15-31"><a href="#cb15-31" aria-hidden="true"></a><span class="va">ERROR_COUNT=$(</span><span class="fu">grep</span> -c <span class="st">'\[ERROR\]'</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span> <span class="kw">||</span> <span class="fu">true</span><span class="va">)</span></span>
<span id="cb15-32"><a href="#cb15-32" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="st">"</span><span class="va">$ERROR_COUNT</span><span class="st">"</span> <span class="ot">-gt</span> 0<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb15-33"><a href="#cb15-33" aria-hidden="true"></a>    <span class="ex">mail</span> -s <span class="st">"WordPress Automation Errors: </span><span class="va">$ERROR_COUNT</span><span class="st"> found"</span> <span class="st">"</span><span class="va">$EMAIL</span><span class="st">"</span> <span class="op">&lt;</span> <span class="st">"</span><span class="va">$REPORT_FILE</span><span class="st">"</span></span>
<span id="cb15-34"><a href="#cb15-34" aria-hidden="true"></a><span class="kw">fi</span></span></code></pre>
</div>



<h3 class="wp-block-heading" id="centralized-logging">Centralized Logging Systems</h3>



<p>Send logs to centralized logging platforms.</p>



<h4 class="wp-block-heading" id="syslog-integration">Syslog Integration</h4>



<div class="sourceCode" id="cb16">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true"></a></span>
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true"></a><span class="co"># Log to both file and syslog</span></span>
<span id="cb16-4"><a href="#cb16-4" aria-hidden="true"></a><span class="fu">log_to_syslog()</span> <span class="kw">{</span></span>
<span id="cb16-5"><a href="#cb16-5" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">level=</span><span class="st">"</span><span class="va">$1</span><span class="st">"</span></span>
<span id="cb16-6"><a href="#cb16-6" aria-hidden="true"></a>    <span class="bu">shift</span></span>
<span id="cb16-7"><a href="#cb16-7" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">message=</span><span class="st">"</span><span class="va">$@</span><span class="st">"</span></span>
<span id="cb16-8"><a href="#cb16-8" aria-hidden="true"></a></span>
<span id="cb16-9"><a href="#cb16-9" aria-hidden="true"></a>    <span class="co"># Map to syslog levels</span></span>
<span id="cb16-10"><a href="#cb16-10" aria-hidden="true"></a>    <span class="kw">case</span> <span class="st">"</span><span class="va">$level</span><span class="st">"</span><span class="kw"> in</span></span>
<span id="cb16-11"><a href="#cb16-11" aria-hidden="true"></a>        ERROR<span class="kw">)</span> <span class="va">priority=</span><span class="st">"err"</span> <span class="kw">;;</span></span>
<span id="cb16-12"><a href="#cb16-12" aria-hidden="true"></a>        WARN<span class="kw">)</span>  <span class="va">priority=</span><span class="st">"warning"</span> <span class="kw">;;</span></span>
<span id="cb16-13"><a href="#cb16-13" aria-hidden="true"></a>        INFO<span class="kw">)</span>  <span class="va">priority=</span><span class="st">"info"</span> <span class="kw">;;</span></span>
<span id="cb16-14"><a href="#cb16-14" aria-hidden="true"></a>        DEBUG<span class="kw">)</span> <span class="va">priority=</span><span class="st">"debug"</span> <span class="kw">;;</span></span>
<span id="cb16-15"><a href="#cb16-15" aria-hidden="true"></a>        *<span class="kw">)</span> <span class="va">priority=</span><span class="st">"notice"</span> <span class="kw">;;</span></span>
<span id="cb16-16"><a href="#cb16-16" aria-hidden="true"></a>    <span class="kw">esac</span></span>
<span id="cb16-17"><a href="#cb16-17" aria-hidden="true"></a></span>
<span id="cb16-18"><a href="#cb16-18" aria-hidden="true"></a>    <span class="co"># Log to file</span></span>
<span id="cb16-19"><a href="#cb16-19" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"[</span><span class="va">$(</span><span class="fu">date</span> <span class="st">'+%Y-%m-%d %H:%M:%S'</span><span class="va">)</span><span class="st">] [</span><span class="va">$level</span><span class="st">] </span><span class="va">$message</span><span class="st">"</span> <span class="op">&gt;&gt;</span> <span class="st">"</span><span class="va">$LOG_FILE</span><span class="st">"</span></span>
<span id="cb16-20"><a href="#cb16-20" aria-hidden="true"></a></span>
<span id="cb16-21"><a href="#cb16-21" aria-hidden="true"></a>    <span class="co"># Log to syslog</span></span>
<span id="cb16-22"><a href="#cb16-22" aria-hidden="true"></a>    <span class="ex">logger</span> -t <span class="st">"wp-automation"</span> -p <span class="st">"user.</span><span class="va">${priority}</span><span class="st">"</span> <span class="st">"</span><span class="va">$message</span><span class="st">"</span></span>
<span id="cb16-23"><a href="#cb16-23" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb16-24"><a href="#cb16-24" aria-hidden="true"></a></span>
<span id="cb16-25"><a href="#cb16-25" aria-hidden="true"></a><span class="co"># Usage</span></span>
<span id="cb16-26"><a href="#cb16-26" aria-hidden="true"></a><span class="ex">log_to_syslog</span> INFO <span class="st">"Starting WordPress backup"</span></span>
<span id="cb16-27"><a href="#cb16-27" aria-hidden="true"></a><span class="ex">log_to_syslog</span> ERROR <span class="st">"Backup failed: disk full"</span></span></code></pre>
</div>



<h4 class="wp-block-heading" id="json-logging-for-parsing">JSON Logging for Parsing</h4>



<div class="sourceCode" id="cb17">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true"></a></span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true"></a><span class="fu">log_json()</span> <span class="kw">{</span></span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">level=</span><span class="st">"</span><span class="va">$1</span><span class="st">"</span></span>
<span id="cb17-5"><a href="#cb17-5" aria-hidden="true"></a>    <span class="bu">shift</span></span>
<span id="cb17-6"><a href="#cb17-6" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">message=</span><span class="st">"</span><span class="va">$@</span><span class="st">"</span></span>
<span id="cb17-7"><a href="#cb17-7" aria-hidden="true"></a></span>
<span id="cb17-8"><a href="#cb17-8" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">json=$(</span><span class="fu">cat</span> <span class="op">&lt;&lt;EOF</span></span>
<span id="cb17-9"><a href="#cb17-9" aria-hidden="true"></a>{</span>
<span id="cb17-10"><a href="#cb17-10" aria-hidden="true"></a>  "timestamp": "<span class="va">$(</span><span class="fu">date</span> -u +%Y-%m-%dT%H:%M:%SZ<span class="va">)</span>",</span>
<span id="cb17-11"><a href="#cb17-11" aria-hidden="true"></a>  "level": "<span class="va">$level</span>",</span>
<span id="cb17-12"><a href="#cb17-12" aria-hidden="true"></a>  "service": "wp-automation",</span>
<span id="cb17-13"><a href="#cb17-13" aria-hidden="true"></a>  "hostname": "<span class="va">$(</span><span class="fu">hostname</span><span class="va">)</span>",</span>
<span id="cb17-14"><a href="#cb17-14" aria-hidden="true"></a>  "message": "<span class="va">$message</span>",</span>
<span id="cb17-15"><a href="#cb17-15" aria-hidden="true"></a>  "script": "<span class="va">$0</span>",</span>
<span id="cb17-16"><a href="#cb17-16" aria-hidden="true"></a>  "pid": <span class="va">$</span></span>
<span id="cb17-17"><a href="#cb17-17" aria-hidden="true"></a>}</span>
<span id="cb17-18"><a href="#cb17-18" aria-hidden="true"></a><span class="op">EOF</span></span>
<span id="cb17-19"><a href="#cb17-19" aria-hidden="true"></a><span class="va">)</span></span>
<span id="cb17-20"><a href="#cb17-20" aria-hidden="true"></a></span>
<span id="cb17-21"><a href="#cb17-21" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">"</span><span class="va">$json</span><span class="st">"</span> <span class="op">&gt;&gt;</span> /var/log/wp-automation.json</span>
<span id="cb17-22"><a href="#cb17-22" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb17-23"><a href="#cb17-23" aria-hidden="true"></a></span>
<span id="cb17-24"><a href="#cb17-24" aria-hidden="true"></a><span class="co"># Usage</span></span>
<span id="cb17-25"><a href="#cb17-25" aria-hidden="true"></a><span class="ex">log_json</span> <span class="st">"info"</span> <span class="st">"WordPress backup started"</span></span>
<span id="cb17-26"><a href="#cb17-26" aria-hidden="true"></a><span class="ex">log_json</span> <span class="st">"error"</span> <span class="st">"Plugin update failed"</span></span></code></pre>
</div>



<h3 class="wp-block-heading" id="next-steps">Next Steps</h3>



<p>You now have professional logging and debugging skills for production-ready WP-CLI automation.</p>



<h4 class="wp-block-heading" id="recommended-learning-path">Recommended Learning Path</h4>



<p><strong>Week 1</strong>: Basic logging</p>



<ul class="wp-block-list">
<li>Implement log functions</li>



<li>Add timestamps and levels</li>



<li>Practice log file rotation</li>
</ul>



<p><strong>Week 2</strong>: Advanced debugging</p>



<ul class="wp-block-list">
<li>Use debug modes</li>



<li>Add error handlers</li>



<li>Capture stack traces</li>
</ul>



<p><strong>Week 3</strong>: Performance tracking</p>



<ul class="wp-block-list">
<li>Log execution times</li>



<li>Benchmark operations</li>



<li>Identify bottlenecks</li>
</ul>



<p><strong>Week 4</strong>: Production monitoring</p>



<ul class="wp-block-list">
<li>Set up log analysis</li>



<li>Configure alerting</li>



<li>Implement centralized logging</li>
</ul>



<h4 class="wp-block-heading" id="advanced-topics">Advanced Topics</h4>



<ol class="wp-block-list">
<li><strong><a href="#">Distributed Tracing</a></strong> &#8211; Track operations across systems</li>



<li><strong><a href="#">Log Analytics</a></strong> &#8211; Advanced log parsing and insights</li>



<li><strong><a href="#">Monitoring Dashboards</a></strong> &#8211; Visualize log data</li>
</ol>



<h4 class="wp-block-heading" id="get-more-resources">Get More Resources</h4>



<p><strong><a href="#">Download logging templates</a></strong> including:</p>



<ul class="wp-block-list">
<li>Complete logging systems</li>



<li>Analysis scripts</li>



<li>Monitoring tools</li>
</ul>



<p><strong><a href="/#get-started">Join our email course</a></strong> for:</p>



<ul class="wp-block-list">
<li>Weekly WP-CLI tutorials</li>



<li>Debugging best practices</li>



<li>DevOps logging strategies</li>
</ul>



<h3 class="wp-block-heading" id="conclusion">Conclusion</h3>



<p>Professional logging and debugging transform fragile WordPress automation scripts into transparent, maintainable systems that provide complete visibility into operations.</p>



<p>What we covered:</p>



<p>✅ Basic logging implementation with timestamps ✅ Multi-level logging systems (DEBUG, INFO, WARN, ERROR) ✅ Advanced debugging techniques and tracing ✅ Error context and stack trace capture ✅ Log rotation and management ✅ Performance tracking and analysis</p>



<p>Master these techniques, and you’ll never struggle to debug production scripts again—comprehensive logs tell you exactly what happened, when, and why.</p>



<p><strong>Ready for more?</strong> Learn <a href="#">monitoring and alerting</a> or <a href="#">production debugging workflows</a>.</p>



<p><strong>Questions about logging WP-CLI automation scripts?</strong> Drop a comment below!</p>



<p><strong>Found this helpful?</strong> Share with other DevOps engineers.</p>
<p>The post <a href="https://wpclimastery.com/blog/professional-logging-and-debugging-for-wp-cli-automation-scripts/">Professional Logging and Debugging for WP-CLI Automation Scripts</a> appeared first on <a href="https://wpclimastery.com">WP-CLI Mastery</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
