@appium/docutils
Version:
Documentation generation utilities for Appium and related projects
82 lines (73 loc) • 2.17 kB
text/typescript
/**
* It's a logger.
*
* Since this is a CLI app only, it doesn't necessarily make sense to consume `@appium/support`'s logger.
*
* @module
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const {ConsolaInstance, createConsola, LogLevel} = require('consola');
import _ from 'lodash';
import {DEFAULT_LOG_LEVEL, LogLevelMap} from './constants';
/**
* The global log level
*
* "Global" inasmuch as any logger created from the root logger will use this level.
*/
let globalLevel: typeof LogLevel = LogLevelMap[DEFAULT_LOG_LEVEL];
/**
* Type guard to see if a string is a recognized log level
* @param level any value
*/
export function isLogLevelString(level: any): level is keyof typeof LogLevelMap {
return level in LogLevelMap;
}
/**
* The logger from which all loggers are created. This one uses a unique tag.
*/
const rootLogger = createConsola({
defaults: {tag: 'docutils'},
fancy: true,
level: globalLevel,
formatOptions: {
colors: true,
date: false,
},
});
// this prevents logging before `initLogger` is called
rootLogger.pauseLogs();
/**
* A map of tags to loggers
*/
const loggers: Map<string, WeakRef<typeof ConsolaInstance>> = new Map();
export function getLogger(tag: string, parent = rootLogger) {
if (loggers.has(tag)) {
const logger = loggers.get(tag)?.deref();
if (logger) {
return logger;
}
}
const logger = parent.withTag(tag);
logger.level = globalLevel;
loggers.set(tag, new WeakRef(logger));
return logger;
}
/**
* Initialize the logging system.
*
* This should only be called once. The loglevel cannot be changed once it is set.
*
* @remarks Child loggers seem to inherit the "paused" state of the parent, so when this is called, we must resume all of them.
*/
export const initLogger = _.once((level: keyof typeof LogLevelMap | typeof LogLevel) => {
globalLevel = isLogLevelString(level) ? LogLevelMap[level] : level;
rootLogger.level = globalLevel;
rootLogger.resumeLogs();
for (const ref of loggers.values()) {
const logger = ref.deref();
if (logger) {
logger.level = globalLevel;
logger.resumeLogs();
}
}
});