diff --git a/packages/consts/src/consts.ts b/packages/consts/src/consts.ts index 2f60b5992..65f0f517d 100644 --- a/packages/consts/src/consts.ts +++ b/packages/consts/src/consts.ts @@ -391,6 +391,7 @@ export const ENV_VARS = { XVFB: 'APIFY_XVFB', MEMORY_MBYTES: 'APIFY_MEMORY_MBYTES', LOG_LEVEL: 'APIFY_LOG_LEVEL', + LOG_FORMAT: 'APIFY_LOG_FORMAT', ACTOR_EVENTS_WS_URL: 'APIFY_ACTOR_EVENTS_WS_URL', CHROME_EXECUTABLE_PATH: 'APIFY_CHROME_EXECUTABLE_PATH', CONTAINER_PORT: 'APIFY_CONTAINER_PORT', diff --git a/packages/log/src/log.ts b/packages/log/src/log.ts index 1ee9b805a..39c1770fd 100644 --- a/packages/log/src/log.ts +++ b/packages/log/src/log.ts @@ -1,7 +1,8 @@ import { LoggerText } from './logger_text'; import { Logger } from './logger'; -import { LogLevel, PREFIX_DELIMITER } from './log_consts'; -import { getLevelFromEnv, limitDepth } from './log_helpers'; +import { LogFormat, LogLevel, PREFIX_DELIMITER } from './log_consts'; +import { getFormatFromEnv, getLevelFromEnv, limitDepth } from './log_helpers'; +import { LoggerJson } from './logger_json'; export interface LoggerOptions { /** @@ -26,13 +27,23 @@ export interface LoggerOptions { data?: Record, } +const getLoggerForFormat = (format: LogFormat): Logger => { + switch (format) { + case LogFormat.JSON: + return new LoggerJson(); + case LogFormat.TEXT: + default: + return new LoggerText(); + } +}; + const getDefaultOptions = () => ({ level: getLevelFromEnv(), maxDepth: 4, maxStringLength: 2000, prefix: null, suffix: null, - logger: new LoggerText(), + logger: getLoggerForFormat(getFormatFromEnv()), data: {}, }); diff --git a/packages/log/src/log_consts.ts b/packages/log/src/log_consts.ts index 156d56565..e680e5d48 100644 --- a/packages/log/src/log_consts.ts +++ b/packages/log/src/log_consts.ts @@ -13,6 +13,11 @@ export enum LogLevel { PERF = 6, } +export enum LogFormat { + JSON = 'JSON', + TEXT = 'TEXT', +} + export const PREFIX_DELIMITER = ':'; export const LEVELS = LogLevel; diff --git a/packages/log/src/log_helpers.ts b/packages/log/src/log_helpers.ts index c5dbb9282..ca67ad597 100644 --- a/packages/log/src/log_helpers.ts +++ b/packages/log/src/log_helpers.ts @@ -1,5 +1,5 @@ import { ENV_VARS } from '@apify/consts'; -import { LogLevel } from './log_consts'; +import { LogLevel, LogFormat } from './log_consts'; /** * Ensures a string is shorter than a specified number of character, and truncates it if not, appending a specific suffix to it. @@ -33,6 +33,25 @@ export function getLevelFromEnv(): number { return +envVar; } +/** + * Gets log format from env variable. Currently, values 'JSON' and 'TEXT' are supported. + * Defaults to 'TEXT' if no value is specified. + */ +export function getFormatFromEnv(): LogFormat { + const envVar = process.env[ENV_VARS.LOG_FORMAT] || LogFormat.TEXT; + + switch (envVar.toLowerCase()) { + case LogFormat.JSON.toLowerCase(): + return LogFormat.JSON; + case LogFormat.TEXT.toLowerCase(): + return LogFormat.TEXT; + default: + // eslint-disable-next-line no-console + console.warn(`Unknown value for environment variable ${ENV_VARS.LOG_FORMAT}: ${envVar}`); + return LogFormat.TEXT; + } +} + /** * Limits given object to given depth and escapes function with [function] string. *