При разработке программного обеспечения ведение журнала является неотъемлемой частью отладки и мониторинга. Однако традиционные методы регистрации могут быть ограничены в информации, которую они предоставляют, особенно в случае ошибок. Чтобы решить эту проблему, метод log
в классе Logger
может автоматически добавлять имя класса и имя метода в сообщения журнала, предоставляя дополнительный контекст, который может значительно улучшить предоставляемую информацию. В этом сообщении блога мы рассмотрим, как метод log
извлекает имена классов и методов из трассировки стека и как использовать его для улучшения задач отладки и мониторинга.
Метод log
в классе Logger
— это мощный инструмент, который позволяет разработчикам регистрировать сообщения с необязательным уровнем и дополнительными параметрами. Одной из наиболее полезных функций этого метода является то, что он автоматически добавляет имя класса и имя метода в сообщения журнала, если метод вызывается из другого класса. Этот контекст может значительно улучшить предоставляемую информацию, особенно в случае ошибок.
Чтобы добавить имена классов и методов в сообщения журнала, метод log
извлекает эту информацию из трассировки стека. Третья строка трассировки стека — это строка, в которой вызывается метод log
, потому что первая строка — это сам метод log
, вторая строка — метод, вызвавший метод log
, а третья строка — метод, вызвавший метод который вызвал метод log
. Вспомогательные функции getClassName
и getMethodName
используют регулярные выражения для сопоставления имен классов и методов в трассировке стека.
/** * Logs a message with an optional level and additional parameters. * don't use this method directly, use the other methods instead. * * If optionalParams is not passed, it will not print anything. * If the method is called from another class, it will add the class name and method name to the message. * * @param {string} message - The message to be logged. * @param {number} level - Optional. The level of the message. * @param {string} optionalParams - Optional. Additional parameters to be logged. * @returns {void} */ log(message, level, ...optionalParams) { // Initialize the prefix as an empty string. let prefix = ""; // Get the third line of the stack trace to identify the class and method names. const trace = new Error().stack.split('\n')[3]; // Helper functions to extract the class and method names from the stack trace. const getClassName = (trace) => { const regex = /at\s+(\w*).(\w*)/; const isConstructor = trace.match(/at\s+new\s/) ? true : false; if (isConstructor) { return trace.match(/at\s+\w*\s(\w*)/)[1]; } else { return trace.match(regex)[1]; } } const getMethodName = (trace) => { const regex = /at\s+(\w*).(\w*)/; const isConstructor = trace.match(/at\s+new\s/) ? true : false; if (isConstructor) { return 'constructor'; } else { return trace.match(regex)[2]; } } // If the method is called from another class, add the class and method names to the message. prefix = `${getClassName(trace)}.${getMethodName(trace)}: `; message = `${prefix}${message}`; // Log the message and optional parameters if the level is greater than or equal to this.level. if (level >= this.level) { console.log(message, optionalParams.length ? optionalParams : ""); } }
В заключение, метод log
в классе регистратора может быть ценным инструментом для разработчиков, когда дело доходит до отладки и устранения неполадок. Автоматически добавляя имя класса и имя метода в сообщения журнала, он предоставляет более подробную информацию, которая может помочь быстрее выявлять и исправлять ошибки.