logster 2.12.1 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +5 -0
- data/.streerc +2 -0
- data/CHANGELOG.md +10 -1
- data/Gemfile +1 -1
- data/assets/javascript/{chunk.143.2faa04830259ce9aa59a.js → chunk.143.91d07e8cdd5c4b9e4731.js} +4 -4
- data/assets/javascript/{chunk.178.ca5ade1d8cbdbfbe6d72.js → chunk.178.16d0c9057345120bdba1.js} +3 -3
- data/assets/javascript/client-app.js +4 -2
- data/client-app/app/components/back-trace.js +4 -0
- data/client-app/package.json +1 -1
- data/client-app/preload-json-manager.rb +10 -17
- data/client-app/tests/integration/components/back-trace-test.js +17 -0
- data/client-app/yarn.lock +22 -22
- data/lib/examples/sidekiq_logster_reporter.rb +5 -7
- data/lib/logster/base_store.rb +26 -22
- data/lib/logster/cache.rb +2 -1
- data/lib/logster/configuration.rb +3 -3
- data/lib/logster/defer_logger.rb +2 -4
- data/lib/logster/group.rb +17 -20
- data/lib/logster/ignore_pattern.rb +1 -2
- data/lib/logster/logger.rb +18 -16
- data/lib/logster/message.rb +53 -57
- data/lib/logster/middleware/debug_exceptions.rb +12 -10
- data/lib/logster/middleware/reporter.rb +17 -26
- data/lib/logster/middleware/viewer.rb +77 -97
- data/lib/logster/pattern.rb +4 -7
- data/lib/logster/rails/railtie.rb +10 -13
- data/lib/logster/redis_rate_limiter.rb +2 -7
- data/lib/logster/redis_store.rb +79 -99
- data/lib/logster/scheduler.rb +1 -5
- data/lib/logster/suppression_pattern.rb +7 -5
- data/lib/logster/version.rb +1 -1
- data/lib/logster/web.rb +1 -1
- data/lib/logster.rb +15 -17
- data/logster.gemspec +14 -14
- data/test/examples/test_sidekiq_reporter_example.rb +8 -9
- data/test/fake_data/generate.rb +14 -3
- data/test/logster/middleware/test_reporter.rb +9 -7
- data/test/logster/middleware/test_viewer.rb +117 -101
- data/test/logster/test_base_store.rb +79 -58
- data/test/logster/test_cache.rb +5 -11
- data/test/logster/test_defer_logger.rb +3 -3
- data/test/logster/test_group.rb +14 -18
- data/test/logster/test_ignore_pattern.rb +2 -3
- data/test/logster/test_logger.rb +14 -14
- data/test/logster/test_message.rb +29 -31
- data/test/logster/test_pattern.rb +7 -15
- data/test/logster/test_redis_rate_limiter.rb +35 -21
- data/test/logster/test_redis_store.rb +239 -151
- data/test/test_helper.rb +9 -9
- metadata +19 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b69420ed949004c6a66f47104e4a0e7e2849038230ae775f8c60d3f5a38dd08d
         | 
| 4 | 
            +
              data.tar.gz: feb7b7e9f010b4e817a85cea34f5b631219645f4865ff3dc693a845adbebd916
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 4c066d38fad5f96b100052151126c476e911d969f35805e8853fbb605ca2c31a9ddcc7049452f652a9b6b8ca073c45c0c71a9c45030d866d090d4c023f2f1243
         | 
| 7 | 
            +
              data.tar.gz: 889cc20bb7e373ef89ee81b70d29d4bf0d8d7465c965be8250f26bc6111c8df5c83eb75e439e5ee4c254666a5cc7db849132849926ce84928f70bc5a67dff3d6
         | 
    
        data/.github/workflows/ci.yml
    CHANGED
    
    | @@ -92,6 +92,11 @@ jobs: | |
| 92 92 | 
             
                    working-directory: client-app
         | 
| 93 93 | 
             
                    run: yarn install
         | 
| 94 94 |  | 
| 95 | 
            +
                  - name: Syntax Tree
         | 
| 96 | 
            +
                    if: ${{ !cancelled() }}
         | 
| 97 | 
            +
                    run: |
         | 
| 98 | 
            +
                        bundle exec stree check Gemfile $(git ls-files '*.rb') $(git ls-files '*.rake') $(git ls-files '*.thor')
         | 
| 99 | 
            +
             | 
| 95 100 | 
             
                  - name: JS linting
         | 
| 96 101 | 
             
                    if: ${{ !cancelled() }}
         | 
| 97 102 | 
             
                    working-directory: client-app
         | 
    
        data/.streerc
    ADDED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,6 +1,15 @@ | |
| 1 1 | 
             
            # CHANGELOG
         | 
| 2 2 |  | 
| 3 | 
            -
            - 2023- | 
| 3 | 
            +
            - 2023-10-03: 2.13.0
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              - FEATURE: Format messages with Logster::Logger#formatter before storing
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            - 2023-03-10: 2.12.2
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              - FIX: Don't throw on non-gem backtrace lines
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            - 2023-03-10: 2.12.1
         | 
| 12 | 
            +
              Note: 2.12.0 was yanked due to a release process error
         | 
| 4 13 |  | 
| 5 14 | 
             
              - DEV: Upgrade to Ember 3.28
         | 
| 6 15 |  | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/assets/javascript/{chunk.143.2faa04830259ce9aa59a.js → chunk.143.91d07e8cdd5c4b9e4731.js}
    RENAMED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            var __ember_auto_import__
         | 
| 2 | 
            -
            !function(){var e,r={ | 
| 3 | 
            -
            e.exports=(o=_eai_d,t=_eai_r,window.emberAutoImportDynamic=function(e){return 1===arguments.length?t("_eai_dyn_"+e):t("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return t("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},o("__v1-addons__early-boot-set__",[],(function(){})),void o("sinon",["__v1-addons__early-boot-set__"],(function(){return n(468)})))}, | 
| 2 | 
            +
            !function(){var e,r={29:function(e,r,n){var o,t
         | 
| 3 | 
            +
            e.exports=(o=_eai_d,t=_eai_r,window.emberAutoImportDynamic=function(e){return 1===arguments.length?t("_eai_dyn_"+e):t("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return t("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},o("__v1-addons__early-boot-set__",[],(function(){})),void o("sinon",["__v1-addons__early-boot-set__"],(function(){return n(468)})))},236:function(e,r){window._eai_r=require,window._eai_d=define}},n={}
         | 
| 4 4 | 
             
            function o(e){var t=n[e]
         | 
| 5 5 | 
             
            if(void 0!==t)return t.exports
         | 
| 6 6 | 
             
            var i=n[e]={exports:{}}
         | 
| @@ -17,6 +17,6 @@ var r=function(r,n){var t,i,u=n[0],_=n[1],a=n[2],f=0 | |
| 17 17 | 
             
            if(u.some((function(r){return 0!==e[r]}))){for(t in _)o.o(_,t)&&(o.m[t]=_[t])
         | 
| 18 18 | 
             
            if(a)var c=a(o)}for(r&&r(n);f<u.length;f++)i=u[f],o.o(e,i)&&e[i]&&e[i][0](),e[i]=0
         | 
| 19 19 | 
             
            return o.O(c)},n=self.webpackChunk_ember_auto_import_=self.webpackChunk_ember_auto_import_||[]
         | 
| 20 | 
            -
            n.forEach(r.bind(null,0)),n.push=r.bind(null,n.push.bind(n))}(),o.O(void 0,[468],(function(){return o( | 
| 21 | 
            -
            var t=o.O(void 0,[468],(function(){return o( | 
| 20 | 
            +
            n.forEach(r.bind(null,0)),n.push=r.bind(null,n.push.bind(n))}(),o.O(void 0,[468],(function(){return o(236)}))
         | 
| 21 | 
            +
            var t=o.O(void 0,[468],(function(){return o(29)}))
         | 
| 22 22 | 
             
            t=o.O(t),__ember_auto_import__=t}()
         | 
    
        data/assets/javascript/{chunk.178.ca5ade1d8cbdbfbe6d72.js → chunk.178.16d0c9057345120bdba1.js}
    RENAMED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            var __ember_auto_import__
         | 
| 2 | 
            -
            !function(){var r,n={ | 
| 2 | 
            +
            !function(){var r,n={236:function(r,n){window._eai_r=require,window._eai_d=define},531:function(r,n,e){var t,o
         | 
| 3 3 | 
             
            r.exports=(t=_eai_d,o=_eai_r,window.emberAutoImportDynamic=function(r){return 1===arguments.length?o("_eai_dyn_"+r):o("_eai_dynt_"+r)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(r){return o("_eai_sync_"+r)(Array.prototype.slice.call(arguments,1))},t("__v1-addons__early-boot-set__",[],(function(){})),void t("qunit",["__v1-addons__early-boot-set__"],(function(){return e(916)})))}},e={}
         | 
| 4 4 | 
             
            function t(r){var o=e[r]
         | 
| 5 5 | 
             
            if(void 0!==o)return o.exports
         | 
| @@ -17,6 +17,6 @@ var n=function(n,e){var o,i,_=e[0],u=e[1],a=e[2],c=0 | |
| 17 17 | 
             
            if(_.some((function(n){return 0!==r[n]}))){for(o in u)t.o(u,o)&&(t.m[o]=u[o])
         | 
| 18 18 | 
             
            if(a)var f=a(t)}for(n&&n(e);c<_.length;c++)i=_[c],t.o(r,i)&&r[i]&&r[i][0](),r[i]=0
         | 
| 19 19 | 
             
            return t.O(f)},e=self.webpackChunk_ember_auto_import_=self.webpackChunk_ember_auto_import_||[]
         | 
| 20 | 
            -
            e.forEach(n.bind(null,0)),e.push=n.bind(null,e.push.bind(e))}(),t.O(void 0,[916],(function(){return t( | 
| 21 | 
            -
            var o=t.O(void 0,[916],(function(){return t( | 
| 20 | 
            +
            e.forEach(n.bind(null,0)),e.push=n.bind(null,e.push.bind(e))}(),t.O(void 0,[916],(function(){return t(236)}))
         | 
| 21 | 
            +
            var o=t.O(void 0,[916],(function(){return t(531)}))
         | 
| 22 22 | 
             
            o=t.O(o),__ember_auto_import__=o}()
         | 
| @@ -86,7 +86,9 @@ return Array.isArray(this.env)?e=this.env.map((function(e){return e.application_ | |
| 86 86 | 
             
            return this.backtrace&&0!==this.backtrace.length?this.backtrace.split("\n").map((function(t){var r=function(e){if(e.startsWith(n.default.get("gems_dir"))){var t=n.default.get("gems_dir")
         | 
| 87 87 | 
             
            return e.substring(t.length)}return e}(t)
         | 
| 88 88 | 
             
            return{line:r,url:e.findGithubURL(t,r)}})):[]}},{key:"githubURLForGem",value:function(e){if(!n.default.get("backtrace_links_enabled"))return null
         | 
| 89 | 
            -
            var t=c(e.match(/([^/]+)\/(.+\/)(.+):(\d+):.*/)||[],5),r=t[1],o=t[2],i=t[3],a=t[4] | 
| 89 | 
            +
            var t=c(e.match(/([^/]+)\/(.+\/)(.+):(\d+):.*/)||[],5),r=t[1],o=t[2],i=t[3],a=t[4]
         | 
| 90 | 
            +
            if(!r)return null
         | 
| 91 | 
            +
            var u=n.default.get("gems_data").filter((function(e){return r.startsWith("".concat(e.name,"-"))})).sortBy("name.length").reverse()[0]
         | 
| 90 92 | 
             
            return u?h({repo:u.url,path:o,filename:i,lineNumber:a}):null}},{key:"githubURLForApp",value:function(e){if(!n.default.get("backtrace_links_enabled"))return null
         | 
| 91 93 | 
             
            var t=n.default.get("directories").filter((function(t){return e.startsWith(t.path)})).sortBy("path.length").reverse()[0]
         | 
| 92 94 | 
             
            if(!t)return null
         | 
| @@ -1279,4 +1281,4 @@ var r=(0,t.createTemplateFactory)({id:"qqSpoh9d",block:'[[[10,0],[14,0,"settings | |
| 1279 1281 | 
             
            e.default=r})),define("client-app/templates/show",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
         | 
| 1280 1282 | 
             
            var r=(0,t.createTemplateFactory)({id:"Wi+UDSYU",block:'[[[8,[39,0],[[24,0,"recent-link"]],[["@route"],["index"]],[["default"],[[[[1,"Recent"]],[]]]]],[1,"\\n\\n"],[10,0],[14,1,"bottom-panel"],[14,0,"full"],[12],[1,"\\n  "],[8,[39,1],null,[["@currentMessage","@showTitle","@envChangedAction","@currentEnvPosition","@actionsInMenu"],[[30,0,["model"]],"true",[30,0,["envChanged"]],[30,0,["envPosition"]],false]],null],[1,"\\n"],[13]],[],false,["link-to","message-info"]]',moduleName:"client-app/templates/show.hbs",isStrictMode:!1})
         | 
| 1281 1283 | 
             
            e.default=r})),define("client-app/config/environment",[],(function(){try{var e="client-app/config/environment",t=document.querySelector('meta[name="'+e+'"]').getAttribute("content"),r={default:JSON.parse(decodeURIComponent(t))}
         | 
| 1282 | 
            -
            return Object.defineProperty(r,"__esModule",{value:!0}),r}catch(n){throw new Error('Could not read config from meta tag with name "'+e+'".')}})),runningTests||require("client-app/app").default.create({name:"client-app",version:"0.0.0+ | 
| 1284 | 
            +
            return Object.defineProperty(r,"__esModule",{value:!0}),r}catch(n){throw new Error('Could not read config from meta tag with name "'+e+'".')}})),runningTests||require("client-app/app").default.create({name:"client-app",version:"0.0.0+1c8d3d18"})
         | 
| @@ -76,6 +76,10 @@ export default class BackTrace extends Component { | |
| 76 76 |  | 
| 77 77 | 
             
                const regexResults = line.match(/([^/]+)\/(.+\/)(.+):(\d+):.*/);
         | 
| 78 78 | 
             
                const [, gemWithVersion, path, filename, lineNumber] = regexResults || [];
         | 
| 79 | 
            +
                if (!gemWithVersion) {
         | 
| 80 | 
            +
                  return null;
         | 
| 81 | 
            +
                }
         | 
| 82 | 
            +
             | 
| 79 83 | 
             
                const gemsData = Preloaded.get("gems_data");
         | 
| 80 84 | 
             
                const match = gemsData
         | 
| 81 85 | 
             
                  .filter((g) => gemWithVersion.startsWith(`${g.name}-`))
         | 
    
        data/client-app/package.json
    CHANGED
    
    
| @@ -3,13 +3,13 @@ | |
| 3 3 | 
             
            # This script takes care of updating the content of the preloaded json in tests/index.html
         | 
| 4 4 | 
             
            # All you need to do is update the `tests_index_html` hash and run the script
         | 
| 5 5 |  | 
| 6 | 
            -
            require  | 
| 7 | 
            -
            require  | 
| 8 | 
            -
            require  | 
| 6 | 
            +
            require "bundler/inline"
         | 
| 7 | 
            +
            require "json"
         | 
| 8 | 
            +
            require "cgi"
         | 
| 9 9 |  | 
| 10 10 | 
             
            gemfile do
         | 
| 11 | 
            -
              source  | 
| 12 | 
            -
              gem  | 
| 11 | 
            +
              source "https://rubygems.org"
         | 
| 12 | 
            +
              gem "nokogiri"
         | 
| 13 13 | 
             
            end
         | 
| 14 14 |  | 
| 15 15 | 
             
            tests_index_html = {
         | 
| @@ -17,23 +17,16 @@ tests_index_html = { | |
| 17 17 | 
             
              gems_dir: "/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/",
         | 
| 18 18 | 
             
              backtrace_links_enabled: true,
         | 
| 19 19 | 
             
              gems_data: [
         | 
| 20 | 
            -
                {
         | 
| 21 | 
            -
                  name: "activerecord",
         | 
| 22 | 
            -
                  url: "https://github.com/rails/rails/tree/v6.0.1/activerecord"
         | 
| 23 | 
            -
                }
         | 
| 20 | 
            +
                { name: "activerecord", url: "https://github.com/rails/rails/tree/v6.0.1/activerecord" },
         | 
| 24 21 | 
             
              ],
         | 
| 25 22 | 
             
              directories: [
         | 
| 26 | 
            -
                {
         | 
| 27 | 
            -
                  path: "/var/www/discourse",
         | 
| 28 | 
            -
                  url: "https://github.com/discourse/discourse",
         | 
| 29 | 
            -
                  main_app: true
         | 
| 30 | 
            -
                },
         | 
| 23 | 
            +
                { path: "/var/www/discourse", url: "https://github.com/discourse/discourse", main_app: true },
         | 
| 31 24 | 
             
                {
         | 
| 32 25 | 
             
                  path: "/var/www/discourse/plugins/discourse-prometheus",
         | 
| 33 | 
            -
                  url: "https://github.com/discourse/discourse-prometheus"
         | 
| 34 | 
            -
                }
         | 
| 26 | 
            +
                  url: "https://github.com/discourse/discourse-prometheus",
         | 
| 27 | 
            +
                },
         | 
| 35 28 | 
             
              ],
         | 
| 36 | 
            -
              application_version: "ce512452b512b909c38e9c63f2a0e1f8c17a2399"
         | 
| 29 | 
            +
              application_version: "ce512452b512b909c38e9c63f2a0e1f8c17a2399",
         | 
| 37 30 | 
             
            }
         | 
| 38 31 |  | 
| 39 32 | 
             
            content = File.read("tests/index.html")
         | 
| @@ -66,6 +66,23 @@ string@https://discourse-cdn.com/assets/application-f59d2.br.js:1:27869` | |
| 66 66 | 
             
                });
         | 
| 67 67 | 
             
              });
         | 
| 68 68 |  | 
| 69 | 
            +
              test("non-gem backtraces don't break things", async function (assert) {
         | 
| 70 | 
            +
                this.set(
         | 
| 71 | 
            +
                  "backtrace",
         | 
| 72 | 
            +
                  `/ruby/gems/activesupport-7.0.4.1/lib/active_support/deprecation/behaviors.rb:33:in \`block in <class:Deprecation>'
         | 
| 73 | 
            +
            /ruby/gems/activesupport-7.0.4.1/lib/active_support/deprecation/reporting.rb:26:in \`block (2 levels) in warn'
         | 
| 74 | 
            +
            /ruby/gems/activesupport-7.0.4.1/lib/active_support/deprecation/reporting.rb:26:in \`each'
         | 
| 75 | 
            +
            /ruby/gems/activesupport-7.0.4.1/lib/active_support/deprecation/reporting.rb:26:in \`block in warn'
         | 
| 76 | 
            +
            <internal:kernel>:90:in \`tap'
         | 
| 77 | 
            +
            /ruby/gems/activesupport-7.0.4.1/lib/active_support/deprecation/reporting.rb:22:in \`warn'`
         | 
| 78 | 
            +
                );
         | 
| 79 | 
            +
                await render(hbs`<BackTrace @backtrace={{this.backtrace}} />`);
         | 
| 80 | 
            +
                const lines = this.backtrace.split("\n");
         | 
| 81 | 
            +
                findAll("div.backtrace-line").forEach((node, index) => {
         | 
| 82 | 
            +
                  assert.strictEqual(node.textContent.trim(), lines[index]);
         | 
| 83 | 
            +
                });
         | 
| 84 | 
            +
              });
         | 
| 85 | 
            +
             | 
| 69 86 | 
             
              test("Github links use commit sha", async function (assert) {
         | 
| 70 87 | 
             
                const backtrace = `/var/www/discourse/lib/permalink_constraint.rb:6:in \`matches?'`;
         | 
| 71 88 | 
             
                let env = [
         | 
    
        data/client-app/yarn.lock
    CHANGED
    
    | @@ -4275,9 +4275,9 @@ engine.io-parser@~5.0.3: | |
| 4275 4275 | 
             
              integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==
         | 
| 4276 4276 |  | 
| 4277 4277 | 
             
            engine.io@~6.4.1:
         | 
| 4278 | 
            -
              version "6.4. | 
| 4279 | 
            -
              resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4. | 
| 4280 | 
            -
              integrity sha512- | 
| 4278 | 
            +
              version "6.4.2"
         | 
| 4279 | 
            +
              resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.2.tgz#ffeaf68f69b1364b0286badddf15ff633476473f"
         | 
| 4280 | 
            +
              integrity sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==
         | 
| 4281 4281 | 
             
              dependencies:
         | 
| 4282 4282 | 
             
                "@types/cookie" "^0.4.1"
         | 
| 4283 4283 | 
             
                "@types/cors" "^2.8.12"
         | 
| @@ -8268,19 +8268,19 @@ schema-utils@^4.0.0: | |
| 8268 8268 | 
             
                ajv-keywords "^5.0.0"
         | 
| 8269 8269 |  | 
| 8270 8270 | 
             
            "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
         | 
| 8271 | 
            -
              version "5.7. | 
| 8272 | 
            -
              resolved "https://registry.yarnpkg.com/semver/-/semver-5.7. | 
| 8273 | 
            -
              integrity sha512- | 
| 8271 | 
            +
              version "5.7.2"
         | 
| 8272 | 
            +
              resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
         | 
| 8273 | 
            +
              integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
         | 
| 8274 8274 |  | 
| 8275 8275 | 
             
            semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
         | 
| 8276 | 
            -
              version "6.3. | 
| 8277 | 
            -
              resolved "https://registry.yarnpkg.com/semver/-/semver-6.3. | 
| 8278 | 
            -
              integrity sha512- | 
| 8276 | 
            +
              version "6.3.1"
         | 
| 8277 | 
            +
              resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
         | 
| 8278 | 
            +
              integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
         | 
| 8279 8279 |  | 
| 8280 8280 | 
             
            semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.8:
         | 
| 8281 | 
            -
              version "7. | 
| 8282 | 
            -
              resolved "https://registry.yarnpkg.com/semver/-/semver-7. | 
| 8283 | 
            -
              integrity sha512- | 
| 8281 | 
            +
              version "7.5.4"
         | 
| 8282 | 
            +
              resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
         | 
| 8283 | 
            +
              integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
         | 
| 8284 8284 | 
             
              dependencies:
         | 
| 8285 8285 | 
             
                lru-cache "^6.0.0"
         | 
| 8286 8286 |  | 
| @@ -8478,9 +8478,9 @@ socket.io-adapter@~2.5.2: | |
| 8478 8478 | 
             
                ws "~8.11.0"
         | 
| 8479 8479 |  | 
| 8480 8480 | 
             
            socket.io-parser@~4.2.1:
         | 
| 8481 | 
            -
              version "4.2. | 
| 8482 | 
            -
              resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2. | 
| 8483 | 
            -
              integrity sha512- | 
| 8481 | 
            +
              version "4.2.3"
         | 
| 8482 | 
            +
              resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.3.tgz#926bcc6658e2ae0883dc9dee69acbdc76e4e3667"
         | 
| 8483 | 
            +
              integrity sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==
         | 
| 8484 8484 | 
             
              dependencies:
         | 
| 8485 8485 | 
             
                "@socket.io/component-emitter" "~3.1.0"
         | 
| 8486 8486 | 
             
                debug "~4.3.1"
         | 
| @@ -9447,10 +9447,10 @@ webpack-sources@^3.2.3: | |
| 9447 9447 | 
             
              resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
         | 
| 9448 9448 | 
             
              integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
         | 
| 9449 9449 |  | 
| 9450 | 
            -
            webpack@^5. | 
| 9451 | 
            -
              version "5. | 
| 9452 | 
            -
              resolved "https://registry.yarnpkg.com/webpack/-/webpack-5. | 
| 9453 | 
            -
              integrity sha512- | 
| 9450 | 
            +
            webpack@^5.76.0:
         | 
| 9451 | 
            +
              version "5.76.0"
         | 
| 9452 | 
            +
              resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c"
         | 
| 9453 | 
            +
              integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==
         | 
| 9454 9454 | 
             
              dependencies:
         | 
| 9455 9455 | 
             
                "@types/eslint-scope" "^3.7.3"
         | 
| 9456 9456 | 
             
                "@types/estree" "^0.0.51"
         | 
| @@ -9554,9 +9554,9 @@ wide-align@^1.1.5: | |
| 9554 9554 | 
             
                string-width "^1.0.2 || 2 || 3 || 4"
         | 
| 9555 9555 |  | 
| 9556 9556 | 
             
            word-wrap@^1.2.3:
         | 
| 9557 | 
            -
              version "1.2. | 
| 9558 | 
            -
              resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2. | 
| 9559 | 
            -
              integrity sha512- | 
| 9557 | 
            +
              version "1.2.4"
         | 
| 9558 | 
            +
              resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f"
         | 
| 9559 | 
            +
              integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==
         | 
| 9560 9560 |  | 
| 9561 9561 | 
             
            wordwrap@^0.0.3:
         | 
| 9562 9562 | 
             
              version "0.0.3"
         | 
| @@ -4,19 +4,17 @@ class SidekiqLogsterReporter | |
| 4 4 | 
             
              def call(ex, context = {})
         | 
| 5 5 | 
             
                # Pass context to Logster
         | 
| 6 6 | 
             
                fake_env = {}
         | 
| 7 | 
            -
                context.each  | 
| 8 | 
            -
                  Logster.add_to_env(fake_env, key, value)
         | 
| 9 | 
            -
                end
         | 
| 7 | 
            +
                context.each { |key, value| Logster.add_to_env(fake_env, key, value) }
         | 
| 10 8 |  | 
| 11 9 | 
             
                text = "Job exception: #{ex}\n"
         | 
| 12 | 
            -
                if ex.backtrace
         | 
| 13 | 
            -
                  Logster.add_to_env(fake_env, :backtrace, ex.backtrace)
         | 
| 14 | 
            -
                end
         | 
| 10 | 
            +
                Logster.add_to_env(fake_env, :backtrace, ex.backtrace) if ex.backtrace
         | 
| 15 11 |  | 
| 16 12 | 
             
                Thread.current[Logster::Logger::LOGSTER_ENV] = fake_env
         | 
| 17 13 | 
             
                Logster.logger.error(text)
         | 
| 18 14 | 
             
              rescue => e
         | 
| 19 | 
            -
                Logster.logger.fatal( | 
| 15 | 
            +
                Logster.logger.fatal(
         | 
| 16 | 
            +
                  "Failed to log exception #{ex} #{hash}\nReason: #{e.class} #{e}\n#{e.backtrace.join("\n")}",
         | 
| 17 | 
            +
                )
         | 
| 20 18 | 
             
              ensure
         | 
| 21 19 | 
             
                Thread.current[Logster::Logger::LOGSTER_ENV] = nil
         | 
| 22 20 | 
             
              end
         | 
    
        data/lib/logster/base_store.rb
    CHANGED
    
    | @@ -2,7 +2,6 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module Logster
         | 
| 4 4 | 
             
              class BaseStore
         | 
| 5 | 
            -
             | 
| 6 5 | 
             
                attr_accessor :level, :max_retention, :skip_empty, :ignore, :allow_custom_patterns
         | 
| 7 6 |  | 
| 8 7 | 
             
                def initialize
         | 
| @@ -166,31 +165,35 @@ module Logster | |
| 166 165 | 
             
                  message.populate_from_env(env)
         | 
| 167 166 |  | 
| 168 167 | 
             
                  if backtrace
         | 
| 169 | 
            -
                    if backtrace.respond_to? :join
         | 
| 170 | 
            -
                      backtrace = backtrace.join("\n")
         | 
| 171 | 
            -
                    end
         | 
| 168 | 
            +
                    backtrace = backtrace.join("\n") if backtrace.respond_to? :join
         | 
| 172 169 | 
             
                    message.backtrace = backtrace
         | 
| 173 170 | 
             
                  else
         | 
| 174 171 | 
             
                    message.backtrace = caller.join("\n")
         | 
| 175 172 | 
             
                  end
         | 
| 176 173 |  | 
| 177 | 
            -
                   | 
| 178 | 
            -
             | 
| 179 | 
            -
             | 
| 180 | 
            -
             | 
| 181 | 
            -
             | 
| 182 | 
            -
             | 
| 174 | 
            +
                  if ignore &&
         | 
| 175 | 
            +
                       ignore.any? { |pattern|
         | 
| 176 | 
            +
                         if message =~ pattern
         | 
| 177 | 
            +
                           val = Regexp === pattern ? pattern.inspect : pattern.to_s
         | 
| 178 | 
            +
                           increment_ignore_count(val)
         | 
| 179 | 
            +
                           true
         | 
| 180 | 
            +
                         end
         | 
| 181 | 
            +
                       }
         | 
| 182 | 
            +
                    return
         | 
| 183 183 | 
             
                  end
         | 
| 184 184 |  | 
| 185 185 | 
             
                  if Logster.config.enable_custom_patterns_via_ui || allow_custom_patterns
         | 
| 186 | 
            -
                    custom_ignore = | 
| 187 | 
            -
                      Logster::SuppressionPattern | 
| 188 | 
            -
             | 
| 189 | 
            -
                    return if custom_ignore.any? do |pattern|
         | 
| 190 | 
            -
                      if message =~ pattern
         | 
| 191 | 
            -
                        increment_ignore_count(pattern.inspect)
         | 
| 192 | 
            -
                        true
         | 
| 186 | 
            +
                    custom_ignore =
         | 
| 187 | 
            +
                      @patterns_cache.fetch(Logster::SuppressionPattern::CACHE_KEY) do
         | 
| 188 | 
            +
                        Logster::SuppressionPattern.find_all(store: self)
         | 
| 193 189 | 
             
                      end
         | 
| 190 | 
            +
                    if custom_ignore.any? { |pattern|
         | 
| 191 | 
            +
                         if message =~ pattern
         | 
| 192 | 
            +
                           increment_ignore_count(pattern.inspect)
         | 
| 193 | 
            +
                           true
         | 
| 194 | 
            +
                         end
         | 
| 195 | 
            +
                       }
         | 
| 196 | 
            +
                      return
         | 
| 194 197 | 
             
                    end
         | 
| 195 198 | 
             
                  end
         | 
| 196 199 |  | 
| @@ -199,7 +202,7 @@ module Logster | |
| 199 202 | 
             
                  if Logster.config.allow_grouping
         | 
| 200 203 | 
             
                    message.apply_message_size_limit(
         | 
| 201 204 | 
             
                      Logster.config.maximum_message_size_bytes,
         | 
| 202 | 
            -
                      gems_dir: Logster.config.gems_dir
         | 
| 205 | 
            +
                      gems_dir: Logster.config.gems_dir,
         | 
| 203 206 | 
             
                    )
         | 
| 204 207 | 
             
                    key = self.similar_key(message)
         | 
| 205 208 | 
             
                    similar = get(key, load_env: false) if key
         | 
| @@ -215,7 +218,7 @@ module Logster | |
| 215 218 | 
             
                  else
         | 
| 216 219 | 
             
                    message.apply_message_size_limit(
         | 
| 217 220 | 
             
                      Logster.config.maximum_message_size_bytes,
         | 
| 218 | 
            -
                      gems_dir: Logster.config.gems_dir
         | 
| 221 | 
            +
                      gems_dir: Logster.config.gems_dir,
         | 
| 219 222 | 
             
                    )
         | 
| 220 223 | 
             
                    saved = save(message)
         | 
| 221 224 | 
             
                    message
         | 
| @@ -224,9 +227,10 @@ module Logster | |
| 224 227 | 
             
                  message = similar || message
         | 
| 225 228 |  | 
| 226 229 | 
             
                  if (Logster.config.enable_custom_patterns_via_ui || allow_custom_patterns) && saved
         | 
| 227 | 
            -
                    grouping_patterns = | 
| 228 | 
            -
                      Logster::GroupingPattern | 
| 229 | 
            -
             | 
| 230 | 
            +
                    grouping_patterns =
         | 
| 231 | 
            +
                      @patterns_cache.fetch(Logster::GroupingPattern::CACHE_KEY) do
         | 
| 232 | 
            +
                        Logster::GroupingPattern.find_all(store: self)
         | 
| 233 | 
            +
                      end
         | 
| 230 234 |  | 
| 231 235 | 
             
                    grouping_patterns.each do |pattern|
         | 
| 232 236 | 
             
                      if message =~ pattern
         | 
    
        data/lib/logster/cache.rb
    CHANGED
    
    | @@ -8,7 +8,8 @@ module Logster | |
| 8 8 | 
             
                end
         | 
| 9 9 |  | 
| 10 10 | 
             
                def fetch(key)
         | 
| 11 | 
            -
                  if !@hash.key?(key) || | 
| 11 | 
            +
                  if !@hash.key?(key) ||
         | 
| 12 | 
            +
                       @hash[key][:created_at] + @age < Process.clock_gettime(Process::CLOCK_MONOTONIC)
         | 
| 12 13 | 
             
                    @hash[key] = { data: yield, created_at: Process.clock_gettime(Process::CLOCK_MONOTONIC) }
         | 
| 13 14 | 
             
                  end
         | 
| 14 15 | 
             
                  @hash[key][:data]
         | 
| @@ -19,7 +19,7 @@ module Logster | |
| 19 19 | 
             
                  :max_env_bytes,
         | 
| 20 20 | 
             
                  :max_env_count_per_message,
         | 
| 21 21 | 
             
                  :maximum_message_length,
         | 
| 22 | 
            -
                  :use_full_hostname
         | 
| 22 | 
            +
                  :use_full_hostname,
         | 
| 23 23 | 
             
                )
         | 
| 24 24 |  | 
| 25 25 | 
             
                attr_writer :subdirectory
         | 
| @@ -27,7 +27,7 @@ module Logster | |
| 27 27 | 
             
                def initialize
         | 
| 28 28 | 
             
                  # lambda |env,block|
         | 
| 29 29 | 
             
                  @current_context = lambda { |_, &block| block.call }
         | 
| 30 | 
            -
                  @environments = [ | 
| 30 | 
            +
                  @environments = %i[development production]
         | 
| 31 31 | 
             
                  @subdirectory = nil
         | 
| 32 32 | 
             
                  @env_expandable_keys = []
         | 
| 33 33 | 
             
                  @enable_custom_patterns_via_ui = false
         | 
| @@ -50,7 +50,7 @@ module Logster | |
| 50 50 | 
             
                end
         | 
| 51 51 |  | 
| 52 52 | 
             
                def subdirectory
         | 
| 53 | 
            -
                  @subdirectory ||  | 
| 53 | 
            +
                  @subdirectory || "/logs"
         | 
| 54 54 | 
             
                end
         | 
| 55 55 | 
             
              end
         | 
| 56 56 | 
             
            end
         | 
    
        data/lib/logster/defer_logger.rb
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 3 | 
            +
            require "logster/scheduler"
         | 
| 4 4 |  | 
| 5 5 | 
             
            module Logster
         | 
| 6 6 | 
             
              class DeferLogger < ::Logster::Logger
         | 
| @@ -8,9 +8,7 @@ module Logster | |
| 8 8 |  | 
| 9 9 | 
             
                def report_to_store(severity, progname, message, opts = {})
         | 
| 10 10 | 
             
                  opts[:backtrace] ||= caller.join("\n")
         | 
| 11 | 
            -
                  Logster::Scheduler.schedule  | 
| 12 | 
            -
                    super(severity, progname, message, opts)
         | 
| 13 | 
            -
                  end
         | 
| 11 | 
            +
                  Logster::Scheduler.schedule { super(severity, progname, message, opts) }
         | 
| 14 12 | 
             
                end
         | 
| 15 13 | 
             
              end
         | 
| 16 14 | 
             
            end
         | 
    
        data/lib/logster/group.rb
    CHANGED
    
    | @@ -17,12 +17,13 @@ module Logster | |
| 17 17 |  | 
| 18 18 | 
             
                def self.from_json(json)
         | 
| 19 19 | 
             
                  hash = JSON.parse(json)
         | 
| 20 | 
            -
                  group = | 
| 21 | 
            -
                     | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 20 | 
            +
                  group =
         | 
| 21 | 
            +
                    new(
         | 
| 22 | 
            +
                      hash["key"],
         | 
| 23 | 
            +
                      hash["messages_keys"],
         | 
| 24 | 
            +
                      timestamp: hash["timestamp"] || 0,
         | 
| 25 | 
            +
                      count: hash["count"] || 0,
         | 
| 26 | 
            +
                    )
         | 
| 26 27 | 
             
                  group.changed = false
         | 
| 27 28 | 
             
                  group
         | 
| 28 29 | 
             
                end
         | 
| @@ -32,12 +33,7 @@ module Logster | |
| 32 33 | 
             
                end
         | 
| 33 34 |  | 
| 34 35 | 
             
                def to_h
         | 
| 35 | 
            -
                  {
         | 
| 36 | 
            -
                    key: @key,
         | 
| 37 | 
            -
                    messages_keys: @messages_keys,
         | 
| 38 | 
            -
                    timestamp: @timestamp,
         | 
| 39 | 
            -
                    count: @count
         | 
| 40 | 
            -
                  }
         | 
| 36 | 
            +
                  { key: @key, messages_keys: @messages_keys, timestamp: @timestamp, count: @count }
         | 
| 41 37 | 
             
                end
         | 
| 42 38 |  | 
| 43 39 | 
             
                def to_h_web
         | 
| @@ -47,7 +43,7 @@ module Logster | |
| 47 43 | 
             
                    timestamp: @timestamp,
         | 
| 48 44 | 
             
                    messages: @messages,
         | 
| 49 45 | 
             
                    severity: -1,
         | 
| 50 | 
            -
                    group: true
         | 
| 46 | 
            +
                    group: true,
         | 
| 51 47 | 
             
                  }
         | 
| 52 48 | 
             
                end
         | 
| 53 49 |  | 
| @@ -111,14 +107,15 @@ module Logster | |
| 111 107 | 
             
                  self.class.max_size
         | 
| 112 108 | 
             
                end
         | 
| 113 109 |  | 
| 114 | 
            -
                GroupWeb = | 
| 115 | 
            -
                   | 
| 116 | 
            -
                     | 
| 117 | 
            -
             | 
| 110 | 
            +
                GroupWeb =
         | 
| 111 | 
            +
                  Struct.new(*%i[regex count timestamp messages row_id]) do
         | 
| 112 | 
            +
                    def to_json(opts = nil)
         | 
| 113 | 
            +
                      JSON.fast_generate(self.to_h.merge(severity: -1, group: true), opts)
         | 
| 114 | 
            +
                    end
         | 
| 118 115 |  | 
| 119 | 
            -
             | 
| 120 | 
            -
             | 
| 116 | 
            +
                    def key
         | 
| 117 | 
            +
                      self.regex # alias for testing convenience
         | 
| 118 | 
            +
                    end
         | 
| 121 119 | 
             
                  end
         | 
| 122 | 
            -
                end
         | 
| 123 120 | 
             
              end
         | 
| 124 121 | 
             
            end
         | 
| @@ -2,7 +2,6 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module Logster
         | 
| 4 4 | 
             
              class IgnorePattern
         | 
| 5 | 
            -
             | 
| 6 5 | 
             
                def initialize(message_pattern = nil, env_patterns = nil)
         | 
| 7 6 | 
             
                  @msg_match = message_pattern
         | 
| 8 7 | 
             
                  @env_match = env_patterns
         | 
| @@ -44,7 +43,7 @@ module Logster | |
| 44 43 | 
             
                    else
         | 
| 45 44 | 
             
                      false
         | 
| 46 45 | 
             
                    end
         | 
| 47 | 
            -
             | 
| 46 | 
            +
                  else
         | 
| 48 47 | 
             
                    false
         | 
| 49 48 | 
             
                  end
         | 
| 50 49 | 
             
                end
         | 
    
        data/lib/logster/logger.rb
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 3 | 
            +
            require "logger"
         | 
| 4 4 |  | 
| 5 5 | 
             
            module Logster
         | 
| 6 6 | 
             
              class Logger < ::Logger
         | 
| @@ -41,9 +41,7 @@ module Logster | |
| 41 41 | 
             
                    logger.add(severity, message, progname, &block)
         | 
| 42 42 | 
             
                  end
         | 
| 43 43 | 
             
                ensure
         | 
| 44 | 
            -
                  if logger.respond_to? :skip_store
         | 
| 45 | 
            -
                    logger.skip_store = old
         | 
| 46 | 
            -
                  end
         | 
| 44 | 
            +
                  logger.skip_store = old if logger.respond_to? :skip_store
         | 
| 47 45 | 
             
                end
         | 
| 48 46 |  | 
| 49 47 | 
             
                def add(*args, &block)
         | 
| @@ -55,15 +53,11 @@ module Logster | |
| 55 53 | 
             
                end
         | 
| 56 54 |  | 
| 57 55 | 
             
                def add_with_opts(severity, message = nil, progname = progname(), opts = nil, &block)
         | 
| 58 | 
            -
                  if severity < level
         | 
| 59 | 
            -
                    return true
         | 
| 60 | 
            -
                  end
         | 
| 56 | 
            +
                  return true if severity < level
         | 
| 61 57 |  | 
| 62 58 | 
             
                  # it is not fun losing messages cause encoding is bad
         | 
| 63 59 | 
             
                  # protect all messages by scrubbing if needed
         | 
| 64 | 
            -
                  if message && !message.valid_encoding?
         | 
| 65 | 
            -
                    message = message.scrub
         | 
| 66 | 
            -
                  end
         | 
| 60 | 
            +
                  message = message.scrub if message && !message.valid_encoding?
         | 
| 67 61 |  | 
| 68 62 | 
             
                  # we want to get the backtrace as early as possible so that logster's
         | 
| 69 63 | 
             
                  # own methods don't show up as the first few frames in the backtrace
         | 
| @@ -73,9 +67,7 @@ module Logster | |
| 73 67 | 
             
                    backtrace ||= progname.backtrace if progname.kind_of?(::Exception)
         | 
| 74 68 | 
             
                    if !backtrace
         | 
| 75 69 | 
             
                      backtrace = caller_locations
         | 
| 76 | 
            -
                      while backtrace.first.path.end_with?("/logger.rb")
         | 
| 77 | 
            -
                        backtrace.shift
         | 
| 78 | 
            -
                      end
         | 
| 70 | 
            +
                      backtrace.shift while backtrace.first.path.end_with?("/logger.rb")
         | 
| 79 71 | 
             
                    end
         | 
| 80 72 | 
             
                    backtrace = backtrace.join("\n")
         | 
| 81 73 | 
             
                    opts[:backtrace] = backtrace
         | 
| @@ -90,12 +82,18 @@ module Logster | |
| 90 82 | 
             
                        add_to_chained(@chained[i], severity, message, progname, opts, &block)
         | 
| 91 83 | 
             
                      rescue => e
         | 
| 92 84 | 
             
                        # don't blow up if STDERR is somehow closed
         | 
| 93 | 
            -
                         | 
| 85 | 
            +
                        begin
         | 
| 86 | 
            +
                          STDERR.puts "Failed to report message to chained logger #{e}"
         | 
| 87 | 
            +
                        rescue StandardError
         | 
| 88 | 
            +
                          nil
         | 
| 89 | 
            +
                        end
         | 
| 94 90 | 
             
                      end
         | 
| 95 91 | 
             
                      i += 1
         | 
| 96 92 | 
             
                    end
         | 
| 97 93 | 
             
                  end
         | 
| 98 94 |  | 
| 95 | 
            +
                  return if @skip_store
         | 
| 96 | 
            +
             | 
| 99 97 | 
             
                  progname ||= @progname
         | 
| 100 98 | 
             
                  if message.nil?
         | 
| 101 99 | 
             
                    if block_given?
         | 
| @@ -106,7 +104,7 @@ module Logster | |
| 106 104 | 
             
                    end
         | 
| 107 105 | 
             
                  end
         | 
| 108 106 |  | 
| 109 | 
            -
                   | 
| 107 | 
            +
                  message = formatter.call(severity, Time.now, progname, message) if formatter
         | 
| 110 108 |  | 
| 111 109 | 
             
                  opts ||= {}
         | 
| 112 110 | 
             
                  opts[:env] ||= Thread.current[LOGSTER_ENV]
         | 
| @@ -114,7 +112,11 @@ module Logster | |
| 114 112 | 
             
                  report_to_store(severity, progname, message, opts)
         | 
| 115 113 | 
             
                rescue => e
         | 
| 116 114 | 
             
                  # don't blow up if STDERR is somehow closed
         | 
| 117 | 
            -
                   | 
| 115 | 
            +
                  begin
         | 
| 116 | 
            +
                    STDERR.puts "Failed to report error: #{e} #{severity} #{message} #{progname}"
         | 
| 117 | 
            +
                  rescue StandardError
         | 
| 118 | 
            +
                    nil
         | 
| 119 | 
            +
                  end
         | 
| 118 120 | 
             
                end
         | 
| 119 121 |  | 
| 120 122 | 
             
                private
         |