Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save beanvuvanhau/a2d2157148d755d3a576a7b3165d7806 to your computer and use it in GitHub Desktop.
Save beanvuvanhau/a2d2157148d755d3a576a7b3165d7806 to your computer and use it in GitHub Desktop.
Log Validation Results
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Log Validation Report</title>
<script>
/*!
* Chart.js v4.4.9
* https://www.chartjs.org
* (c) 2025 Chart.js Contributors
* Released under the MIT License
*/
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return Zo},get Decimation(){return ta},get Filler(){return xa},get Legend(){return va},get SubTitle(){return Sa},get Title(){return wa},get Tooltip(){return Wa}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<r;a++)e.call(i,t[a],a);else if(o(t))for(l=Object.keys(t),r=l.length,a=0;a<r;a++)e.call(i,t[l[a]],l[a])}function f(t,e){let i,s,n,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,s=t.length;i<s;++i)if(n=t[i],o=e[i],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function g(t){if(n(t))return t.map(g);if(o(t)){const e=Object.create(null),i=Object.keys(t),s=i.length;let n=0;for(;n<s;++n)e[i[n]]=g(t[i[n]]);return e}return t}function p(t){return-1==["__proto__","prototype","constructor"].indexOf(t)}function m(t,e,i,s){if(!p(t))return;const a=Object.getOwnPropertyDescriptor(t,e);a&&!a.configurable||(a&&a.get&&!a.set?delete t[e]:Object.defineProperty(t,e,{value:i,writable:!0,enumerable:!0,configurable:!0}))}function x(t,e,i){const s=n(e)?e:[e],a=s.length;if(!o(t))return t;const r=(i=i||{}).merger||m;let l;for(let h=0;h<a;++h)if(l=s[h],o(l))for(const c in l)r(t,c,l[c],i);return t}function b(t,e){return x(t,e,{merger:_})}function _(t,e,i){if(!p(t))return;const s=Object.getOwnPropertyDescriptor(t,e);s&&!s.configurable||(s&&s.get&&!s.set?delete t[e]:Object.defineProperty(t,e,{value:i,writable:!0,enumerable:!0,configurable:!0}))}const y={x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)<i}function b(t){const e=Math.round(t);t=V(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(z(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function w(t){const e=[];let i,s;for(i=1;i<t;i++)t%i==0&&(e.push(i),e.push(t/i));return e.sort(((t,e)=>t-e)).pop(),e}function N(t){return!function(t){return"symbol"==typeof t||"object"==typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function $(t){return t*(C/180)}function y(t){return t*(180/C)}function u(t){if(!a(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function x(t,e){const i=e.x-t.x,s=e.y-t.y,n=Math.sqrt(i*i+s*s);let o=Math.atan2(s,i);return o<-.5*C&&(o+=O),{angle:o,distance:n}}function q(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function k(t,e){return(t-e+A)%O-C}function g(t){return(t%O+O)%O}function z(t,e,i,s){const n=G(t),o=G(e),a=G(i),r=G(o-n),l=G(a-n),h=G(n-o),c=G(n-a);return r>l&&h<c}function j(t,e,i){return Math.max(e,Math.min(i,t))}function q(t){return j(t,-32768,32767)}function tt(t,e,i,s=1e-6){return t>=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]<e);let s,n=t.length-1,o=0;for(;n-o>1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return n<i||n===i&&t[s+1][e]===i}:s=>t[s][e]<i),st=(t,e,i)=>e...(truncated)...});</script>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
h1, h2 {
color: #2c3e50;
}
.product {
border: 1px solid #ccc;
border-radius: 8px;
margin-bottom: 20px;
padding: 15px;
}
.services {
font-style: italic;
color: #555;
margin-bottom: 10px;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
}
th, td {
padding: 6px 8px;
border: 1px solid #ddd;
text-align: left;
font-size: 13px;
}
th {
background-color: #f4f4f4;
}
.failed {
color: red;
font-weight: bold;
}
.success {
color: green;
}
.summary {
margin-bottom: 20px;
}
.report-info {
background-color: #f8f9fa;
border: 1px solid #e9ecef;
border-radius: 8px;
padding: 15px;
margin-bottom: 20px;
}
.report-info p {
margin: 5px 0;
color: #495057;
}
.report-info .label {
font-weight: bold;
color: #2c3e50;
}
.stats-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin-top: 20px;
}
.stat-box {
flex: 1;
min-width: 200px;
background: #fff;
border: 1px solid #e9ecef;
border-radius: 8px;
padding: 15px;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
}
.stat-title {
font-size: 14px;
color: #6c757d;
margin-bottom: 10px;
}
.stat-value {
font-size: 24px;
font-weight: bold;
color: #2c3e50;
margin-bottom: 10px;
}
.stat-bar {
height: 8px;
background: #e9ecef;
border-radius: 4px;
overflow: hidden;
}
.stat-bar-fill {
height: 100%;
border-radius: 4px;
transition: width 0.3s ease;
}
.stat-bar-products { background-color: #9b59b6; }
.stat-bar-services { background-color: #3498db; }
.stat-bar-success { background-color: #2ecc71; }
.stat-bar-failed { background-color: #e74c3c; }
</style>
</head>
<body>
<h1>πŸ“‹ Log Validation Summary Report</h1>
<div class="report-info">
<p><span class="label">Date:</span> 2025-05-20-11-48</p>
<p><span class="label">Environment:</span> Production</p>
</div>
<div class="summary">
<h2>πŸ“Š Summary Overview</h2>
<div class="stats-container">
<div class="stat-box">
<div class="stat-title">Products</div>
<div class="stat-value">1</div>
<div class="stat-bar">
<div class="stat-bar-fill stat-bar-products" style="width: 100%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Services</div>
<div class="stat-value">1</div>
<div class="stat-bar">
<div class="stat-bar-fill stat-bar-services" style="width: 100%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Success Rules</div>
<div class="stat-value">3</div>
<div class="stat-bar">
<div class="stat-bar-fill stat-bar-success" style="width: 100%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Failed Rules</div>
<div class="stat-value">0</div>
<div class="stat-bar">
<div class="stat-bar-fill stat-bar-failed" style="width: 0%"></div>
</div>
</div>
</div>
</div>
<div class="product">
<h2>Product: asset-accounting</h2>
<p class="services">Services: asset-accounting-backend</p>
<table>
<tr>
<th>Rule</th>
<th>Success</th>
<th>Failed</th>
<th>Failed Services</th>
</tr>
<tr>
<td>Rule 1 - Log Format</td>
<td class="success">1</td>
<td class="success">0</td>
<td>–</td>
</tr>
<tr>
<td>Rule 2 - Log Parameters</td>
<td class="success">1</td>
<td class="success">0</td>
<td>–</td>
</tr>
<tr>
<td>Rule 3 - Log Sensitive Data</td>
<td class="success">1</td>
<td class="success">0</td>
<td>–</td>
</tr>
</table>
</div>
<script>
const ctx = document.getElementById('summaryChart').getContext('2d');
const totalProducts = 1;
const totalServices = 1;
const totalSuccess = 3;
const totalFailed = 0;
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Product Count', 'Services Count', 'Success Rule Count', 'Failed Rule Count'],
datasets: [{
label: 'Log Summary',
data: [totalProducts, totalServices, totalSuccess, totalFailed],
backgroundColor: ['#9b59b6', '#3498db', '#2ecc71', '#e74c3c']
}]
},
options: {
responsive: false,
plugins: {
legend: { display: false }
},
scales: {
y: {
beginAtZero: true,
ticks: {
precision: 0,
font: { size: 12 }
}
},
x: {
ticks: { font: { size: 12 } }
}
}
}
});
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment