{"_id":"ntlogger","_rev":"19-b94abf8da4adcf6120f6d54b85b10c51","name":"ntlogger","dist-tags":{"latest":"4.0.0"},"versions":{"2.2.1":{"name":"ntlogger","version":"2.2.1","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.2.1","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"efa656d3d16c35938697c58de62104e31d0d3337","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.2.1.tgz","fileCount":5,"integrity":"sha512-Uu0S9FCVbVn3aZvZMVXw/o5Dfu9vXPKxq0Di8T6bJ4YePEyrN+bekFobmO5CBVzXgAm46nK4Hzc0zWPwAEZyoA==","signatures":[{"sig":"MEUCIFmSE0O+Wn5mVG/9vZbZBhtct55AC8u/UuXjiqTIHJyxAiEAsIM9ps5t+WX3c1lVc9A8+5u2vxC6igELv75tPmHn69E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":50191},"gitHead":"4f174e28fdf48b406482441be099fac976a3ec6a","_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.4.0","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"21.6.2","dependencies":{"winston":"^3.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.2.1_1711953389274_0.9860990723686134","host":"s3://npm-registry-packages"}},"2.2.2":{"name":"ntlogger","version":"2.2.2","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.2.2","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"546fed46c324f52b5b615ce9323af4a9230b9030","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.2.2.tgz","fileCount":5,"integrity":"sha512-thX//UwZf+J0ynunzDqeI2sjZ9+TVD8iOizM4UksU2ytfwLjAfk0fhMOVOFAIV+TyJoG7AxjAFcc+8qCS7ZM/A==","signatures":[{"sig":"MEQCIAOZ3+I1o63CNoqNwyfDK4EAhwfXktB3i0phKupU6FYgAiAA1KeN0amiVSU//1N0BlfUvE7gaoJY6AKV6yJW2EZi9A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":50576},"gitHead":"f5175fd9e9a74b0d54683f7746d2b2c496976be3","_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.2.4","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.11.0","dependencies":{"winston":"^3.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.2.2_1712000081274_0.3694115491634693","host":"s3://npm-registry-packages"}},"2.2.3":{"name":"ntlogger","version":"2.2.3","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.2.3","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"4e19d50a2a093f02abd35a82b6966a5d677bf7d8","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.2.3.tgz","fileCount":5,"integrity":"sha512-/36UXHkQfdbvrcG+xAV3dZ7ZCB2kI1nvagubaoClPvRfZ+UAahRSZoOUOotljGVh5Dxo7ATpIxMwXqZfm5QzDw==","signatures":[{"sig":"MEYCIQDWrdcVmnueG+3BMtjEI7CI9B2CjiPNXh9G+3QXy8l3WwIhAOEusqjoRdVXmusWH1tRh1ecSx8smwMteCruotA3i5Lr","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":50778},"gitHead":"eca9481cba36582b920adb9c1b76975f3ce43df1","_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.2.4","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.11.0","dependencies":{"winston":"^3.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.2.3_1712000887375_0.7278271819578894","host":"s3://npm-registry-packages"}},"2.3.0":{"name":"ntlogger","version":"2.3.0","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility","sentry compatible","mysql compatible"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.3.0","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"3f0b831db070aa114dcdd8cefc7f4c43b6aa17f1","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.3.0.tgz","fileCount":5,"integrity":"sha512-+RhQ6BdUAKOvsIyICtDvXGGjgAvWcd/zbjtUzOwpu9ZtvtJ7SOhCIOGt4ST0wYgacDEglGljMH8MpTBIgI7fIQ==","signatures":[{"sig":"MEUCIAIxatJEc2MPhmBBqYavNCqF0MNVF5RKPINnL8iM+9nsAiEA8Xykqc+o2IjGMaRXANumkm68lrY5FMMYWWT/xktMRPk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":51385},"gitHead":"3f7021dfd16d6d94c6be903446ff7b73ec7b4a87","_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.8.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.15.1","dependencies":{"mysql2":"^3.10.2","winston":"^3.13.1","@sentry/node":"^8.17.0","winston-transport":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.4.5","@sentry/profiling-node":"^8.17.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.3.0_1720834413991_0.17499933374853383","host":"s3://npm-registry-packages"}},"2.3.1":{"name":"ntlogger","version":"2.3.1","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility","sentry compatible","mysql compatible"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.3.1","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"90717a06108e424e2615e7946c975c40af89672c","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.3.1.tgz","fileCount":5,"integrity":"sha512-afLG01Hf4kM8TrM7W6JGrlDhEjw7J2hJXNnPcJ7rn6lymVLsptPeVnj4ODgLpptN5m9amoCzMwDn/2W2+GbANg==","signatures":[{"sig":"MEYCIQDlHdZTsCQ3Aupt5zQItRQDrhqWD6Vrkr013pPHZJZX+AIhAI6/LF64GdfeYPlP7USqYH+bpbCnK4lwMt/UE/L8rwhg","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":50308},"gitHead":"a44f826fb4de771d0a6fe7cb9d9c790cf932565d","_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.8.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.15.0","dependencies":{"mysql2":"^3.10.2","winston":"^3.13.1","@sentry/node":"^8.17.0","winston-transport":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.4.5","@sentry/profiling-node":"^8.17.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.3.1_1720834980078_0.2182809171164246","host":"s3://npm-registry-packages"}},"2.4.0":{"name":"ntlogger","version":"2.4.0","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility","sentry compatible","mysql compatible"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.4.0","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"4eaac157777aadf99eed1042e77a715c590670dc","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.4.0.tgz","fileCount":9,"integrity":"sha512-4h985vE44PcDEUX94We4Oju8neo1viqFeenLTZAu5xIFXYFLcb5fZjU4Zrb9EcuEt8eqhT1Ok6lXPo3zfHcLuA==","signatures":[{"sig":"MEUCIHa2lwBf/MXjJvzN+hDJobqXgQoPtozJvwt/PRQLVYCjAiEA8D2R7eV/+PeQju375oKHXXd6/FyzFDzo6qtRM3iTHnA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":60680},"gitHead":"57e6c681a286f7fdfd0f4d0344e6430a28cd52d1","scripts":{"test":"jest"},"_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.8.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.15.1","dependencies":{"mysql2":"^3.10.2","winston":"^3.13.1","@sentry/node":"^8.17.0","winston-transport":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","dotenv":"^16.4.5","@sentry/profiling-node":"^8.17.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.4.0_1722564291057_0.5346975920149599","host":"s3://npm-registry-packages"}},"2.5.1":{"name":"ntlogger","version":"2.5.1","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility","sentry compatible","mysql compatible","syslog compatible","discord compatible"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.5.1","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"6d1d52af57b3d08bfe78b006ddc8ddad3581b53e","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.5.1.tgz","fileCount":14,"integrity":"sha512-bsWwc6Am68HH0a3BYGsPOYAEWhZcKazAyI/2wzYIOL85X8bWeE17UOV3Lqw7sFhd4vZ5WUB+xkfnWgK9APFMwA==","signatures":[{"sig":"MEYCIQDWviseT/9N1Qe7rmHTBvQBOAnFUE+I8hX6zuTj2AnSfwIhAOrtKGsCnwQpiUcDSlepByGm5IIw/KzDLp8Ec7l3/ZST","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":71150},"gitHead":"406191044ea8f29af5123337691dadf0f5f243f7","scripts":{"test":"jest"},"_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.8.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.16.0","dependencies":{"mysql2":"^3.11.0","winston":"^3.14.1","@sentry/node":"^8.25.0","winston-transport":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dotenv":"^16.4.5","@sentry/profiling-node":"^8.25.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.5.1_1723335547795_0.548879698078927","host":"s3://npm-registry-packages"}},"2.5.2":{"name":"ntlogger","version":"2.5.2","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility","sentry compatible","mysql compatible","syslog compatible","discord compatible"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.5.2","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"b0e9cad64d6e2c99108089d00996ddef9e9ad640","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.5.2.tgz","fileCount":16,"integrity":"sha512-LEXsV1Olcf2zh8wa7JzRQI0q8ngLnaTbLjZMCJ05XhrWvJdecpXL/Ghb1+Cw3JlGtoP3O7B31sWFfqfPXEvLmQ==","signatures":[{"sig":"MEUCICU+4hUH3TMSdCFvY+oEvxbgyB8T0tDdm5Pv/Pst82QWAiEA4l3hFSLdtiP05TAs/uUe7pV6RetDEzN4tMCuGVrRdC8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":80737},"gitHead":"c9113e593642714db07c0bc9d221aeb2467b94d1","scripts":{"test":"jest"},"_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.8.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.16.0","dependencies":{"mysql2":"^3.11.0","winston":"^3.14.1","@sentry/node":"^8.25.0","winston-transport":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dotenv":"^16.4.5","@sentry/profiling-node":"^8.25.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.5.2_1723394674577_0.8491285344229229","host":"s3://npm-registry-packages"}},"2.6.0":{"name":"ntlogger","version":"2.6.0","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility","sentry compatible","mysql compatible","syslog compatible","discord compatible","teams compatible"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.6.0","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"9f569a6adfc10cd6a87678597a52d64419387d9f","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.6.0.tgz","fileCount":17,"integrity":"sha512-It4lKXlsZ3yHmcrBpV96HUSDOqMZq3b0GSfLoS1+ppFa2oDFoIkkoJDjoAuDecUMe6wRrISSd0xNS+Ds3H7u5g==","signatures":[{"sig":"MEYCIQDrtZNehS9KjMvjmhve5UH3S9k9d7osQGixCljbYArlmgIhAMy19BLjtkIthYdByuiloTYzt+Z+h/7jZLbnpWHdFXEq","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":97079},"gitHead":"da95dfcd2d8d9ee6e992b74097aed314cb744bb5","scripts":{"test":"jest"},"_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.8.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.16.0","dependencies":{"mysql2":"^3.11.0","winston":"^3.14.1","@sentry/node":"^8.25.0","winston-transport":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dotenv":"^16.4.5","@sentry/profiling-node":"^8.25.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.6.0_1723747065415_0.8425156866856158","host":"s3://npm-registry-packages"}},"2.6.1":{"name":"ntlogger","version":"2.6.1","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility","sentry compatible","mysql compatible","syslog compatible","discord compatible","teams compatible"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.6.1","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"8d768f5ff365f4867a534143c0125384147ab7be","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.6.1.tgz","fileCount":17,"integrity":"sha512-T33pmNSULro7u8EYMhMSIPJ4c0GO67Z5uKzigR3Kkl4/ned1JT2JUN3sjOSnAlYpilcPVuquoNFu6tN1FqmEJg==","signatures":[{"sig":"MEQCIDAqw7M24G2lFd/d+iT4ojKZ0xAwVXKm1PcT0Bp4hKSiAiBZYEzS3B7jBXJqGrt8vZt2xUCtg2hsOlSPAq1nOf523w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":97277},"gitHead":"7652d629a919274e944917ff709c2368d2d304dd","scripts":{"test":"jest"},"_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.8.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.16.0","dependencies":{"mysql2":"^3.11.0","winston":"^3.14.2","@sentry/node":"^8.26.0","winston-transport":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dotenv":"^16.4.5","@sentry/profiling-node":"^8.26.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.6.1_1723747731780_0.6221810792322904","host":"s3://npm-registry-packages"}},"2.6.2":{"name":"ntlogger","version":"2.6.2","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility","sentry compatible","mysql compatible","syslog compatible","discord compatible","teams compatible"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.6.2","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"274c3052d4faf0498f20202b0b0314df4419f00f","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.6.2.tgz","fileCount":18,"integrity":"sha512-CftuANuapaS/QDJCnPzT9ykW0mtFD1PyE9FGk7b5WtRKamHHtruFa3snLJo+w2yzm0YFubpOveOksWLDPIPfmA==","signatures":[{"sig":"MEUCIQC4vM8id4QYftXVfItuLU3iBxBlc7rNl6XgbP97ilhCpwIgAZmn7M2Bol6PReijcslmGj+PHGSFo2gkRHqiRy3s2lw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":101557},"gitHead":"7669a56912e01bfe141eadab687564f3a0c0a22d","scripts":{"test":"jest"},"_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.8.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.16.0","dependencies":{"pg":"^8.12.0","mysql2":"^3.11.0","winston":"^3.14.2","@sentry/node":"^8.26.0","winston-transport":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dotenv":"^16.4.5","@sentry/profiling-node":"^8.26.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.6.2_1723783830287_0.8504739925150477","host":"s3://npm-registry-packages"}},"2.7.0":{"name":"ntlogger","version":"2.7.0","keywords":["logger","winston wrapper","logger wrapper","wrapper","winston logger","custom logger","logging","log management","logging utility","sentry compatible","mysql compatible","syslog compatible","discord compatible","teams compatible"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.7.0","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"3573b9324ff4bd029d18ebf7b47f60105a8f2312","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.7.0.tgz","fileCount":18,"integrity":"sha512-bhpQHfRFjxA8vMyRCalMdT+T7h7Ks6yCCdCnhQlwdxy5+uyGJ2/OCelC1JOqfvpp47zVy19BALxfG00bOXsIow==","signatures":[{"sig":"MEQCIB+apj+715wymK9HwvejuGIm5gSbLMIC91+q88mc4YaIAiBzTyljvI5jZameIaa4/JvDvb6Zy0P7X7QDFNqGEFgnLQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":103742},"gitHead":"261af2f09ac7b8985ca4e5b68292fcb7454745ff","scripts":{"test":"jest"},"_npmUser":{"name":"kvrnn","email":"reyeskevin707@gmail.com"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"10.8.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.17.0","dependencies":{"pg":"^8.12.0","mysql2":"^3.11.0","winston":"^3.14.2","@sentry/node":"^8.26.0","winston-transport":"^4.7.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dotenv":"^16.4.5","@sentry/profiling-node":"^8.26.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.7.0_1725396970551_0.8543829037574036","host":"s3://npm-registry-packages"}},"2.8.1":{"name":"ntlogger","version":"2.8.1","keywords":["custom logger","discord compatible","log management","logger","logger wrapper","logging","logging utility","mysql compatible","sentry compatible","syslog compatible","teams compatible","winston logger","winston wrapper","wrapper"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.8.1","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"03f43cee42104e93e0fab0c03d14916576a96ff2","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.8.1.tgz","fileCount":26,"integrity":"sha512-i/+xVtGTu9vEkYDCFHTjkmWscbmtQsd5h0n5SneI/XxV/Mk9C2R4ZX4MOYP2N0IQkh7O+lF4nez/Yt/ZhrZIMg==","signatures":[{"sig":"MEUCIA3tROLkoNoq93Dc2ysLRSkGr8OSEpXJ3CkNHt3sAxSfAiEA2jCWIGkUsqdBw4JvE7De2hDiWhPJdHiDhSrfTcHHSaA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ntlogger@2.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":161088},"types":"./index.d.ts","gitHead":"7a8a6f062d84760c296e1e4792516b1a76572e08","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:10cebba7-77ea-46df-88d1-3b1183f1f929"}},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"11.6.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.19.5","dependencies":{"pg":"^8.16.3","mysql2":"^3.15.3","winston":"^3.18.3","@sentry/node":"^10.25.0","winston-transport":"^4.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","dotenv":"^17.2.3","@sentry/profiling-node":"^10.25.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.8.1_1763406262378_0.6811768661436668","host":"s3://npm-registry-packages-npm-production"}},"2.8.2":{"name":"ntlogger","version":"2.8.2","keywords":["custom logger","discord compatible","log management","logger","logger wrapper","logging","logging utility","mysql compatible","sentry compatible","syslog compatible","teams compatible","winston logger","winston wrapper","wrapper"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.8.2","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"6df196331342c0175e5bd911c1b1b5b1c5e5e70f","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.8.2.tgz","fileCount":26,"integrity":"sha512-ILFzuCwE2HLiOJPaEFEF04u+62jTmOmqorwcbL10JaBk1l5k8wi6P8+eW9WGoQYyohJ+4RlAySPqdHkSUSwW2w==","signatures":[{"sig":"MEUCIQChm8xRcfEHT65HDYaPKls8SFJlgM+mF/XCH1CnqHtwaAIgK2iweULUpCu5whdfzLnHbsOq7pKUgjL1bf8icq1SuSk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ntlogger@2.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":162451},"types":"./index.d.ts","gitHead":"97f64c6c2aca8ec6db46cca63497b2885f887f24","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:10cebba7-77ea-46df-88d1-3b1183f1f929"}},"overrides":{"glob":"^11.1.0"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"11.6.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.19.5","dependencies":{"pg":"^8.16.3","mysql2":"^3.15.3","winston":"^3.18.3","@sentry/node":"^10.25.0","winston-transport":"^4.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","dotenv":"^17.2.3","@sentry/profiling-node":"^10.25.0"},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.8.2_1763406833634_0.2643878819643719","host":"s3://npm-registry-packages-npm-production"}},"2.9.0":{"name":"ntlogger","version":"2.9.0","keywords":["custom logger","discord compatible","fastify logger","log management","logger","logger wrapper","logging","logging utility","mysql compatible","pino transport","sentry compatible","syslog compatible","teams compatible","winston logger","winston wrapper","wrapper"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.9.0","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"d756ed3dc619d1c98c32ed914a3541dd5cf560f5","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.9.0.tgz","fileCount":28,"integrity":"sha512-FdzqSxQw/z/XvC7JhwwTLQCMgSSWipY1eg4WlKbeU4xKnti++Qe01i/txTCPVfA+etKmZ2HnHcoAfwGCFKYt0Q==","signatures":[{"sig":"MEUCIDLlFgU2+fxDZSphEhObaOhaE89UMGnu0IK91IPkYKgfAiEA842i0jpsLMifw292VLXceqmCtINvejqZeRB4gR96/BQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ntlogger@2.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":170619},"types":"./index.d.ts","exports":{".":"./index.js","./pino":"./pino.js"},"gitHead":"dd263092e0326d682e5badf7cea4991a2d06e695","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:10cebba7-77ea-46df-88d1-3b1183f1f929"}},"overrides":{"glob":"^11.1.0"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"11.12.0","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.20.1","dependencies":{"pg":"^8.16.3","mysql2":"^3.15.3","winston":"^3.18.3","@sentry/node":"^10.25.0","winston-transport":"^4.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","dotenv":"^17.2.3","@sentry/profiling-node":"^10.25.0"},"peerDependencies":{"pino":">=8.0.0"},"optionalDependencies":{"pino-abstract-transport":"^2.0.0"},"peerDependenciesMeta":{"pino":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.9.0_1774457362691_0.8948739530523626","host":"s3://npm-registry-packages-npm-production"}},"2.9.1":{"name":"ntlogger","version":"2.9.1","keywords":["custom logger","discord compatible","fastify logger","log management","logger","logger wrapper","logging","logging utility","mysql compatible","pino transport","sentry compatible","syslog compatible","teams compatible","winston logger","winston wrapper","wrapper"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.9.1","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"57170b8118a37b0718315ec3c1b3b3491cbacd77","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.9.1.tgz","fileCount":28,"integrity":"sha512-6csnrEOd3VZtyqC3N8oF/4ZM9g2ATLFECy/TDGiSr2PwGhVKcOOLcnnHqGWowidfel7ryPiC8ywBdGMJPGODKQ==","signatures":[{"sig":"MEYCIQCkxy9HzKZQK1Jy6RUOflGS8BbLni5UE0wcPn1rPo7WowIhANudBlXhWJwLijaJgKXixfsYwi/S2CGwvwYPvFslT/7E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ntlogger@2.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":170640},"types":"./index.d.ts","exports":{".":"./index.js","./pino":"./pino.js"},"gitHead":"e5b8c5bc613ae07a35ce95e5d549452b94f381b9","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:10cebba7-77ea-46df-88d1-3b1183f1f929"}},"overrides":{"glob":"^11.1.0"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"11.12.0","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.20.1","dependencies":{"pg":"^8.17.1","mysql2":"^3.16.1","winston":"^3.19.0","@sentry/node":"^10.34.0","winston-transport":"^4.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","dotenv":"^17.2.4","@sentry/profiling-node":"^10.38.0"},"peerDependencies":{"pino":">=8.0.0"},"optionalDependencies":{"split2":"^4.2.0"},"peerDependenciesMeta":{"pino":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.9.1_1774494809724_0.21421161939753808","host":"s3://npm-registry-packages-npm-production"}},"2.10.0":{"name":"ntlogger","version":"2.10.0","keywords":["custom logger","discord compatible","fastify logger","log management","logger","logger wrapper","logging","logging utility","mysql compatible","opentelemetry","otel","otlp","pino transport","sentry compatible","syslog compatible","teams compatible","winston logger","winston wrapper","wrapper"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@2.10.0","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"a10d73f220bafabbe27ce15b1917dcdd8bb7b5dc","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-2.10.0.tgz","fileCount":29,"integrity":"sha512-DgtSuEGh6sKNhf+rFTSizDF7mVwR13j0OyDunIb67rIm0Z2k8svTE9zBII30Tkrf9lvhYIDmeg+s1/Z931NRiA==","signatures":[{"sig":"MEUCIQDu9pFnVGe8/f75ak56Val9+58wQa1wyBvzCOxvggcrdwIgZjZ1+tWLp1P2oUW7TcW+m+M0H7ek2B1QuSKUjT/7pJc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ntlogger@2.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":180861},"types":"./index.d.ts","exports":{".":"./index.js","./pino":"./pino.js"},"gitHead":"ad9abe30e6e9f52b20cdb8c706ec61132f99fd56","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:10cebba7-77ea-46df-88d1-3b1183f1f929"}},"overrides":{"glob":"^11.1.0"},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"11.14.1","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.17.1","mysql2":"^3.22.0","winston":"^3.19.0","@sentry/node":"^10.48.0","winston-transport":"^4.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","dotenv":"^17.4.2","testcontainers":"^11.14.0","@testcontainers/mysql":"^11.14.0","@sentry/profiling-node":"^10.52.0","@testcontainers/postgresql":"^11.14.0"},"peerDependencies":{"pino":">=8.0.0","@opentelemetry/api":">=1.9.0","@opentelemetry/api-logs":">=0.50.0","@opentelemetry/sdk-logs":">=0.50.0","@opentelemetry/resources":">=1.20.0","@opentelemetry/semantic-conventions":">=1.20.0","@opentelemetry/exporter-logs-otlp-http":">=0.50.0"},"optionalDependencies":{"split2":"^4.2.0"},"peerDependenciesMeta":{"pino":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/api-logs":{"optional":true},"@opentelemetry/sdk-logs":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/semantic-conventions":{"optional":true},"@opentelemetry/exporter-logs-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_2.10.0_1779005088393_0.33991156459866323","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"ntlogger","version":"3.0.0","keywords":["custom logger","discord compatible","fastify logger","log management","logger","logger wrapper","logging","logging utility","mysql compatible","opentelemetry","otel","otlp","pino transport","sentry compatible","syslog compatible","teams compatible","winston logger","winston wrapper","wrapper"],"author":{"url":"Kvrnn#6940, Syntax#5569","name":"Kevin R."},"license":"GPL-3.0","_id":"ntlogger@3.0.0","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"dist":{"shasum":"3dd92ad02de343fa9c3b89c024ead430fc5a1b68","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-3.0.0.tgz","fileCount":35,"integrity":"sha512-QGxwShAyekvI3oR9Md8AsYvRNNaPvoTiFwYDHMZmsv0ESOGMENb67l6911NzgC1Fp//qSSwenf1LtaR8LVCflg==","signatures":[{"sig":"MEYCIQDb5WaSTPUKKA6loUowBcV+iCTFgbSxMsjCMk+K5mDrcgIhAO5DmDjrHPVrm24TM5W3WJVMxODnn6e2AGy1qJyJuRGR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ntlogger@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":292022},"types":"./index.d.ts","engines":{"node":">=22.22.2"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"},"./pino":{"types":"./pino.d.ts","default":"./pino.js"},"./package.json":"./package.json"},"gitHead":"8dc8379c11ace900efe3632589891e75c20ce723","scripts":{"test":"jest","test:unit":"jest --runInBand --testPathIgnorePatterns=tests/plugins/mysql.test.js tests/plugins/postgres.test.js","test:coverage":"jest --runInBand --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:10cebba7-77ea-46df-88d1-3b1183f1f929"}},"repository":{"url":"git+https://github.com/NightSquawk/NightTimeLogger.git","type":"git"},"_npmVersion":"12.0.2","description":"A Custom Ready-To-Go Logging Wrapper Built on Winston","directories":{},"_nodeVersion":"24.20.0","dependencies":{"winston":"^3.19.0","winston-transport":"^4.9.0"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.23.0","jest":"^30.5.1","pino":"^10.3.1","dotenv":"^17.4.2","mysql2":"^3.24.4","@sentry/node":"^10.74.0","testcontainers":"^12.1.0","@testcontainers/mysql":"^12.1.0","@sentry/profiling-node":"^10.74.0","@opentelemetry/sdk-logs":"^0.222.0","@testcontainers/postgresql":"^12.1.0","@opentelemetry/exporter-logs-otlp-http":"^0.222.0"},"peerDependencies":{"pg":"^8.23.0","pino":">=8.0.0","mysql2":"^3.24.4","@sentry/node":"^10.74.0","@opentelemetry/api":">=1.9.0","@opentelemetry/api-logs":"^0.222.0","@opentelemetry/sdk-logs":"^0.222.0","@opentelemetry/resources":"^2.11.0","@opentelemetry/semantic-conventions":">=1.20.0","@opentelemetry/exporter-logs-otlp-http":"^0.222.0"},"optionalDependencies":{"split2":"^4.2.0"},"peerDependenciesMeta":{"pg":{"optional":true},"pino":{"optional":true},"mysql2":{"optional":true},"@sentry/node":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/api-logs":{"optional":true},"@opentelemetry/sdk-logs":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/semantic-conventions":{"optional":true},"@opentelemetry/exporter-logs-otlp-http":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ntlogger_3.0.0_1789164922782_0.08043481357992399","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"ntlogger","version":"4.0.0","description":"Structured logging with Winston and Pino backends","keywords":["custom logger","discord compatible","fastify logger","log management","logger","logger wrapper","logging","logging utility","mysql compatible","opentelemetry","otel","otlp","pino transport","sentry compatible","syslog compatible","teams compatible","winston logger","winston wrapper","wrapper"],"author":{"name":"Kevin R.","url":"Kvrnn#6940, Syntax#5569"},"license":"GPL-3.0","repository":{"type":"git","url":"git+https://github.com/NightSquawk/NightTimeLogger.git"},"exports":{".":{"types":"./index.d.ts","default":"./index.js"},"./pino":{"types":"./pino.d.ts","default":"./pino.js"},"./package.json":"./package.json","./eslint":{"types":"./eslint.d.ts","default":"./eslint.js"},"./contract/redaction.json":"./contract/redaction.json","./contract/conformance.json":"./contract/conformance.json"},"types":"./index.d.ts","scripts":{"test":"jest","test:coverage":"jest --runInBand --coverage","test:unit":"jest --runInBand --testPathIgnorePatterns=tests/plugins/mysql.test.js tests/plugins/postgres.test.js","test:package":"node scripts/test-package.cjs","test:python":"python3 -W error -m unittest discover -s python/tests","test:contract":"node scripts/sync-python-contract.cjs --check"},"optionalDependencies":{"split2":"^4.2.0"},"peerDependencies":{"@opentelemetry/api":">=1.9.0","@opentelemetry/api-logs":"^0.222.0","@opentelemetry/exporter-logs-otlp-http":"^0.222.0","@opentelemetry/resources":"^2.11.0","@opentelemetry/sdk-logs":"^0.222.0","@opentelemetry/semantic-conventions":">=1.20.0","@sentry/node":"^10.74.0","mysql2":"^3.24.4","pg":"^8.23.0","pino":">=9.14.0","winston":"^3.19.0","winston-transport":"^4.9.0","eslint":">=9.0.0"},"peerDependenciesMeta":{"pino":{"optional":true},"@sentry/node":{"optional":true},"mysql2":{"optional":true},"pg":{"optional":true},"@opentelemetry/api":{"optional":true},"@opentelemetry/api-logs":{"optional":true},"@opentelemetry/sdk-logs":{"optional":true},"@opentelemetry/exporter-logs-otlp-http":{"optional":true},"@opentelemetry/resources":{"optional":true},"@opentelemetry/semantic-conventions":{"optional":true},"winston":{"optional":true},"winston-transport":{"optional":true},"eslint":{"optional":true}},"devDependencies":{"@opentelemetry/context-async-hooks":"^2.11.0","@opentelemetry/exporter-logs-otlp-http":"^0.222.0","@opentelemetry/sdk-logs":"^0.222.0","@sentry/node":"^10.74.0","@sentry/profiling-node":"^10.74.0","@testcontainers/mysql":"^12.1.0","@testcontainers/postgresql":"^12.1.0","dotenv":"^17.4.2","eslint":"^10.10.0","fastify":"^5.12.4","jest":"^30.5.1","mysql2":"^3.24.4","pg":"^8.23.0","pino":"^10.3.1","testcontainers":"^12.1.0","typescript":"^5.9.3","winston":"^3.19.0","winston-transport":"^4.9.0"},"engines":{"node":">=22.22.2"},"gitHead":"5724028b5c69503f5b5395f3258d950479041ec3","_id":"ntlogger@4.0.0","bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","_nodeVersion":"24.20.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-5xyjjZ+RSnAicRFBmoP/e1tBlVw/+Ptj9PS3VjOtGEwMWh81OAiUn9JntsbQhoF7S8GRBUV6LXxVVygryNbWzg==","shasum":"65e2b4be8023fb8936291125a9c5f8f96e318793","tarball":"https://registry.npmjs.org/ntlogger/-/ntlogger-4.0.0.tgz","fileCount":43,"unpackedSize":329053,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ntlogger@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEYunTvaChgdBlMsryY9FV45jwi4n3y/QnT6ybgsAXP4AiBj1l7DQMk5/pS5jBp+q5pZ63i7DsjMw0NWxFPpfOzDMA=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:10cebba7-77ea-46df-88d1-3b1183f1f929"}},"directories":{},"maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ntlogger_4.0.0_1789324439046_0.7953655246648312"},"_hasShrinkwrap":false}},"time":{"created":"2024-04-01T06:36:29.194Z","modified":"2026-09-13T18:33:59.449Z","2.2.1":"2024-04-01T06:36:29.420Z","2.2.2":"2024-04-01T19:34:41.416Z","2.2.3":"2024-04-01T19:48:07.529Z","2.3.0":"2024-07-13T01:33:34.147Z","2.3.1":"2024-07-13T01:43:00.242Z","2.4.0":"2024-08-02T02:04:51.256Z","2.5.1":"2024-08-11T00:19:07.940Z","2.5.2":"2024-08-11T16:44:34.785Z","2.6.0":"2024-08-15T18:37:45.566Z","2.6.1":"2024-08-15T18:48:51.994Z","2.6.2":"2024-08-16T04:50:30.494Z","2.7.0":"2024-09-03T20:56:10.678Z","2.8.1":"2025-11-17T19:04:22.599Z","2.8.2":"2025-11-17T19:13:53.853Z","2.9.0":"2026-03-25T16:49:22.852Z","2.9.1":"2026-03-26T03:13:29.872Z","2.10.0":"2026-05-17T08:04:48.535Z","3.0.0":"2026-09-11T22:15:22.975Z","4.0.0":"2026-09-13T18:33:59.181Z"},"bugs":{"url":"https://github.com/NightSquawk/NightTimeLogger/issues"},"author":{"name":"Kevin R.","url":"Kvrnn#6940, Syntax#5569"},"license":"GPL-3.0","homepage":"https://github.com/NightSquawk/NightTimeLogger#readme","keywords":["custom logger","discord compatible","fastify logger","log management","logger","logger wrapper","logging","logging utility","mysql compatible","opentelemetry","otel","otlp","pino transport","sentry compatible","syslog compatible","teams compatible","winston logger","winston wrapper","wrapper"],"repository":{"type":"git","url":"git+https://github.com/NightSquawk/NightTimeLogger.git"},"description":"Structured logging with Winston and Pino backends","maintainers":[{"name":"kvrnn","email":"reyeskevin707@gmail.com"}],"readme":"# NightTimeLogger\n\nNightTimeLogger provides Winston and Pino logging backends with shared logging conventions. Install the backend your application uses.\n\n[![Node.js Package](https://github.com/NightSquawk/NightTimeLogger/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/NightSquawk/NightTimeLogger/actions/workflows/main.yml)\n\nThis maintenance update requires Node.js 22.22.2 or newer; Node 22 and 24 are tested.\n\nProcess signal handling is now **opt-in**. Applications that relied on automatic shutdown must register it once:\n\n```javascript\nconst logger = require('ntlogger');\nconst unregister = logger.setupSignalHandlers({ timeout: 30000 });\n```\n\nAlternatively, keep your application's own shutdown handlers and `await log.close()` there. Importing the package no longer changes process exception or signal handling. Flush and close reject on delivery errors/timeouts, so callers should handle rejected promises. Close is idempotent, waits for transport cleanup, and removes the logger from its cache. Children share their parent's transports; closing a child flushes but does not close the parent. Log calls after close throw on both backends. See the Pino lifecycle note below for its drain result contract.\n\nOpenTelemetry users must upgrade the logs SDK/API/HTTP exporter together to `^0.222.0` and resources to `^2.11.0`. Earlier SDK versions are no longer advertised as compatible. Database transports now own separate pools, use event timestamps in UTC, accept `ssl` configuration, and require simple SQL table identifiers. Existing tables are not altered automatically.\n\n## Features\n\n- Custom log levels for fine-grained control over logging output.\n- Dynamic color generation for visually appealing log messages.\n- Custom session ID generation for tracking log sessions.\n- Support for both file and console log formatters.\n- Ability to configure log levels and formats to suit specific requirements.\n- Native call site path reporting - automatically capture file path, line number, and call chain where each log statement is executed.\n- **Child loggers** - Create contextual loggers with persistent metadata (perfect for multi-threaded applications).\n- **Log sampling and rate limiting** - Reduce console spam with configurable sampling rates and rate limits per log level.\n- **Log deduplication** - Automatically group and squish duplicate log messages (e.g., \"Ticket already exists (x11)\").\n- **Performance metrics** - Development-only performance tracking with `time()` and `timeEnd()` methods.\n- **Non-blocking operations** - All logging operations are asynchronous and won't block your application.\n- **TypeScript support** - Full TypeScript definitions included for excellent IDE integration (IntelliJ, VS Code, etc.).\n- [Log Contract](docs/log-contract.md) — cross-language field, level, context, redaction, and OTLP mapping contract shared by Node, Python, and Rust emitters.\n\n## Installation\n\nFor Pino or Fastify:\n\n```bash\nnpm install ntlogger pino\n```\n\nImport helpers from `ntlogger/pino`. This installation does not pull in Winston or\nits transports. The small `split2` dependency supports the development formatter.\n\nFor the Winston API and its plugins:\n\n```bash\nnpm install ntlogger winston winston-transport\n```\n\nImport `ntlogger` as before. Both backends are optional peers, so install the one\nyou use; applications using both entry points should install all three peers.\n\n**Upgrade note:** Winston and `winston-transport` were previously installed by\nntlogger automatically. Existing Winston consumers must add them as direct\nproduction dependencies using the command above before upgrading. This is a\nbreaking installation change in v4.0.0. See [release notes](docs/releases/v4.0.0.md)\nfor the complete migration checklist.\n\n### Optional plugin backends\n\nPlugin backends are **optional peer dependencies** - they are not installed for you.\nInstall only the ones whose plugins you actually enable:\n\n| Plugin | Install |\n| --- | --- |\n| Sentry | `npm install @sentry/node` |\n| MySQL | `npm install mysql2` |\n| Postgres | `npm install pg` |\n| OpenTelemetry | `npm install @opentelemetry/api @opentelemetry/api-logs @opentelemetry/sdk-logs @opentelemetry/exporter-logs-otlp-http @opentelemetry/resources @opentelemetry/semantic-conventions` |\n| Discord, Teams, OpenObserve, Syslog, Jest | none - no extra packages required |\n\nPlugin modules are resolved lazily, so a missing plugin backend never breaks\n`require('ntlogger')` when the Winston peers are installed. The loader reports an actionable error naming the package and\nthe install command, skips that one plugin, and keeps every other plugin working.\nSee [plugins/README.md](https://github.com/NightSquawk/NightTimeLogger/blob/main/plugins/README.md)\nfor per-plugin configuration.\n\n> **Upgrading:** `@sentry/node`, `mysql2` and `pg` used to be hard dependencies of\n> `ntlogger`. If you relied on them being installed transitively, add them to your own\n> `package.json`.\n\n## Usage\n\n```javascript\n// Import the logger\nconst logger = require('ntlogger');\n\n// Create a logger instance\nconst log = logger('MyApp');\n\n// Log messages at different levels\nlog.info('Informational message');\nlog.warn('Warning message');\nlog.error('Error message');\nlog.debug('Debugging message');\nlog.trace('Trace message');\n\n// Log internal messages\nlog.internal('Internal message');\n```\n\n## Output\n\nCheck out [Quick Start](https://github.com/NightSquawk/NightTimeLogger/blob/main/examples/quick-start.js)\n![Quick Start](https://github.com/NightSquawk/NightTimeLogger/blob/main/images/quick-start.png)\n\n\nCheck out [Full Configuration](https://github.com/NightSquawk/NightTimeLogger/blob/main/examples/full-configuration.js)\n![Full Configuration](https://github.com/NightSquawk/NightTimeLogger/blob/main/images/full-configuration.png)\n\n## Configuration Options\n\n- `level`: The default log level for the logger instance.\n- `console`: Whether to enable console logging. Defaults to `true`.\n- `file`: Whether to enable file logging. Defaults to `true`.\n- `path`: The directory path where log files will be saved.\n- `filename`: Combined log filename (default: `combined.log`); error/fatal files retain their names.\n- `shutdownTimeout`: Maximum wait in milliseconds for flush or stream shutdown (default: `30000`).\n- `maxSize`: The maximum size (in bytes) for each log file.\n- `maxFiles`: The maximum number of log files to retain (rotating file strategy).\n- `timestamp`: Whether to include timestamps in log messages. Defaults to `true`.\n- `skipCache`: Whether to bypass the logger instance cache and always build a new instance for this location name. Defaults to `false` (instances are cached per location name; child loggers always skip the cache).\n- `plugins`: Array of plugin configurations, each `{ name, enabled, config }`. All three fields are required - `enabled` must be `true` and `config` must be an object (use `{}` when the plugin takes no options), otherwise the plugin is skipped. Backends whose optional peer dependency is missing are reported and skipped without affecting the others. Defaults to `[]`.\n- `debug`: Whether to enable debug mode, which logs internal messages. Defaults to `false`.\n- `reportPath`: Whether to enable call site path reporting. When enabled, automatically captures the file path, line number, column number, and call chain where each log statement is executed. The path is added as metadata (JSON field `filePath`), not in the formatted message string. Defaults to `false`.\n- `sampling`: Object with level-based sampling rates (e.g., `{ debug: 0.01, trace: 0.001 }`). Values between 0.0 and 1.0, where 1.0 = log all, 0.1 = log 10%. Defaults to `{}` (no sampling).\n- `rateLimit`: Object with level-based rate limits (e.g., `{ error: { max: 10, window: 60000 } }`). Prevents console spam by limiting logs per level within a time window. Defaults to `{}` (no rate limiting).\n- `deduplication`: Object with `{ enabled: boolean, threshold: number, window: number }`. Groups similar log messages and squishes duplicates (e.g., \"Ticket already exists (x11)\"). Defaults to `{ enabled: false, threshold: 3, window: 60000 }`.\n- `performanceMetrics`: Enable performance tracking (default: `NODE_ENV === 'development'`). Adds `time()` and `timeEnd()` methods.\n- `statsInterval`: Interval in milliseconds to automatically log statistics (default: `0` = disabled). Useful for tuning sampling/rate limiting parameters.\n\n### Call Site Path Reporting\n\nWhen `reportPath` is enabled, each log entry includes a `filePath` field in its metadata showing where the log was called:\n\n```javascript\nconst logger = require('ntlogger');\n\nconst log = logger('MyApp', {\n    reportPath: true\n});\n\nlog.info('User logged in'); // filePath will show: \"./src/routes/auth.js:45:12 [handleLogin ← router.post]\"\n```\n\nThe `filePath` field appears in:\n- JSON metadata (for plugins like OpenObserve)\n- Console output (appended to location)\n- File logs (appended to location)\n\n**Smart Internal Function Filtering**: The logger automatically filters out internal Node.js functions (like `_onTimeout`, `listOnTimeout`, `setImmediate`, etc.) from the call chain, ensuring you only see your actual application code. This works even when logs are called from within `setTimeout`, `setImmediate`, or Promise callbacks.\n\nNote: The `location` field represents the logger instance name, while `filePath` shows the actual call site where the log statement was written.\n\n### Child Loggers\n\nCreate child loggers with persistent context that's automatically merged into all log entries. Perfect for request-scoped logging or multi-threaded applications:\n\n```javascript\nconst logger = require('ntlogger');\n\nconst log = logger('MyApp');\n\n// Create a child logger with context\nconst requestLogger = log.child({ \n    requestId: 'abc123', \n    userId: 456,\n    endpoint: '/api/users' \n});\n\n// All logs from requestLogger automatically include the context\nrequestLogger.info('Processing request'); \n// Logs: { requestId: 'abc123', userId: 456, endpoint: '/api/users', message: 'Processing request' }\n\n// Support nested children\nconst operationLogger = requestLogger.child({ operation: 'validate' });\noperationLogger.debug('Validating input'); // Includes all parent context\n```\n\n### Log Sampling and Rate Limiting\n\nReduce console spam with configurable sampling and rate limiting:\n\n```javascript\nconst log = logger('MyApp', {\n    // Sample 1% of debug logs, 0.1% of trace logs\n    sampling: {\n        debug: 0.01,\n        trace: 0.001\n    },\n    // Limit errors to 10 per minute\n    rateLimit: {\n        error: { max: 10, window: 60000 }\n    },\n    // Log statistics every 5 minutes to help tune parameters\n    statsInterval: 300000\n});\n\n// Get statistics\nconst stats = log.getStats();\nconsole.log(stats);\n// {\n//   sampling: { total: { error: 150 }, sampled: { debug: 99 }, rateLimited: { error: 5 } },\n//   deduplication: { totalDeduplicated: 50, uniqueMessages: 20 },\n//   performance: { enabled: true, avgLogProcessingTime: 0.5 }\n// }\n```\n\n### Log Deduplication\n\nAutomatically group and squish duplicate log messages:\n\n```javascript\nconst log = logger('MyApp', {\n    deduplication: {\n        enabled: true,\n        threshold: 3,  // After 3 duplicates, start squishing\n        window: 60000  // 60 second window\n    }\n});\n\n// If this message appears 11 times:\nlog.debug('Ticket already exists for threshold a481199f-ed1c-47c6-834d-9cf54cdc394e and device 2642');\n\n// It will be logged once as:\n// \"Ticket already exists for threshold * and device * (x11)\"\n```\n\n### Performance Metrics (Development Only)\n\nTrack performance in development mode:\n\n```javascript\nconst log = logger('MyApp', {\n    performanceMetrics: true  // Auto-enabled in development\n});\n\nlog.time('database-query');\n// ... do work ...\nconst duration = log.timeEnd('database-query');\n// Logs: \"Timer 'database-query' completed in 45.23ms\"\n```\n\n### Non-Blocking Operations\n\nAll logging operations are non-blocking and return immediately:\n\n```javascript\nconst log = logger('MyApp');\n\n// All these return immediately, processing happens asynchronously\nlog.info('Message 1');\nlog.info('Message 2');\nlog.info('Message 3');\n\n// Flush all pending logs (returns Promise)\nawait log.flush();\n\n// Close logger gracefully (returns Promise)\nawait log.close();\n```\n\n## Pino Support\n\n`ntlogger/pino` is a separate entry point for projects that already use [Pino](https://getpino.io).\nIt provides an NTL-styled transport plus `createLogger()`, which wires the NTL conventions\n(module label, structured context, secret redaction, sampling, graceful shutdown) onto a real\nPino logger.\n\n`pino` is an optional peer dependency, so Winston-only users do not install it.\n`split2` is a small optional dependency installed by default for the Pino formatter.\n\n### Transport only\n\n```javascript\nconst pino = require('pino');\n\nconst log = pino({\n  transport: { target: 'ntlogger/pino', options: { colorize: true, defaultModule: 'MyApp' } },\n});\n\nlog.info({ tenantId: 'acme' }, 'server started');\n// 2025-01-01 12:00:00 [info    ] [MyApp]: {tenantId=acme} server started\n```\n\nThe transport renders a dim `{key=value ...}` suffix for the top-level context keys\n`tenantId`, `userId`, `correlationId`, `traceId`, `spanId`, `jobId`, `agentUuid`, `commandId`\n(exported as `CONTEXT_KEYS`), and pairs pino-http/Fastify request/response lines.\n\n### `createLogger(opts)`\n\n```javascript\nconst { createLogger } = require('ntlogger/pino');\n\nconst log = createLogger({ module: 'OrderService', service: 'checkout-api' });\n\nlog.info({ tenantId: 'acme' }, 'order received');\n```\n\n`createLogger()` returns a **real Pino logger**, so the call signature is object-first:\n`log.info({ tenantId }, 'message')` — not Winston's `log.info('message', meta)`.\n\nIn development it attaches the NTL transport for human-readable output; with\n`NODE_ENV=production` it writes plain NDJSON so log shippers get clean JSON.\n\n| Option | Type | Default | Purpose |\n| --- | --- | --- | --- |\n| `level` | `string` | `LOG_LEVEL`, else `debug` (dev) / `info` (production) | Pino level. |\n| `module` | `string` | — | Adds `module` to every line and labels the transport output. |\n| `defaultModule` | `string` | — | Transport label when `module` is not set. |\n| `colorize` | `boolean` | transport default | Forwarded to the NTL transport. |\n| `service` | `string` | — | Constant top-level `service` field (a core field of the log contract). |\n| `context` | `object` | — | Static top-level fields merged into every line. |\n| `contextProvider` | `() => object` | — | Called per log call; its result is merged at the top level. |\n| `contextKeys` | `string[]` | — | When set, only these keys are taken from the provider result. |\n| `redact` | `false \\| string[] \\| object` | defaults on | Secret redaction (see below). |\n| `sampling` | `object` | — | Per-level sampling rates, same shape as the Winston path. |\n| `rateLimit` | `object` | — | Per-level rate limits, same shape as the Winston path. |\n| `deduplication` | `object \\| boolean` | — | Duplicate-message collapsing, same shape as the Winston path. |\n| `silent` | `boolean` | see below | Force silent mode on or off. |\n| `processHandlers` | `boolean \\| object` | `false` | Opt-in crash/signal handlers. |\n| `destination` | Pino destination | — | Test/advanced escape hatch; replaces the NTL transport. |\n\nThe returned logger additionally exposes `getStats()`, `resetStats()`, `close(timeout?)` and —\nwhen `processHandlers` is used — `uninstallProcessHandlers()`. These are own properties of the\nreturned instance, so `logger.child()` inherits them without anything being written to Pino's\nshared prototype.\n\n### Request context with AsyncLocalStorage\n\n```javascript\nconst { AsyncLocalStorage } = require('async_hooks');\nconst { createLogger } = require('ntlogger/pino');\n\nconst als = new AsyncLocalStorage();\n\nconst log = createLogger({\n  module: 'API',\n  context: { region: 'us-east-1' },          // constant\n  contextProvider: () => als.getStore(),     // per call\n  contextKeys: ['tenantId', 'userId', 'correlationId'],\n});\n\napp.use((req, res, next) => als.run({ tenantId: req.tenantId, correlationId: req.id }, next));\n\nlog.info('handled');       // -> { module: 'API', region: 'us-east-1', tenantId: ..., correlationId: ... }\nlog.info({ tenantId: 'override' }, 'handled');\n```\n\nPrecedence, lowest to highest:\n\n`service`/`pid`/`hostname` → `module` → `context` → `contextProvider` → fields passed on the log call.\n\n`contextKeys` lets an application hand the provider a large store and expose only a few fields.\nA provider that throws never breaks logging: the context is dropped and a single\n`NTLoggerContextWarning` is emitted via `process.emitWarning`. Non-object return values\n(including arrays and `null`) are ignored.\n\n### Secret redaction\n\nRedaction is **on by default**. It covers the message string, string and plain-object\ninterpolation arguments, the merge object (recursively), `Error` messages and stacks, and child\nbindings. Keys such as `password`, `token`, `authorization`, `apiKey` and `cookie` are replaced\nwholesale; known secret shapes (Bearer/Basic headers, JWTs, AWS/GitHub/Slack/Stripe keys, PEM\nblocks, URL credentials, Discord webhook tokens) are replaced inside free text.\n\n```javascript\ncreateLogger({ redact: false });                         // disable entirely\ncreateLogger({ redact: ['deviceFingerprint'] });         // add app-specific key names\ncreateLogger({ redact: ['payload.cardNumber'] });        // Pino-style path -> Pino's own redact\ncreateLogger({ redact: { replacement: '***', extraPatterns: [/CUST-\\d{8}/g] } });\n```\n\nA string array is split: entries containing `.`, `[`, `]` or `*` are forwarded to Pino's native\n`redact` option (which replaces with Pino's `[Redacted]`), everything else becomes `extraKeys`\nfor ntlogger's redactor (which replaces with `[REDACTED]`). An object is passed straight to\n`createRedactor()` and accepts `keys`, `extraKeys`, `patterns`, `extraPatterns`, `replacement`,\n`maxDepth` and `maxStringLength`.\n\n```javascript\nlog.error(new Error('payment failed for Bearer abc123def456...'));\n// -> { \"err\": { \"type\": \"Error\", \"message\": \"payment failed for Bearer [REDACTED]\", \"stack\": \"...\" },\n//      \"msg\": \"payment failed for Bearer [REDACTED]\" }\n```\n\n### Sampling, rate limiting and deduplication\n\nThe same configuration shapes as the Winston path (see *Log Sampling and Rate Limiting* and\n*Log Deduplication*), applied through Pino's single `hooks.logMethod`.\n\n```javascript\nconst log = createLogger({\n  module: 'Ingest',\n  sampling: { debug: 0.1 },\n  rateLimit: { info: { max: 100, window: 60000 } },\n  deduplication: { enabled: true, threshold: 3, window: 60000 },\n});\n\nlog.getStats();    // { sampling: {...}, deduplication: {...}, levels: {...}, hookErrors: 0 }\nlog.resetStats();\nawait log.close(); // releases the sampler/dedup timers, then flushes the destination\n```\n\n`fatal` is never sampled, rate limited or deduplicated unless the configuration names it\nexplicitly. Per-level counts are collected even without sampling or deduplication.\n\n### Silent mode\n\nResolution order:\n\n1. `opts.silent`, when it is a boolean\n2. `NTLOGGER_SILENT` — `1`/`true`/`yes` → silent, `0`/`false`/`no` → not silent\n3. `NODE_ENV === 'test'` or nonempty `NODE_TEST_CONTEXT` → silent\n\nA silent logger runs at Pino level `silent`, attaches no transport and emits no\nrecords, counts, or observer callbacks. `isSilent(opts)` is exported for testing the resolution.\n\n```javascript\nconst log = createLogger({ module: 'API' });          // silent under Jest (NODE_ENV=test)\nconst log = createLogger({ module: 'API', silent: false }); // force output in a test\n```\n\nNode's built-in test runner is detected through `NODE_TEST_CONTEXT`; `node --test`\nscripts no longer need `NTLOGGER_SILENT=1` for the Pino API.\n\n### Fastify integration\n\nUse the plain options factory to retain Fastify's normal route logger types:\n\n```javascript\nconst Fastify = require('fastify');\nconst { createPinoOptions } = require('ntlogger/pino');\n\nconst app = Fastify({\n  logger: createPinoOptions({\n    service: 'api',\n    contextProvider: () => requestContext.getStore(), // your AsyncLocalStorage\n    serializers: {\n      req: req => ({ method: req.method, url: req.url, headers: req.headers }),\n      res: reply => ({ statusCode: reply.statusCode, headers: reply.getHeaders() }),\n    },\n  }),\n});\napp.addHook('preHandler', async req => {\n  req.log.debug({ body: req.body }, 'parsed request body');\n});\n```\n\nThe factory emits JSON options without creating a transport or installing process\nhandlers. Fastify owns the logger and shutdown. It shares `createLogger()`'s\nservice/module fields, context provider, silent-mode resolution, and redaction.\nDefault request/response serializers retain Fastify's summary fields; headers and\nbodies are opt-in. Bodies are available after parsing, not in the initial request\nlog. See [Fastify's logging documentation](https://fastify.dev/docs/latest/Reference/Logging/).\n\nPass custom serializers **into the factory** so redaction runs on their output.\nReplacing returned formatters, hooks, or serializers (including route-level serializer\noverrides) can bypass protection. Ordinary log objects, message strings, and serialized\nrequest/response/error fields are redacted. Arbitrary child bindings are not covered by\nthe factory's general deep redactor: keep them to identifiers such as `reqId` and\n`tenantId`, or protect specific binding paths with `redact: ['account.secret']`.\n`createLogger()` additionally redacts arbitrary child bindings.\n\nSampling, rate limiting, deduplication, destinations, and process handlers are not\naccepted by this factory; use `createLogger()` for those features. Framework-owned\nloggers do not gain ntlogger's `getStats()`, `resetStats()`, or `close()` methods.\n\n### Capturing test logs\n\n```javascript\nconst { createTestLogger } = require('ntlogger/pino');\nconst { logger, records } = createTestLogger();\nlogger.child({ jobId: 'j1' }).warn({ password: 'secret' }, 'retry');\n// records[0] includes level: 40, jobId: 'j1', password: '[REDACTED]', msg: 'retry'\nawait logger.close();\n```\n\nRecords are captured synchronously after Pino serialization and redaction, with no\nconsole output or worker transport. The helper defaults to level `trace` and overrides\nautomatic/environment silence; explicit `silent: true` still captures nothing.\nSampling and level filtering apply normally. Clear captured records with\n`records.length = 0` when needed.\n\n### Pino lifecycle\n\nPino's `close(timeout?)` marks the logger closed immediately, releases root feature\ntimers, and drains the destination and pending observer work. It is idempotent and\nresolves to `{ drained: true }` or `{ drained: false, error }`; inspect that result.\nWinston's close continues to reject on flush failures.\n\nCalls after close throw, including disabled levels, previously extracted log methods,\nand descendants of a closed logger. Closing a child leaves its parent and siblings\nopen and keeps shared feature timers running. Changing a closed logger's level does\nnot reopen it. Shutdown does not end a caller-supplied destination or shut down an\napplication-owned OTel provider.\n\n### Tee callbacks and emitted counts\n\nBoth `createLogger()` from `ntlogger/pino` and the Winston configuration accept `onLog`:\n\n```javascript\nconst { createLogger } = require('ntlogger/pino');\nconst log = createLogger({\n  onLog: record => dashboard.publish(record), // your dashboard/WebSocket adapter\n});\nlog.child({ jobId: 'j1' }).warn({ deviceId: 'd1' }, 'retry');\nconsole.log(log.getStats().levels.warn); // 1\nawait log.close();\n```\n\nThe callback receives a detached record after redaction, context merging and filtering.\nPino supplies its final serialized fields, including numeric `level` and `msg`. Winston\nsupplies its record before transport-specific formatting, with a level name and `message`. Winston now also applies the default redactor before dispatching to its\ntransports; `redact: false` explicitly disables protection on either backend.\n\n`getStats().levels` contains zero-initialized trace/debug/info/warn/error/fatal/internal\ncounts shared with children. These count records prepared for output, not successful\nnetwork delivery. Sampling/rate-limit/dedup drops and disabled levels do not count.\nWinston's asynchronous calls are reflected after `await log.flush()`.\n`resetStats()` clears level, sampling, dedup and `hookErrors` counters.\n\nCallback exceptions and rejected promises do not interrupt primary logging; they\nincrement `hookErrors`. Logs made by callbacks still reach primary output but do not\ninvoke observers again, including across asynchronous continuations. Async callbacks\nare awaited by Pino close and Winston flush/close, bounded by the shutdown timeout.\n`onLogMaxPending` caps in-flight callback promises (default 100; zero disables callbacks).\nAt capacity, the newest callback is dropped; the primary log and OTel export continue.\nAlready-running promises are never cancelled. `getStats().onLog` reports `pending`,\n`dropped`, and `limit`; reset clears drops but preserves the live pending gauge.\nCallback mutation cannot change the primary log or its OTel export. Return the delivery\npromise if it needs to be included in shutdown; detached background work is not tracked.\n\nPino **9.14 or newer** is required for the serialized-output hook. This raises the old\nPino 8 minimum as part of the v4.0.0 installation migration.\n\n### Scoped credential values\n\nScanner defaults include `community`, `authPassword`, `privPassword`, and `passphrase`,\nincluding case/hyphen/underscore aliases and short or quoted free-text values. For an\nopaque credential that might appear in an error without a recognizable key:\n\n```javascript\nconst { createLogger, withSecretValues } = require('ntlogger/pino');\nconst log = createLogger({ module: 'scanner' });\nawait withSecretValues([credentialValue], async () => {\n  log.info({ runId, workId }, 'scan started');\n  await runScan();\n});\n```\n\n`withSecretValues` is also exported by the Winston entry point. It scopes literal-value\nredaction to the callback and its async descendants, restores the parent afterward,\nand handles JSON-escaped forms. Use nonempty strings, at most 128 distinct values of\n65536 characters each. Short values can obscure unrelated text. Descendant tasks inherit\nsecrets until they finish; avoid unrelated background work inside the scope. Explicit\n`redact: false` disables this protection along with other redaction. Context fields\n`runId`, `workId`, `stageId`, `deviceId`, and `collectionCycleId` now render in Pino's\npretty context suffix as well as remaining searchable in JSON.\n\n### Python companion and shared contract\n\nA dependency-free Python 3.10+ companion is maintained in [python/](python/README.md).\nIt provides `protect_handler`, `NdjsonFormatter`, `SafeFormatter`, `log_context`,\n`secret_values`, `SnapshotFilter`, and `create_test_logger`. Existing agent handlers,\nper-mode filenames, rotation and permissions remain application-owned. The companion\nadds sanitized structured records and exception details without requiring Node.\nInstall locally with `python -m pip install ./python`; the new Python package is not\npublished. Agent adoption is documented rather than applied to its repository.\n\nShared redaction snapshots and conformance fixtures are exported at\n`ntlogger/contract/redaction.json` and `ntlogger/contract/conformance.json`. The Python\nwheel bundles the same defaults. `npm run test:contract` verifies generation; both\nlanguage suites run the fixtures, including Python TRACE 5 → Pino 10.\n\n### OpenTelemetry correlation and export\n\nUse your existing logs SDK provider and processors; ntlogger does not create a global\nprovider or a second pipeline. With a batch processor and OTLP exporter already attached:\n\n```javascript\nconst { createLogger } = require('ntlogger/pino');\nconst log = createLogger({ otel: { loggerProvider, name: 'worker' } });\n// Inside your application's active span:\nlog.info({ jobId: 'j1' }, 'job started');\nconst result = await log.close(); // calls the supplied provider's forceFlush(), if present\n// Shut down the application-owned provider separately when all producers have stopped.\n```\n\nEnable a context manager/tracing SDK in the application so the active span is available.\nThe bridge adds `traceId`, `spanId` and `traceFlags` to Pino JSON and supplies the active\ncontext to the OTel SDK, with correct severity mapping and redacted attributes. Nested\nattributes are JSON strings; Pino error fields also map to OTel exception attributes.\nNo active span means no invented trace IDs. `otel: true` uses the globally registered\nlogs provider; without a configured SDK provider that provider is a no-op. Install\n`@opentelemetry/api` and `@opentelemetry/api-logs` plus your chosen SDK/exporter packages\nonly when enabling this option. Both backends support the option; do not also enable\nthe Winston OTel plugin for the same output or records will be exported twice.\n\n`createPinoOptions()` also accepts `onLog` and `otel`. Fastify still owns its lifecycle;\ntrack async callback promises and flush the provider in your application shutdown hook.\nIt does not gain ntlogger's counters or close method. SDK exporters can report delivery\nerrors through their own diagnostics rather than rejecting provider flush; a successful\ndrain alone is not a delivery acknowledgment.\n\nThe library tests verify real SDK records and HTTP OTLP delivery to a local collector.\nThe API/worker deployments still need adoption and a check of their own collector routing.\n\n### Structured logging lint rule\n\nThe optional ESLint plugin supports ESLint 9+ and has no runtime logger dependencies.\nEnable it for Pino call sites in a flat configuration:\n\n```javascript\nconst ntlogger = require('ntlogger/eslint');\nmodule.exports = [{\n  files: ['src/**/*.js'],\n  plugins: { ntlogger },\n  rules: {\n    'ntlogger/prefer-object-first': ['warn', {\n      loggerNames: ['log', 'logger', 'req.log', 'request.log'],\n    }],\n  },\n}];\n```\n\nIt reports interpolated first-argument template strings. `--fix` adds searchable fields\nwhile retaining the original message only when each expression is a known primitive\n`const` identifier and there are no other arguments. Calls, getters, mutable values and\ncomplex expressions are reported without a fix. Convert those manually, for example\n`log.info({ deviceId: device.id }, 'scan started')`. Receiver matching is configurable\nand syntactic; scope the rule to Pino code, since Winston's message-first methods have\na different contract. Consumer call-site migrations are not performed in this repository.\n\n### Process handlers\n\nOpt-in only — importing the library never installs process listeners.\n\n```javascript\nconst log = createLogger({\n  module: 'API',\n  processHandlers: {\n    timeout: 4000,\n    signals: ['SIGTERM', 'SIGINT'],\n    onShutdown: async reason => { await server.close(); },\n  },\n});\n\n// later\nlog.uninstallProcessHandlers();\n```\n\n`installProcessHandlers(logger, opts)` and `drainLogger(logger, timeout)` are also exported\ndirectly for loggers not built by `createLogger()`.\n\nSee `examples/pino-advanced.js` for all of the above in one runnable file.\n\n## Custom Levels and Colors\nNightTimeLogger provides custom log levels and colors for enhanced logging experience:\n\n### Levels:\n\n- trace: 5\n- debug: 4\n- info: 3\n- warn: 2\n- error: 1\n- fatal: 0\n- internal: 6\n\n### Colors:\n\n- trace: Light gray\n- debug: White\n- info: Green\n- warn: Yellow\n- error: Red\n- fatal: Magenta\n- internal: Bright yellow\n\n## File and Console Formatters\nNightTimeLogger supports both file and console log formatters. File-formatted logs are stored in the project's root `/logs` directory.\n\n## License\nNightTimeLogger is licensed under the [GPL-3.0 License](https://opensource.org/licenses/GPL-3.0).\n## Maintenance checks\n\nRun `npm ci` and `npm run test:coverage` for the complete suite. MySQL and PostgreSQL integration tests start disposable Docker containers; CI sets `REQUIRE_DOCKER_TESTS=1` so they cannot silently skip. `npm run test:unit` excludes those two Docker suites for local work. `npm audit` checks all dependencies; `npm audit --omit=dev` checks production dependencies.\n\nHTTP transports (Discord, Teams, OpenObserve) accept `timeout` (5000 ms per attempt), `maxRetries` (3), `retryDelay` (1000 ms), and `maxPending` (100 outstanding deliveries). They retry connection failures, HTTP 429 and 5xx with bounded backoff. Queue overflow, terminal HTTP errors, and timeouts surface through callbacks/flush. Delivery is best-effort with retries, not durable storage; an ambiguous network failure can lead to a duplicate on retry. OpenObserve retains batching and flush now waits for responses. Increase `shutdownTimeout` if you configure longer retries.\n\nPacked installation checks: run `npm run test:package`. This requires npm registry access and uses temporary consumer directories to verify Pino-only and Winston-only installs.\n","readmeFilename":"README.md"}