Освоение журналирования в Grails: организация журналов в разные файлы

Вы устали просматривать огромный файл журнала, пытаясь найти нужную информацию при работе с Grails? Не смотрите дальше! В этой статье блога мы рассмотрим различные способы настройки Logback в Grails, чтобы вы могли организовывать журналы в отдельные файлы в соответствии с потребностями вашего приложения. Так что берите чашечку кофе, садитесь поудобнее и начнем!

Метод 1: файл конфигурации журнала

Первый метод предполагает создание файла конфигурации Logback в вашем приложении Grails. Создайте файл с именем logback.groovy(или logback.xml) в каталоге grails-app/conf. Этот файл будет содержать конфигурацию для входа в систему.

Вот базовый пример файла конфигурации Logback с двумя отдельными приложениями, каждое из которых записывает журналы в отдельный файл:

import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.rolling.RollingFileAppender
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
appender("FILE1", RollingFileAppender) {
    file = "logs/app1.log"
    encoder(PatternLayoutEncoder) {
        pattern = "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
    }
    rollingPolicy(TimeBasedRollingPolicy) {
        fileNamePattern = "logs/app1.%d{yyyy-MM-dd}.%i.log"
        maxHistory = 7
        cleanHistoryOnStart = true
    }
}
appender("FILE2", RollingFileAppender) {
    file = "logs/app2.log"
    encoder(PatternLayoutEncoder) {
        pattern = "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
    }
    rollingPolicy(TimeBasedRollingPolicy) {
        fileNamePattern = "logs/app2.%d{yyyy-MM-dd}.%i.log"
        maxHistory = 7
        cleanHistoryOnStart = true
    }
}
root(INFO, ["FILE1", "FILE2"])

В этом примере мы определяем два приложения (FILE1и FILE2) с соответствующими путями к файлам журналов. Мы также указываем шаблон формата сообщений журнала и настраиваем политику чередования для создания нового файла журнала каждый день (fileNamePattern = "logs/app1.%d{yyyy-MM-dd}.%i.log"). Свойство maxHistoryгарантирует сохранение только семи последних файлов журнала, а свойство cleanHistoryOnStartудаляет старые файлы журнала при запуске приложения.

Метод 2: использование DSL для ведения журналов Grails

Grails предоставляет удобный DSL для ведения журнала (Domain-Specific Language), который позволяет программно настраивать средства ведения журнала и приложения. Этот метод особенно полезен, если вы хотите динамически настраивать средства ведения журнала в зависимости от условий выполнения.

Вот пример того, как можно настроить различные файлы журналов с помощью Grails Logging DSL:

import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.rolling.RollingFileAppender
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
import grails.util.logging.Log
Log.logger("com.myapp.app1", INFO) {
    appenders {
        appender("FILE1", RollingFileAppender) {
            file = "logs/app1.log"
            encoder(PatternLayoutEncoder) {
                pattern = "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
            }
            rollingPolicy(TimeBasedRollingPolicy) {
                fileNamePattern = "logs/app1.%d{yyyy-MM-dd}.%i.log"
                maxHistory = 7
                cleanHistoryOnStart = true
            }
        }
    }
}
Log.logger("com.myapp.app2", INFO) {
    appenders {
        appender("FILE2", RollingFileAppender) {
            file = "logs/app2.log"
            encoder(PatternLayoutEncoder) {
                pattern = "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
            }
            rollingPolicy(TimeBasedRollingPolicy) {
                fileNamePattern = "logs/app2.%d{yyyy-MM-dd}.%i.log"
                maxHistory = 7
                cleanHistoryOnStart = true
            }
        }
    }
}

В этом примере мы используем метод Log.loggerдля определения средств ведения журнала для конкретных пакетов (com.myapp.app1и com.myapp.app2). Внутри каждого регистратора мы определяем соответствующее приложение и его конфигурацию, аналогично методу 1. Наконец, мы настраиваем корневой регистратор на определенный уровень журнала (INFO) и связываем его с определенными нами приложениями.

Метод 3: использование профилей журнала

Профили журналирования позволяют условно применять различные конфигурации ведения журнала в зависимости от различных факторов, таких как свойства среды или системы. Этот метод позволяет легко переключаться между различными конфигурациями журналов.

Вот пример того, как вы можете использовать профили Logback для входа в различные файлы:

import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.rolling.RollingFileAppender
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
import grails.util.Environment
if (Environment.current == Environment.DEVELOPMENT) {
    appender("FILE1", RollingFileAppender) {
        file = "logs/dev/app1.log"
        encoder(PatternLayoutEncoder) {
            pattern = "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
        }
        rollingPolicy(TimeBasedRollingPolicy) {
            fileNamePattern = "logs/dev/app1.%d{yyyy-MM-dd}.%i.log"
            maxHistory = 7
            cleanHistoryOnStart = true
        }
    }
    appender("FILE2", RollingFileAppender) {
        file = "logs/dev/app2.log"
        encoder(PatternLayoutEncoder) {
            pattern = "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
        }
        rollingPolicy(TimeBasedRollingPolicy) {
            fileNamePattern = "logs/dev/app2.%d{yyyy-MM-dd}.%i.log"
            maxHistory = 7
            cleanHistoryOnStart = true
        }
    }
} else {
    appender("FILE1", RollingFileAppender) {
        file = "logs/prod/app1.log"
        encoder(PatternLayoutEncoder) {
            pattern = "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
        }
        rollingPolicy(TimeBasedRollingPolicy) {
            fileNamePattern = "logs/prod/app1.%d{yyyy-MM-dd}.%i.log"
            maxHistory = 7
            cleanHistoryOnStart = true
        }
    }
    appender("FILE2", RollingFileAppender) {
        file = "logs/prod/app2.log"
        encoder(PatternLayoutEncoder) {
            pattern = "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
        }
        rollingPolicy(TimeBasedRollingPolicy) {
            fileNamePattern = "logs/prod/app2.%d{yyyy-MM-dd}.%i.log"
            maxHistory = 7
            cleanHistoryOnStart = true
        }
    }
}
root(INFO, ["FILE1", "FILE2"])

В этом примере мы используем класс Environmentиз Grails для проверки текущей среды. В зависимости от среды мы настраиваем различные приложения и пути к файлам журналов. В среде разработки журналы будут записываться в файлы в каталоге logs/dev, а в производственной среде журналы будут записываться в файлы в каталоге logs/prod.

Заключение

В этой статье мы рассмотрели различные способы настройки Logback в Grails и входа в различные файлы. Вы можете выбрать метод, который лучше всего соответствует вашим потребностям, исходя из требований вашего приложения. Независимо от того, предпочитаете ли вы подход с использованием файла конфигурации, использование Grails Logging DSL или профили Logback, организация журналов в отдельные файлы значительно повысит их читабельность и упростит устранение неполадок.

Не забудьте выбрать описательные имена для файлов журналов и каталогов, чтобы их можно было легко идентифицировать и обслуживать. Удачной регистрации!