Nano Hash - криптовалюты, майнинг, программирование

Журнал RollingFileAppender FileNotFoundException

Я использую logback в своем проекте с весенней загрузкой. Когда мы развертываем приложение в среде PROD, развертывание завершается ошибкой со следующими исключениями. Перед PROD мы развернули приложение в более низких средах, мы не видели никаких проблем. Может кто-нибудь, пожалуйста, пролить немного света?

В logback.xml мы указали путь к журналу как «/app/tomcatprofile/micro001/logs/sc-erp-security-permissions-check.log», но из приведенных ниже журналов путь к журналу установлен как «/app/tomcatprofile/micro001/ логи".

Также прикрепил наш logback xml.

15:54:22,305 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: /app/tomcatprofile/micro001/logs
15:54:22,305 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - File property is set to [/app/tomcatprofile/micro001/logs]
15:54:22,305 |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - openFile(/app/tomcatprofile/micro001/logs,true) call failed. java.io.FileNotFoundException: /app/tomcatprofile/micro001/logs (Is a directory)
    at java.io.FileNotFoundException: /app/tomcatprofile/micro001/logs (Is a directory)
    at  at java.io.FileOutputStream.open0(Native Method)
    at  at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at  at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at  at ch.qos.logback.core.recovery.ResilientFileOutputStream.<init>(ResilientFileOutputStream.java:26)
    at  at ch.qos.logback.core.FileAppender.openFile(FileAppender.java:204)
    at  at ch.qos.logback.core.FileAppender.start(FileAppender.java:127)
    at  at ch.qos.logback.core.rolling.RollingFileAppender.start(RollingFileAppender.java:100)
    at  at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
    at  at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
    at  at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
    at  at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
    at  at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
    at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)
    at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:152)
    at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)
    at  at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
    at  at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
    at  at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
    at  at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
    at  at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
    at  at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
    at  at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
    at  at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
    at  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
    at  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
    at  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
    at  at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:273)
    at  at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:86)
    at  at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169)
    at  at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5151)
    at  at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at  at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    at  at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    at  at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at  at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:917)
    at  at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1701)
    at  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at  at java.lang.Thread.run(Thread.java:745)

Файл logback.xml

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

<configuration>

    <property name="FILE_PATH" value="${catalina.base}/logs/sc-erp-security-permissions-check.log" />

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d [%t] %-5p %c - %X{TransactionId} - %m%n</Pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>TRACE</level>
        </filter>
    </appender>

    <appender name="mainAppender"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${FILE_PATH}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${FILE_PATH}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <Pattern>%d [%t] %-5p %c - %X{TransactionId} - %m%n</Pattern>
        </encoder>
    </appender>

    <logger name="com.adp.smartconnect" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="mainAppender" />
        <appender-ref ref="consoleAppender" />
    </logger>

    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <logger name="org.springframework.web" level="INFO"/>
    <logger name="org.springframework.boot" level="WARN"/>
    <logger name="org.springframework.jmx" level="WARN"/>
    <logger name="com.adp.smartconnect.commons" level="WARN" />
    <logger name="springfox" level="WARN"/>

    <logger name="org.springframework.ws.client.MessageTracing.sent" level="INFO"/>
    <logger name="org.springframework.ws.client.MessageTracing.received" level="INFO"/>
    <logger name="org.springframework.ws.server.MessageTracing" level="INFO"/>

    <root>
        <level value="INFO" />
        <appender-ref ref="mainAppender" />
        <appender-ref ref="consoleAppender" />
    </root>
</configuration>

  • Значением <file> должно быть имя файла, а не имя каталога. Как говорится в сообщении об ошибке, /app/tomcatprofile/micro001/logs — это каталог, т. е. не файл. Возможно, вам следует прочитать документацию о том, как работает RollingFileAppender, прежде чем пытаться его использовать. 21.10.2018
  • @Andreas, если вы посмотрите на наш файл logback.xml, мы установим имя файла как /app/tomcatprofile/micro001/logs/sc-erp-security-permissions-check.log. См. конфигурацию ниже. ‹имя свойства=FILE_PATH значение=${catalina.base}/logs/sc-erp-security-permissions-check.log /› 21.10.2018
  • @Andreas, кстати, это не вызывает проблем в более низких средах. 21.10.2018
  • Существует ли папка /app/tomcatprofile/micro001/logs и авторизован ли пользователь Tomcat для записи в эту папку? 21.10.2018
  • @Andreas Андреас да, этот путь существует, и есть другие приложения, которые записывают журналы в тот же каталог. 21.10.2018
  • Это был не мой вопрос. Авторизован ли пользователь, работающий с Tomcat? Неважно, что делают другие программы, потому что они, скорее всего, работают под другим пользователем, чем Tomcat, учитывая, что стандартные настройки Tomcat на машинах Linux запускают Tomcat с использованием выделенного tomcat пользователя и группы. 21.10.2018
  • Пользователь @Andreas, которого мы используем для развертывания, является суперпользователем и имеет права на чтение/запись. 21.10.2018
  • Хорошо, просто для подтверждения терминологии: Deploy – это установка. код, например в Tomcat это слово используется для установки нового файла войны. Даже если вы вошли в систему как суперпользователь, когда устанавливали сам Tomcat, это не означает, что фоновый сервисный процесс Tomcat работает как этот суперпользователь. Если вы запустите ps -Af, какое имя пользователя будет отображаться для процесса, в котором работает Tomcat? В моем CentOS он говорит, что пользователь tomcat, хотя я всегда вхожу в систему только как root. 21.10.2018
  • @Andreas, когда я запустил эту команду, я увидел пользователя «wasadmin», который является нашим суперпользователем. Между прочим, я очень ценю время, которое вы уделяете моему вопросу. 21.10.2018

Ответы:


1

Наша конфигурация журнала использует внутреннюю реализацию журнала Spring-boot, после того как я удалил строку ниже из logback.xml, проблема решена.

<include resource="org/springframework/boot/logging/logback/base.xml"/>

Примечание. Наша версия с весенней загрузкой — 1.5.10.

Загадочные вопросы:

  1. Мы до сих пор не знаем, почему он удаляет «sc-erp-security-permissions-check.log» из полного пути к файлу журнала.
  2. С помощью base.xml развертывание было успешным на этапах разработки, контроля качества и стадии, но с ошибкой только на 2 из 4 узлов в PROD.

Я все еще провожу свое исследование, чтобы выяснить точную первопричину, обновлю этот ответ, если что-то найду.

Спасибо @Andreas за его быстрые ответы.

23.10.2018
  • У вас есть шанс найти точную причину? Я сталкиваюсь с той же проблемой. Он отлично работает в более низких средах, но не работает в Prod. 30.03.2020

  • 2

    В моем случае проблема вызвана тем, что у работающего пользователя нет разрешения на создание папки, содержащей файл журнала, который я установил в /var/log/webcast.

    Что решить мою проблему, так это дать разрешение работающему пользователю в моем файле .service:

    [Unit]
    Description=myapp
    After=syslog.target
    
    [Service]
    User=webcast
    ExecStart=/bin/bash /opt/webcast/run.sh
    SuccessExitStatus=143
    Restart=always
    RestartSec=5
    StartLimitInterval=1
    
    [Install]
    WantedBy=multi-user.target
    

    sudo usermod -aG adm веб-трансляция

    27.09.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..