При разработке программного обеспечения ведение журнала является неотъемлемой частью отладки и мониторинга. Однако традиционные методы регистрации могут быть ограничены в информации, которую они предоставляют, особенно в случае ошибок. Чтобы решить эту проблему, метод 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 в классе регистратора может быть ценным инструментом для разработчиков, когда дело доходит до отладки и устранения неполадок. Автоматически добавляя имя класса и имя метода в сообщения журнала, он предоставляет более подробную информацию, которая может помочь быстрее выявлять и исправлять ошибки.