Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(logger): Log level remapping (#26951)
Co-authored-by: Rhys Arkins <rhys@arkins.net> Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
- Loading branch information
1 parent
3b3f4c1
commit c30a4b0
Showing
11 changed files
with
267 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
import { | ||
getRemappedLevel, | ||
resetGlobalLogLevelRemaps, | ||
resetRepositoryLogLevelRemaps, | ||
setGlobalLogLevelRemaps, | ||
setRepositoryLogLevelRemaps, | ||
} from './remap'; | ||
|
||
describe('logger/remap', () => { | ||
afterEach(() => { | ||
resetRepositoryLogLevelRemaps(); | ||
resetGlobalLogLevelRemaps(); | ||
}); | ||
|
||
it('returns null if no remaps are set', () => { | ||
setGlobalLogLevelRemaps(undefined); | ||
setRepositoryLogLevelRemaps(undefined); | ||
|
||
const res = getRemappedLevel('foo'); | ||
|
||
expect(res).toBeNull(); | ||
}); | ||
|
||
it('performs global remaps', () => { | ||
setGlobalLogLevelRemaps([{ matchMessage: '*foo*', newLogLevel: 'error' }]); | ||
setRepositoryLogLevelRemaps(undefined); | ||
|
||
const res = getRemappedLevel('foo'); | ||
|
||
expect(res).toBe('error'); | ||
}); | ||
|
||
it('performs repository-level remaps', () => { | ||
setGlobalLogLevelRemaps(undefined); | ||
setRepositoryLogLevelRemaps([ | ||
{ matchMessage: '*bar*', newLogLevel: 'error' }, | ||
]); | ||
|
||
const res = getRemappedLevel('bar'); | ||
|
||
expect(res).toBe('error'); | ||
}); | ||
|
||
it('prioritizes repository-level remaps over global remaps', () => { | ||
setGlobalLogLevelRemaps([{ matchMessage: '*foo*', newLogLevel: 'error' }]); | ||
setRepositoryLogLevelRemaps([ | ||
{ matchMessage: '*bar*', newLogLevel: 'warn' }, | ||
]); | ||
|
||
const res = getRemappedLevel('foobar'); | ||
|
||
expect(res).toBe('warn'); | ||
}); | ||
|
||
it('supports regex patterns', () => { | ||
setGlobalLogLevelRemaps([{ matchMessage: '/foo/', newLogLevel: 'error' }]); | ||
setRepositoryLogLevelRemaps(undefined); | ||
|
||
const res = getRemappedLevel('foo'); | ||
|
||
expect(res).toBe('error'); | ||
}); | ||
|
||
it('does not match against invalid regex patterns', () => { | ||
setGlobalLogLevelRemaps([{ matchMessage: '/(/', newLogLevel: 'error' }]); | ||
setRepositoryLogLevelRemaps(undefined); | ||
|
||
const res = getRemappedLevel('()'); | ||
|
||
expect(res).toBeNull(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
import type { LogLevelString } from 'bunyan'; | ||
import { | ||
StringMatchPredicate, | ||
makeRegexOrMinimatchPredicate, | ||
} from '../util/string-match'; | ||
import type { LogLevelRemap } from './types'; | ||
|
||
let globalRemaps: LogLevelRemap[] | undefined; | ||
let repositoryRemaps: LogLevelRemap[] | undefined; | ||
|
||
let matcherCache = new WeakMap<LogLevelRemap, StringMatchPredicate>(); | ||
|
||
function match(remap: LogLevelRemap, input: string): boolean { | ||
const { matchMessage: pattern } = remap; | ||
let matchFn = matcherCache.get(remap); | ||
if (!matchFn) { | ||
matchFn = makeRegexOrMinimatchPredicate(pattern) ?? (() => false); | ||
matcherCache.set(remap, matchFn); | ||
} | ||
|
||
return matchFn(input); | ||
} | ||
|
||
export function getRemappedLevel(msg: string): LogLevelString | null { | ||
if (repositoryRemaps) { | ||
for (const remap of repositoryRemaps) { | ||
if (match(remap, msg)) { | ||
return remap.newLogLevel; | ||
} | ||
} | ||
} | ||
|
||
if (globalRemaps) { | ||
for (const remap of globalRemaps) { | ||
if (match(remap, msg)) { | ||
return remap.newLogLevel; | ||
} | ||
} | ||
} | ||
|
||
return null; | ||
} | ||
|
||
function resetMatcherCache(): void { | ||
matcherCache = new WeakMap(); | ||
} | ||
|
||
export function setGlobalLogLevelRemaps( | ||
remaps: LogLevelRemap[] | undefined, | ||
): void { | ||
globalRemaps = remaps; | ||
} | ||
|
||
export function resetGlobalLogLevelRemaps(): void { | ||
globalRemaps = undefined; | ||
resetMatcherCache(); | ||
} | ||
|
||
export function setRepositoryLogLevelRemaps( | ||
remaps: LogLevelRemap[] | undefined, | ||
): void { | ||
repositoryRemaps = remaps; | ||
} | ||
|
||
export function resetRepositoryLogLevelRemaps(): void { | ||
repositoryRemaps = undefined; | ||
resetMatcherCache(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.