Журнал проекта Java

Java задняя часть Java EE
Журнал проекта Java

Привет, мне 3г. Перед основным текстом я хотел бы сообщить акционерам о ходе реализации проекта «Остин»:

В целом я чувствую, что отклик на этот раз хороший, хотя громкость чтения невысокая. Но есть еще много людей, оставляющих комментарии, и многие люди беспокоятся, что я пропаду (обновление будет прервано на полпути)

Все, что я могу сказать, это: не паникуйте, определенно не ныряйте,Вы просто преследуете его лучше.

Я решил носить свой компьютер домой каждые выходные и ходить в ближайшую библиотеку, когда у меня есть время (библиотека - это YYDS обучения, а эффективность дома намного ниже, чем у библиотеки)

ББ много не бывает, продолжим разговор на сегодняшнюю тему:журнал

01. Что такое журнал

Так называемый лог, как я понимаю, это:Запись информации во время работы программы

На начальном этапе Java или на нашем начальном этапе журнал печати полностью основан наSystem.out.println();

Это работает? Это для обсуждения.

Для большинства начинающих, проста в использовании! Информация, которую я хочу видеть, непосредственно наconsoleВы видите, насколько это удобно. Все первые результаты изучения Java сделаныSystem.out.println();Выходите, нет необходимости иметь какие-либо затраты на обучение.

Для большинства рабочих локальная отладка подходит, но если программа развернута на сервере, это нормально.

Производственная среда отличается от локальной среды:

  • В производственной среде необходимо записывать больше журналов (ведь она работает онлайн как система/проект, и невозможно распечатать лишь немного контента)
  • Содержимое журнала производственной среды необходимо сохранить в файл (в качестве сохранения онлайн не скажет, что проблема обнаружена в первый раз, многим нужно найти исторические данные журнала)
  • Содержимое журнала производственной среды должно иметь определенный стандартный формат (должно быть указано как минимум время записи журнала).

вышеуказанные требования,System.out.println();недоступны.

Итак, мы видим, что проекты, написанные в компании, бесполезны.System.out.println();журнал

02. Система журналов Java

Поработав, вы обнаружите, что каждый раз, когда вы вводите фреймворк, под этот фреймворк есть почти соответствующий пакет логов.

Ранее я интегрировал в компанию несколько проектов (объединение нескольких оригинальных проектов в один проект).

Систему надо делить долго, а делить надо долго.В то время считалось, что предыдущие коллеги слишком мелко разделили проект, что привело к определенной трате ресурсов (ведь каждый проект, работающий в сети, развернет как минимум две онлайн-машины), поэтому какое-то время компания надеялась, что мы объединим несколько небольших проектов.

Что касается правильного или неправильного, я не буду говорить об этом.

В процессе слияния самое хлопотное решить проблему конфликтов зависимостей (все проекты Maven, и будет проблема Maven-арбитража), а здесь самая очевидная проблема — пакет лога Java.

Если вы немного знакомы с логированием Java, вы должны были слышать о следующих названиях:Log4j(лог для java),JUL(Java Util Logging),JCL(Ведение журнала Джакарта Коммонс),Slf4j(Простой фасад ведения журнала для Java),Logback,Log4j2

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

Поскольку реализация отличается, соответствующий вызов API отличается? (Ведь он не похож на JDBC, он определяет набор спецификаций интерфейса, каждый производитель баз данных реализует спецификацию JDBC, а программисты делают программирование для интерфейса JDBC)

Так это не бардак? Думая об этом, артериальное давление постепенно повышается? Не паникуйте, журнал Java, упомянутый вышеSlf4j(Simple Logging Facade for Java) делает что-то похожее на то, что делает JDBC.

Он определяет интерфейс лога (режим фасада), когда в проекте используются другие фреймворки лога, то адаптируйте его! (Примечание: JDBC определяет интерфейс, который реализуется производителями баз данных. Slf4j также определяет интерфейс, но он адаптируется к другим реализациям журналов Java, не правда ли?)

Смотрим картинку на официальном сайте Slf4j, должно быть понятно:

После стольких разговоров об этом я хочу сказать следующее: в нашем проекте лучше всего использовать API, предоставляемый Slf4j, Что касается реальной реализации LOG, мы можем использоватьSlf4j для моста(Таким образом, возможно, однажды в будущем будет сказано, что log4j будет изменен на logback, и код программы не нужно будет менять)

03. Какая польза от журнала?

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

С одной стороны, мы используем его для локализации проблемы, с другой стороны, мыМногие данные также поступают из журналов

Не думайте, что данные, хранящиеся в базе данных, важны, мыДанные журнала, записанные во время работы программы, не менее важны..

В сфере больших данных существует множество источников данных: реляционные базы данных, краулеры, логи и т. д.

Например, в моей предыдущей компании был фреймворк для обработки журналов:

  1. Обычно мы выводим информацию журнала в файл
  2. Фреймворк предоставляет основу для настройки (путь к файлу и имя темы Kafka).

Грубо говоря, фреймворк делает следующее: преобразует содержимое наших лог-файлов в сообщения Kafka (если пользователю нужно преобразовать содержимое каких лог-файлов в сообщения MQ, это будет сделано в конфигурации на платформе)

Можно ли очищать журналы с сообщениями Kafka с помощью платформы потоковой обработки (Storm/Spark/Flink)?ценные данные

04. Остин Журнал

Я так долго говорил об основах ведения дневника, что просто хочу, чтобы студенты, которые ничего не понимают в ведении дневника, имели представление.

Без дальнейших церемоний, давайте вернемся к проекту austin, мы все еще находимся на стадии «новой папки».

Структура технологии строительства проекта Austin использует SpringBoot, а комбинация журналов SpringBoot по умолчанию:Slf4j + logback

Почти все проекты, с которыми я работал в компании, представляют собой эту комбинацию, поэтому я не планирую ее перемещать, а просто использую напрямую.logbackКак структура реализации журнала Остина (если будет день, чтобы перейти на другую реализацию журнала, теоретически, пока будет введен соответствующий пакет моста, это будет сделано).

05. Первый опыт логбека

Без какой-либо настройки, пока мы представляем пакет SpringBoot, мы можем напрямую использовать функцию журнала. Конкретный эффект показан на рисунке ниже.

SpringBoot этосоглашение о конфигурациирамка

SpringBoot будет загружать ресурсы под именем **logback.xml** по умолчанию илиlogback-spring.xmlФайл конфигурации (формат xml также можно изменить на формат groovy)

Если ни один из них не существует, logback будет вызывать по умолчаниюBasicConfigurator, чтобы создать минимальную конфигурацию.

Минимальная конфигурация состоит из ConsoleAppender, связанного с корневым регистратором. Вывод форматируется с помощью PatternLayoutEncoder с шаблоном **%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n**

06, конфигурация журнала

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

Итак, мы будемresourcesсоздать новыйlogbackконфигурация. Общее содержимое конфигурации выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="10 seconds">

    <contextName>austin</contextName>

    <!-- 设置日志输出路径  可以使“${}”来使用变量。TODO 这里后面是需要读配置的 -->
    <property name="log.path" value="logs"/>


    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/austin-info.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/logs/austin-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>1000MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/austin-error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/austin-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>1000MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <root level="info">
        <!-- TODO console打印后面可以只针对dev环境的 -->
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </root>

</configuration>

Конфигурация лога не будет статична, теперь, когда проект только что построен, он будет максимально простым.

07. Пасхальные яйца

Накануне публикации этой статьи Чжэнь Донг неожиданно спросил меня, какой MQ я использую больше, и я небрежно ответил: Кафка, мой контакт с MQ в основном Кафка.

Он сказал, что пишетхороший, Когда придет время. Мне определенно интересно, когда я это слышу.

Ссылка на статью, размещенную ZhenDong:Tickets.WeChat.QQ.com/Yes/JC51S_BI0…

Статья, вероятно, то, что используют большие парни в Meituan.динамический шаблон АОП+Он инкапсулирует набор SDK, а затем изящно записывает журнал операций (человеческими словами: босс не хочет, чтобы журнал записывался в бизнес-код, которым трудно управлять. Действие записи журнала абстрагируется, и аннотация используется для единообразной записи журнала)

Статья все равно очень увлекательная, рекомендую перечитать.

Прочитав статью, г-н ЧжэньДун самостоятельно реализовал набор, который почти завершен. Кстати, я обсуждал с ним сценарий использования, и чувствую, что мой проект тоже может использовать тот набор вещей (Есть элегантный способ входа в систему, кому он не нравится)

Я уже оговорился, когда он пришлет мне исходники, я изучу идеи реализации (более поздние проекты также будут использовать предоставленный им SDK для логирования, и если возникнут проблемы, я буду брызгать 🐶[собачья голова .jpg]). Когда он закончит писать статью, я ее перепечатаю и выучу вместе с вами.

Подобно такому колесу или опыту мышления, после того, как вы его изучили, вы можете взорвать его во время интервью. Говорят, что он преобразовал систему проектов из первоначальной призрачной (Предыстория введения), становится таким элегантным теперь (Полученные результаты), так и перемежающиеся в этом процессе собственными идеями реализации и встречающимися ямами (тяжелый процесс), эта изюминкаКакому интервьюеру это не нравится??

08. Резюме

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

На самом деле, я мог бы написать это самlogbackКонфигурация игнорирует эту часть, но я все же настаиваю на том, чтобы с ней разобраться.Эта статья разбирает знание лога с самого начала по размерности «проекта», и я надеюсь, что она будет полезна всем.

Исходный код проектаСсылка на гите:gitee.com/austin

Исходный код проектаСсылка на гитхаб:github.com/austin

Обратите внимание на мой публичный аккаунт WeChat【Java3y】Давайте поговорим о другом!

[Онлайн-интервьюер + написание Java-проектов с нуля]Непрерывное высокоинтенсивное обновление! попросить звезду

Оригинал это не просто! ! Проси три! !