diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index b5a8193..c0e6546 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -72,9 +72,9 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - tag-match: '\d{1,3}.\d{1,3}.\d{1,3}'
+          - tag-match: '\d.\d.\d'
             tag-match-group: '0'
-          - tag-match: '\d{1,3}.\d{1,3}'
+          - tag-match: '\d.\d'
             tag-match-group: '0'
           - tag-match: 'v(.*)'
             tag-match-group: '1'
diff --git a/README.md b/README.md
index 9a164ff..f045b1e 100644
--- a/README.md
+++ b/README.md
@@ -420,9 +420,7 @@ tags: |
 ```yaml
 tags: |
   # minimal
-  type=match,pattern=\d{8}
-  # double quotes if comma in pattern
-  type=match,"pattern=\d{1,3}.\d{1,3}.\d{1,3}"
+  type=match,pattern=\d.\d.\d
   # define match group
   type=match,pattern=v(.*),group=1
   # use custom value instead of git tag
@@ -435,7 +433,7 @@ a custom value through `value` attribute.
 
 | Git tag                 | Pattern                       | Group   | Output                 |
 |-------------------------|-------------------------------|---------|------------------------|
-| `v1.2.3`                | `\d{1,3}.\d{1,3}.\d{1,3}`     | `0`     | `1.2.3`                |
+| `v1.2.3`                | `\d.\d.\d`                    | `0`     | `1.2.3`                |
 | `v2.0.8-beta.67`        | `v(.*)`                       | `1`     | `2.0.8-beta.67`        |
 | `v2.0.8-beta.67`        | `v(\d.\d)`                    | `1`     | `2.0`                  |
 | `20200110-RC2`          | `\d+`                         | `0`     | `20200110`             |
diff --git a/__tests__/meta.test.ts b/__tests__/meta.test.ts
index 1d65fde..274613a 100644
--- a/__tests__/meta.test.ts
+++ b/__tests__/meta.test.ts
@@ -713,7 +713,7 @@ describe('tag', () => {
       {
         images: ['org/app', 'ghcr.io/user/app'],
         tags: [
-          `type=match,"pattern=\\d{1,3}.\\d{1,3}.\\d{1,3}"`
+          `type=match,"pattern=\\d.\\d.\\d"`
         ]
       } as Inputs,
       {
@@ -744,7 +744,7 @@ describe('tag', () => {
       {
         images: ['org/app', 'ghcr.io/user/app'],
         tags: [
-          `type=match,"pattern=^v(\\d{1,3}.\\d{1,3}.\\d{1,3})$",group=1`
+          `type=match,"pattern=^v(\\d.\\d.\\d)$",group=1`
         ]
       } as Inputs,
       {
@@ -775,7 +775,7 @@ describe('tag', () => {
       {
         images: ['org/app', 'ghcr.io/user/app'],
         tags: [
-          `type=match,"pattern=\\d{1,3}.\\d{1,3}.\\d{1,3}-(alpha|beta).\\d{1,3}"`
+          `type=match,"pattern=\\d.\\d.\\d-(alpha|beta).\\d+"`
         ]
       } as Inputs,
       {
@@ -806,7 +806,7 @@ describe('tag', () => {
       {
         images: ['org/app', 'ghcr.io/user/app'],
         tags: [
-          `type=match,"pattern=\\d{1,3}.\\d{1,3}"`
+          `type=match,"pattern=\\d.\\d"`
         ]
       } as Inputs,
       {
@@ -837,7 +837,7 @@ describe('tag', () => {
       {
         images: ['org/app', 'ghcr.io/user/app'],
         tags: [
-          `type=match,"pattern=/^v(\\d{1,3}.\\d{1,3}.\\d{1,3})$/ig",group=1`,
+          `type=match,"pattern=/^v(\\d.\\d.\\d)$/ig",group=1`,
         ]
       } as Inputs,
       {
@@ -866,7 +866,7 @@ describe('tag', () => {
       {
         images: ['org/app', 'ghcr.io/user/app'],
         tags: [
-          `type=match,"pattern=\\d{1,3}.\\d{1,3}"`
+          `type=match,"pattern=\\d.\\d"`
         ]
       } as Inputs,
       {
@@ -1030,7 +1030,7 @@ describe('tag', () => {
         tags: [
           `type=raw,priority=2000,foo`,
           `type=semver,pattern={{version}}`,
-          `type=match,"pattern=\\d{1,3}.\\d{1,3}"`
+          `type=match,"pattern=\\d.\\d"`
         ]
       } as Inputs,
       {
@@ -1189,7 +1189,7 @@ describe('latest', () => {
       {
         images: ['user/app'],
         tags: [
-          `type=match,"pattern=\\d{1,3}.\\d{1,3}.\\d{1,3}"`
+          `type=match,"pattern=\\d.\\d.\\d"`
         ]
       } as Inputs,
       {
@@ -1246,7 +1246,7 @@ describe('latest', () => {
       {
         images: ['org/app', 'ghcr.io/user/app'],
         tags: [
-          `type=match,"pattern=\\d{1,3}.\\d{1,3}.\\d{1,3}"`
+          `type=match,"pattern=\\d.\\d.\\d"`
         ]
       } as Inputs,
       {
diff --git a/__tests__/tag.test.ts b/__tests__/tag.test.ts
index 826eb0f..8032af8 100644
--- a/__tests__/tag.test.ts
+++ b/__tests__/tag.test.ts
@@ -13,7 +13,7 @@ describe('transform', () => {
         `type=raw,foo`,
         `type=edge`,
         `type=semver,pattern={{version}}`,
-        `type=match,"pattern=\\d{1,3}.\\d{1,3}.\\d{1,3}"`
+        `type=match,"pattern=\\d.\\d.\\d",group=0`
       ],
       [
         {
@@ -44,7 +44,7 @@ describe('transform', () => {
             "enable": "true",
             "prefix": "",
             "suffix": "",
-            "pattern": "\\d{1,3}.\\d{1,3}.\\d{1,3}",
+            "pattern": "\\d.\\d.\\d",
             "group": "0",
             "value": ""
           }
@@ -204,7 +204,7 @@ describe('parse', () => {
       false
     ],
     [
-      `type=match,enable=true,"pattern=^v(\\d{1,3}.\\d{1,3}.\\d{1,3})$",group=1`,
+      `type=match,enable=true,"pattern=^v(\\d.\\d.\\d)$",group=1`,
       {
         type: Type.Match,
         attrs: {
@@ -212,7 +212,7 @@ describe('parse', () => {
           "enable": "true",
           "prefix": "",
           "suffix": "",
-          "pattern": "^v(\\d{1,3}.\\d{1,3}.\\d{1,3})$",
+          "pattern": "^v(\\d.\\d.\\d)$",
           "group": "1",
           "value": ""
         }
diff --git a/dist/index.js b/dist/index.js
index b21ab7b..e6f99e7 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -99,12 +99,32 @@ exports.asyncForEach = (array, callback) => __awaiter(void 0, void 0, void 0, fu
 /***/ }),
 
 /***/ 3716:
-/***/ ((__unused_webpack_module, exports) => {
+/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
 
 "use strict";
 
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
 Object.defineProperty(exports, "__esModule", ({ value: true }));
 exports.Transform = void 0;
+const core = __importStar(__webpack_require__(2186));
 function Transform(inputs) {
     const flavor = {
         latest: 'auto',
@@ -137,6 +157,11 @@ function Transform(inputs) {
             }
         }
     }
+    core.startGroup(`Processing flavor input`);
+    core.info(`latest=${flavor.latest}`);
+    core.info(`prefix=${flavor.prefix}`);
+    core.info(`suffix=${flavor.suffix}`);
+    core.endGroup();
     return flavor;
 }
 exports.Transform = Transform;
@@ -690,12 +715,32 @@ exports.Meta = Meta;
 
 "use strict";
 
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
 var __importDefault = (this && this.__importDefault) || function (mod) {
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.Parse = exports.Transform = exports.DefaultPriorities = exports.RefEvent = exports.Type = void 0;
+exports.Parse = exports.Transform = exports.DefaultPriorities = exports.Tag = exports.RefEvent = exports.Type = void 0;
 const sync_1 = __importDefault(__webpack_require__(8750));
+const core = __importStar(__webpack_require__(2186));
 var Type;
 (function (Type) {
     Type["Schedule"] = "schedule";
@@ -712,6 +757,19 @@ var RefEvent;
     RefEvent["Tag"] = "tag";
     RefEvent["PR"] = "pr";
 })(RefEvent = exports.RefEvent || (exports.RefEvent = {}));
+class Tag {
+    constructor() {
+        this.attrs = {};
+    }
+    toString() {
+        const out = [`type=${this.type}`];
+        for (let attr in this.attrs) {
+            out.push(`${attr}=${this.attrs[attr]}`);
+        }
+        return out.join(',');
+    }
+}
+exports.Tag = Tag;
 exports.DefaultPriorities = {
     [Type.Schedule]: '1000',
     [Type.Semver]: '900',
@@ -735,7 +793,7 @@ function Transform(inputs) {
     for (const input of inputs) {
         tags.push(Parse(input));
     }
-    return tags.sort((tag1, tag2) => {
+    const sorted = tags.sort((tag1, tag2) => {
         if (Number(tag1.attrs['priority']) < Number(tag2.attrs['priority'])) {
             return 1;
         }
@@ -744,6 +802,12 @@ function Transform(inputs) {
         }
         return 0;
     });
+    core.startGroup(`Processing tags input`);
+    for (const tag of sorted) {
+        core.info(tag.toString());
+    }
+    core.endGroup();
+    return sorted;
 }
 exports.Transform = Transform;
 function Parse(s) {
@@ -751,9 +815,7 @@ function Parse(s) {
         relaxColumnCount: true,
         skipLinesWithEmptyValues: true
     })[0];
-    const tag = {
-        attrs: {}
-    };
+    const tag = new Tag();
     for (const field of fields) {
         const parts = field.toString().split('=', 2);
         if (parts.length == 1) {
diff --git a/src/flavor.ts b/src/flavor.ts
index 3ae13b7..40b02d3 100644
--- a/src/flavor.ts
+++ b/src/flavor.ts
@@ -1,3 +1,5 @@
+import * as core from '@actions/core';
+
 export interface Flavor {
   latest: string;
   prefix: string;
@@ -38,5 +40,11 @@ export function Transform(inputs: string[]): Flavor {
     }
   }
 
+  core.startGroup(`Processing flavor input`);
+  core.info(`latest=${flavor.latest}`);
+  core.info(`prefix=${flavor.prefix}`);
+  core.info(`suffix=${flavor.suffix}`);
+  core.endGroup();
+
   return flavor;
 }
diff --git a/src/tag.ts b/src/tag.ts
index 0a935d1..b27e726 100644
--- a/src/tag.ts
+++ b/src/tag.ts
@@ -1,4 +1,5 @@
 import csvparse from 'csv-parse/lib/sync';
+import * as core from '@actions/core';
 
 export enum Type {
   Schedule = 'schedule',
@@ -16,9 +17,21 @@ export enum RefEvent {
   PR = 'pr'
 }
 
-export interface Tag {
-  type: Type;
-  attrs: Record<string, string>;
+export class Tag {
+  public type?: Type;
+  public attrs: Record<string, string>;
+
+  constructor() {
+    this.attrs = {};
+  }
+
+  public toString(): string {
+    const out: string[] = [`type=${this.type}`];
+    for (let attr in this.attrs) {
+      out.push(`${attr}=${this.attrs[attr]}`);
+    }
+    return out.join(',');
+  }
 }
 
 export const DefaultPriorities: Record<Type, string> = {
@@ -42,10 +55,11 @@ export function Transform(inputs: string[]): Tag[] {
       `type=ref,event=${RefEvent.PR}`
     ];
   }
+
   for (const input of inputs) {
     tags.push(Parse(input));
   }
-  return tags.sort((tag1, tag2) => {
+  const sorted = tags.sort((tag1, tag2) => {
     if (Number(tag1.attrs['priority']) < Number(tag2.attrs['priority'])) {
       return 1;
     }
@@ -54,6 +68,14 @@ export function Transform(inputs: string[]): Tag[] {
     }
     return 0;
   });
+
+  core.startGroup(`Processing tags input`);
+  for (const tag of sorted) {
+    core.info(tag.toString());
+  }
+  core.endGroup();
+
+  return sorted;
 }
 
 export function Parse(s: string): Tag {
@@ -62,10 +84,7 @@ export function Parse(s: string): Tag {
     skipLinesWithEmptyValues: true
   })[0];
 
-  const tag = {
-    attrs: {}
-  } as Tag;
-
+  const tag = new Tag();
   for (const field of fields) {
     const parts = field.toString().split('=', 2);
     if (parts.length == 1) {