{"id":437,"date":"2026-10-14T09:31:29","date_gmt":"2026-10-14T09:31:29","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2015\/10\/03\/how-to-attach-the-jenkins-build-log-as-part-of-the-email-body-2\/"},"modified":"2026-10-14T09:31:29","modified_gmt":"2026-10-14T09:31:29","slug":"how-to-attach-the-jenkins-build-log-as-part-of-the-email-body-2","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/how-to-attach-the-jenkins-build-log-as-part-of-the-email-body-2\/","title":{"rendered":"Jenkins Email-ext: Add Full or Regex-Filtered Build Logs to Email Body"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2015-10-03; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your team depends on Jenkins email alerts, putting the right build-log content in the email body can speed up incident triage. This guide explains how to use Email Extension (email-ext) content tokens for full logs and regex-filtered snippets, plus practical examples you can copy into job configuration or Pipeline.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2015\/10\/jenkins-build-log-as-part-o-1.png\" alt=\"Jenkins build log as part of email body\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Choose the right log-in-email strategy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are two common approaches: include the whole log, or include only matched lines (with context). The second option keeps emails concise when builds produce large output.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Token or link<\/th><th>What it adds to the email<\/th><th>Best for<\/th><th>Trade-off<\/th><\/tr><\/thead><tbody><tr><td><code>${BUILD_LOG, maxLines=9999, escapeHtml=false}<\/code><\/td><td>Full (or near-full) build console output<\/td><td>Small\/medium logs, immediate context<\/td><td>Can create very long and noisy emails<\/td><\/tr><tr><td><code>${BUILD_LOG_REGEX, ...}<\/code><\/td><td>Only lines matching a regex, optionally with lines before\/after<\/td><td>Failure summaries, error-first notifications<\/td><td>Needs careful regex tuning<\/td><\/tr><tr><td><code>${BUILD_URL}\/artifact\/<\/code><\/td><td>Link to build artifacts<\/td><td>Reports, logs, packaged outputs<\/td><td>Requires Jenkins access and artifact retention<\/td><\/tr><tr><td><code>${PROJECT_URL}\/ws\/<\/code><\/td><td>Link to workspace<\/td><td>Quick inspection in trusted\/internal environments<\/td><td>May be inaccessible or restricted by security settings<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How email-ext token rendering works in notifications<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When a job trigger fires an email-ext notification, Jenkins resolves tokens in the subject\/body and injects log content based on token parameters.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Build runs in Jenkins] --> B[Email trigger condition met]\n    B --> C[email-ext composes message]\n    C --> D{Token used in body}\n    D --> E[BUILD_LOG inserts full log]\n    D --> F[BUILD_LOG_REGEX filters by pattern]\n    E --> G[Email sent to recipients]\n    F --> G\n    G --> H[Team triages result]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Way 1: Include the full build log in the email body<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For freestyle-style configuration, place a <code>BUILD_LOG<\/code> token in the email-ext content field (for example, in Default Content or job-level editable email content).<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Open the job configuration and locate Email Extension settings.<\/li><li>Add the build-log token to the email body template.<\/li><li>Save and run a build to verify output length and readability.<\/li><\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-text\">${BUILD_LOG, maxLines=<span class=\"hljs-number\">9999<\/span>, escapeHtml=<span class=\"hljs-literal\">false<\/span>}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If your logs are large, reduce <code>maxLines<\/code> and consider <code>escapeHtml=true<\/code> to avoid accidental HTML rendering in messages.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Way 2: Include only specific lines with regex<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>BUILD_LOG_REGEX<\/code> to send only important lines (for example failures, specific error codes, or a small context window around matched patterns).<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-text\">${BUILD_LOG_REGEX, regex=<span class=\"hljs-string\">\"\\\\b(Buildfile|BUILD)\\\\b\"<\/span>, linesAfter=<span class=\"hljs-number\">1<\/span>}\n${BUILD_LOG_REGEX, regex=<span class=\"hljs-string\">\"^.*?BUILD FAILED.*?$\"<\/span>, linesBefore=<span class=\"hljs-number\">0<\/span>, linesAfter=<span class=\"hljs-number\">10<\/span>, maxMatches=<span class=\"hljs-number\">5<\/span>, showTruncatedLines=<span class=\"hljs-literal\">false<\/span>, escapeHtml=<span class=\"hljs-literal\">true<\/span>}\n${BUILD_LOG_REGEX, regex=<span class=\"hljs-string\">\"\\\\b(FC0)\\\\b\"<\/span>, linesAfter=<span class=\"hljs-number\">1<\/span>}\n${BUILD_LOG_REGEX, regex=<span class=\"hljs-string\">\"^.*?FC0.*?$\"<\/span>, maxMatches=<span class=\"hljs-number\">95<\/span>, showTruncatedLines=<span class=\"hljs-literal\">false<\/span>, escapeHtml=<span class=\"hljs-literal\">false<\/span>, matchedLineHtmlStyle=<span class=\"hljs-literal\">true<\/span>}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Regex parameter quick reference<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Parameter<\/th><th>Purpose<\/th><th>Typical usage<\/th><\/tr><\/thead><tbody><tr><td><code>regex<\/code><\/td><td>Pattern to match in console output<\/td><td>Find failure lines, warnings, IDs<\/td><\/tr><tr><td><code>linesBefore<\/code> \/ <code>linesAfter<\/code><\/td><td>Add context around each match<\/td><td>Show stack trace or command around error<\/td><\/tr><tr><td><code>maxMatches<\/code><\/td><td>Limit number of matched sections<\/td><td>Avoid oversized messages<\/td><\/tr><tr><td><code>showTruncatedLines<\/code><\/td><td>Control truncation markers<\/td><td>Keep output clean for readers<\/td><\/tr><tr><td><code>escapeHtml<\/code><\/td><td>Escape HTML-sensitive text<\/td><td>Safer rendering for email clients<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Useful tokens and formatting tips for email body templates<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-text\">${PROJECT_URL}\/ws\/\n${BUILD_URL}\/artifact\/\n${BUILD_LOG, maxLines=1000}<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">String-argument escaping in token parameters follows the original guidance: escape quotes and backslashes inside arguments. For HTML emails, line breaks are typically added with <code>&amp;lt;br&amp;gt;<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-text\">arg1=<span class=\"hljs-string\">\"\\\"quoted\\\"\"<\/span>; arg2=<span class=\"hljs-string\">\"c:\\\\path\"<\/span>; arg3=<span class=\"hljs-string\">\"one\\\\ntwo\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Pipeline example using emailext<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you send notifications from Jenkins Pipeline, you can keep tokenized content in the <code>emailext<\/code> body.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-groovy\">pipeline {\n  agent any\n  stages {\n    stage(<span class=\"hljs-string\">'Build'<\/span>) {\n      steps {\n        sh <span class=\"hljs-string\">'make test'<\/span>\n      }\n    }\n  }\n  post {\n    failure {\n      emailext(\n        subject: <span class=\"hljs-string\">\"Build failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}\"<\/span>,\n        to: <span class=\"hljs-string\">'team@example.com'<\/span>,\n        body: <span class=\"hljs-string\">''<\/span><span class=\"hljs-string\">'Build URL: ${BUILD_URL}&lt;br\/&gt;\nArtifacts: ${BUILD_URL}\/artifact\/&lt;br\/&gt;&lt;br\/&gt;\n${BUILD_LOG_REGEX, regex=\"^.*?BUILD FAILED.*?$\", linesBefore=0, linesAfter=15, maxMatches=5, escapeHtml=true}'<\/span><span class=\"hljs-string\">''<\/span>\n      )\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Original references<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/wiki.hudson-ci.org\/display\/HUDSON\/Email-ext+plugin\">http:\/\/wiki.hudson-ci.org\/display\/HUDSON\/Email-ext+plugin<\/a><\/li><li><a href=\"http:\/\/stackoverflow.com\/questions\/9439450\/how-will-i-filter-out-only-errors-in-jenkins-email-ext-build-log-regex\">http:\/\/stackoverflow.com\/questions\/9439450\/how-will-i-filter-out-only-errors-in-jenkins-email-ext-build-log-regex<\/a><\/li><li><a href=\"http:\/\/champasoft.blogspot.nl\/2012\/11\/jenkins-pattern-for-e-mailing-log.html\">http:\/\/champasoft.blogspot.nl\/2012\/11\/jenkins-pattern-for-e-mailing-log.html<\/a><\/li><li><a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Email-ext+plugin\">https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Email-ext+plugin<\/a><\/li><li>Original embed context mentioned this troubleshooting video link: <a href=\"https:\/\/www.youtube.com\/watch?v=ZCfrNvu6nMc\">https:\/\/www.youtube.com\/watch?v=ZCfrNvu6nMc<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Sending too many log lines can cause unreadable or clipped emails.<\/li><li>Using <code>escapeHtml=false<\/code> may render raw HTML from logs in email clients.<\/li><li>Regex patterns often fail due to missing escaping; validate on a sample failed build.<\/li><li>Workspace and artifact links depend on Jenkins URL configuration, permissions, and retention.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to include Jenkins build logs directly in notification emails using email-ext tokens. This revised guide covers full-log and regex-filtered approaches for freestyle jobs and Pipeline templates.<\/p>\n","protected":false},"author":1,"featured_media":3332,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[42],"tags":[1449,91,1451,1122,545,1454,145,1453,1455,984,1450,593,732,104,1452],"class_list":["post-437","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jenkins","tag-attach","tag-build","tag-email-body","tag-guide","tag-how","tag-how-to-attach-jenkins-build-log","tag-jenkins","tag-jenkins-build-log","tag-jenkins-build-log-in-email-body","tag-log","tag-part","tag-process","tag-steps","tag-tutorials","tag-ways"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=437"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/437\/revisions"}],"predecessor-version":[{"id":79309,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/437\/revisions\/79309"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3332"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}