UNPKG

logsdx

Version:

log streaming with dx on the 🧠

1 lines • 12.3 kB
{"version":3,"sources":["/Users/jeff/code/oss/logsdx/dist/index.cjs","../src/parsers/regex/rules.ts","../src/parsers/regex/index.ts","../src/parsers/custom.ts"],"names":[],"mappings":"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","file":"/Users/jeff/code/oss/logsdx/dist/index.cjs","sourcesContent":[null,"import { type RegexParserRule, type LogLevel } from \"../../types\";\n\nexport const logParserRules: RegexParserRule[] = [\n // Language markers\n {\n match: /^\\[json\\]/i,\n extract: () => ({ lang: \"json\" }),\n },\n {\n match: /^\\[sql\\]/i,\n extract: () => ({ lang: \"sql\" }),\n },\n {\n match: /^\\[lang:(\\w+)\\]/i,\n extract: (_line, match) => ({ lang: match[1]?.toLowerCase() }),\n },\n\n // Log levels with various formats\n {\n match: /\\[(ERROR|ERR|FATAL|CRITICAL)\\]/i,\n extract: () => ({ level: \"error\" as LogLevel }),\n },\n {\n match: /\\[(WARN|WARNING|ATTENTION)\\]/i,\n extract: () => ({ level: \"warn\" as LogLevel }),\n },\n {\n match: /\\[(INFO|INFORMATION)\\]/i,\n extract: () => ({ level: \"info\" as LogLevel }),\n },\n {\n match: /\\[(DEBUG|TRACE|VERBOSE)\\]/i,\n extract: () => ({ level: \"debug\" as LogLevel }),\n },\n {\n match: /\\[(SUCCESS|SUCCEEDED|COMPLETED)\\]/i,\n extract: () => ({ level: \"success\" as LogLevel }),\n },\n\n // Common log formats\n {\n match:\n /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?)\\s+\\[(\\w+)\\]\\s+(.*)$/,\n extract: (_line, match) => ({\n timestamp: match[1],\n level: match[2]?.toLowerCase() as LogLevel,\n message: match[3],\n }),\n },\n {\n match:\n /^(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?)\\s+\\[(\\w+)\\]\\s+(.*)$/,\n extract: (_line, match) => ({\n timestamp: match[1],\n level: match[2]?.toLowerCase() as LogLevel,\n message: match[3],\n }),\n },\n {\n match:\n /^\\[(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?)\\]\\s+\\[(\\w+)\\]\\s+(.*)$/,\n extract: (_line, match) => ({\n timestamp: match[1],\n level: match[2]?.toLowerCase() as LogLevel,\n message: match[3],\n }),\n },\n\n // Simple level detection (fallback)\n {\n match: /\\b(ERROR|ERR|FATAL|CRITICAL)\\b/i,\n extract: () => ({ level: \"error\" as LogLevel }),\n },\n {\n match: /\\b(WARN|WARNING|ATTENTION)\\b/i,\n extract: () => ({ level: \"warn\" as LogLevel }),\n },\n {\n match: /\\b(INFO|INFORMATION)\\b/i,\n extract: () => ({ level: \"info\" as LogLevel }),\n },\n {\n match: /\\b(DEBUG|TRACE|VERBOSE)\\b/i,\n extract: () => ({ level: \"debug\" as LogLevel }),\n },\n {\n match: /\\b(SUCCESS|SUCCEEDED|COMPLETED)\\b/i,\n extract: () => ({ level: \"success\" as LogLevel }),\n },\n];\n","import { createRegexLineParser } from \"@/src/parsers/regex/line\";\nimport { logParserRules } from \"@/src/parsers/regex/rules\";\n\nexport const regexBasedParser = createRegexLineParser(logParserRules);\nexport { logParserRules, createRegexLineParser };\n","import {\n type LineParser,\n type LineParseResult,\n type LogLevel,\n} from \"@/src/types\";\n\nexport type CustomParserOptions = {\n name: string;\n description?: string;\n canParse?: (line: string) => boolean;\n parse: (line: string) => LineParseResult | undefined;\n validate?: () => boolean;\n};\n\n/**\n * Creates a custom parser with the given options\n * @param options Parser options\n * @returns A line parser function\n */\nexport function createCustomParser(options: CustomParserOptions): LineParser {\n // Validate the parser if a validation function is provided\n if (options.validate && !options.validate()) {\n throw new Error(`Invalid configuration for parser '${options.name}'`);\n }\n\n // Create the parser function\n const parser: LineParser = (line: string): LineParseResult | undefined => {\n // Check if the parser can handle this line\n if (options.canParse && !options.canParse(line)) {\n return undefined;\n }\n\n // Parse the line\n return options.parse(line);\n };\n\n // Add metadata to the parser function\n (parser as any).name = options.name;\n (parser as any).description =\n options.description || `Custom parser: ${options.name}`;\n\n return parser;\n}\n\n/**\n * Creates a parser factory function for registering with the parser registry\n * @param options Parser options\n * @returns A parser factory function\n */\nexport function createParserFactory(options: CustomParserOptions) {\n return async (): Promise<LineParser> => {\n return createCustomParser(options);\n };\n}\n\n/**\n * Helper function to map log levels from various formats to standard levels\n * @param level The log level to map\n * @returns A standardized log level\n */\nexport function mapLogLevel(level: string): LogLevel {\n const levelMap: Record<string, LogLevel> = {\n // Standard levels\n debug: \"debug\",\n info: \"info\",\n warn: \"warn\",\n warning: \"warn\",\n error: \"error\",\n err: \"error\",\n success: \"success\",\n trace: \"trace\",\n\n // Common variations\n fatal: \"error\",\n critical: \"error\",\n notice: \"info\",\n verbose: \"debug\",\n silly: \"debug\",\n\n // Status-based levels\n fail: \"error\",\n failed: \"error\",\n failure: \"error\",\n pending: \"warn\",\n in_progress: \"info\",\n completed: \"success\",\n };\n\n const normalizedLevel = level.toLowerCase().trim();\n return levelMap[normalizedLevel] || \"info\";\n}\n\n/**\n * Example: Creates a parser for CSV-formatted logs\n */\nexport function createCsvLogParser() {\n return createParserFactory({\n name: \"csv-logs\",\n description: \"Parser for CSV-formatted logs\",\n canParse: (line: string) => line.startsWith(\"CSV_LOG:\"),\n parse: (line: string): LineParseResult | undefined => {\n // Remove the prefix\n const csvContent = line.substring(8);\n\n // Parse the CSV-like format\n const parts = csvContent.split(\",\");\n if (parts.length < 3) {\n return undefined;\n }\n\n // Extract information\n const timestamp = parts[0]?.trim() || \"\";\n const level = mapLogLevel(parts[1]?.trim() || \"\");\n const message = parts[2]?.trim() || \"\";\n\n // Create the result\n const result: LineParseResult = {\n timestamp,\n level,\n message,\n format: \"csv\",\n };\n\n // Add any additional fields\n for (let i = 3; i < parts.length; i++) {\n const part = parts[i];\n if (part) {\n const [key, value] = part.split(\"=\");\n if (key && value) {\n result[key.trim()] = value.trim();\n }\n }\n }\n\n return result;\n },\n });\n}\n\n/**\n * Example: Creates a parser for application-specific logs\n */\nexport function createAppLogParser() {\n return createParserFactory({\n name: \"app-logs\",\n description: \"Parser for application-specific logs\",\n canParse: (line: string) => line.startsWith(\"[APP]\"),\n parse: (line: string): LineParseResult | undefined => {\n // Match application-specific log format\n const appLogRegex =\n /^\\[APP\\]\\s+(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})\\s+\\[(\\w+)\\]\\s+(.*)$/;\n const appLogMatch = line.match(appLogRegex);\n\n if (appLogMatch && appLogMatch[1] && appLogMatch[2] && appLogMatch[3]) {\n return {\n timestamp: appLogMatch[1],\n level: mapLogLevel(appLogMatch[2]),\n message: appLogMatch[3],\n service: \"app\",\n };\n }\n\n // Match error stack traces\n const errorRegex = /^\\[APP\\]\\s+ERROR\\s+(.*?):\\s+(.*)$/;\n const errorMatch = line.match(errorRegex);\n\n if (errorMatch && errorMatch[1] && errorMatch[2]) {\n return {\n level: \"error\",\n message: `${errorMatch[1]}: ${errorMatch[2]}`,\n service: \"app\",\n };\n }\n\n return undefined;\n },\n });\n}\n"]}