mkyong - Spring Boot: no se ha escrito ningún archivo de registro(logging.file no se respeta)
spring boot logging mkyong (8)
Utilizo Spring Boot y quiero que escriba la salida del registro en un archivo.
Según los documentos, esto se hace simplemente estableciendo
logging.file=filename.log
Mientras que la salida de la consola funciona bien, filename.log
no se crea. Además, si creo el archivo manualmente, no se escribe nada en él. ¿Qué extraño?
Acabo de usar el mecanismo de registro provisto por Spring-boot. Escribí a continuación en mi archivo ''logback.xml'':
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/file- appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
Puse los archivos application.properties y logback.xml bajo el mismo paquete ''src / main / resources''. En el archivo application.properties acaba de agregar un parámetro:
logging.file = xyz.log
Funcionó perfectamente bien para mí.
Aquí es cómo me las arreglé para escribir la salida en un archivo local. Para deshabilitar el registro de la consola y escribir la salida solo en un archivo, necesita un logback-spring.xml personalizado ( llámelo logback-spring.xml para poder aprovechar las funciones de plantillas (formato de fecha, etc.) que proporciona Boot) que importa file-appender.xml en lugar de console-appender.xml. Para lograr esto, debe pegar este código a continuación en su archivo logback-spring.xml.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
También debe agregar lo siguiente a su application.properties:
logging.file=myapplication.log
Tenga en cuenta que este archivo de registro myapplication.log será generado por springboot.
Así es como se ve mi árbol de estructura de aplicaciones:
Si desea divertirse más, puede ubicar el archivo base.xml en sus dependencias de Maven de la siguiente manera:
En mi caso, agregué por error un archivo "logback.xml" en uno de mis submódulos que causó este problema, elimínelo y todo estará bien.
Encontré una solución. No estoy muy contento con esto ya que todavía no responde a mi pregunta original por qué no se respeta la propiedad logging.file
.
logback-spring.xml
el logback-spring.xml
partir de la answer de Georges en el mismo directorio donde reside application.properties
. De acuerdo a la documentation Spring Boot lo recogerá desde allí. Al parecer, esto no sucede en mi caso.
Necesito agregar adicionalmente logging.config=classpath:logback-spring.xml
para que Spring lo logging.config=classpath:logback-spring.xml
. Las partes relevantes de mi application.properties
son ahora
logging.config=classpath:logback-spring.xml
logging.file=logs/logfile.log
( logs
directorio de logs
manualmente).
No sé si esto te ayudaría, pero también estoy usando Logback en mi proyecto Spring-Boot
y la estructura es la siguiente.
Archivo: logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="logback.xsd">
<property resource="/application.properties"/>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${app.logPathPrefix}/myproject.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${app.logPathPrefix}/myproject.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%logger:%line] %msg%n
</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%logger:%line] %msg%n
</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="INFO" />
<logger name="com.mycompany" level="INFO" />
<logger name="org.hibernate" level="DEBUG" />
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
Archivo: application.properties
app.logPathPrefix=/var/log/myproject
Si está en Spring Boot, entonces puede agregar directamente las siguientes propiedades en el archivo application.properties para establecer el nivel de registro, personalizar el patrón de registro y almacenar registros en el archivo externo.
Estos son diferentes niveles de registro y su orden desde el mínimo << máximo.
OFF << FATAL << ERROR << WARN << INFO << DEBUG << TRACE << TODOS
# To set logs level as per your need.
logging.level.org.springframework = debug
logging.level.tech.hardik = trace
# To store logs to external file
# Here use strictly forward "/" slash for both Windows, Linux or any other os, otherwise, your logs it won''t work.
logging.file=D:/spring_app_log_file.log
# To customize logging pattern.
logging.pattern.file= "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
Pase por este enlace para personalizar sus registros de manera más vívida.
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html
Si está utilizando Maven agregue la dependencia:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
Ahora tiene que especificar un archivo que se llama ''log4j.properties'' que debe colocar en el directorio específico: ''src / main / resources / log4j.properties''
Aquí es cómo el archivo debe mirar por ejemplo:
# Root logger option
log4j.rootLogger=INFO, file, stdout
log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# log4j.appender.springlog.Threshold=INFO
log4j.appender.springlog.layout=org.apache.log4j.PatternLayout
log4j.appender.springlog.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=D:/example/filename.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Ahora importa estos:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Declara una variable logger como esta:
final static Logger logger = Logger.getLogger(TheClassYourIn.class);
Y utilízalo en la clase así:
logger.info("Well hello world then ");
De esta manera funciona para mí. Espero que esta respuesta te ayude. Buena suerte !
PS: log4j.appender.file.File = ''directorio'' es la forma en que especifica dónde se almacenarán los registros. Si no especifica un directorio y simplemente lo deja como filename.log, este archivo se creará automáticamente en el directorio del proyecto.
Yo tuve el mismo problema. Es más que probable debido a los permisos de archivos en el sistema de archivos. Tenía la carpeta de la aplicación propiedad de root, pero ./logs era propiedad del propietario del proceso. Como tal, lo siguiente no funcionó:
logging.file = my.log
pero esto hizo
logging.file = / opt / myapp / logs / my.log