[JAVA] Contrôle de la sortie du journal avec Doma2

Il est [nul] en charge du 4ème jour (https://qiita.com/YujiSoftware/items/2dc002977e730a3293fd#%E3%81%BE%E3%81%A8%E3%82%81).

Par défaut, de nombreux journaux sont générés au niveau INFO, alors contrôlez cela.

environnement

Java

openjdk 11.0.1 2018-10-16

Doma2

2.19.3

doma-spring-boot

1.1.1

Spring Boot

2.1.1

Source (partie)

build.gradle


buildscript {
	ext {
		springBootVersion = '2.1.1.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

sourceCompatibility = 11
targetCompatibility = 11

compileJava.options.encoding = "UTF-8"

repositories {
	mavenCentral()
}

dependencies {
	implementation('org.springframework.boot:spring-boot-starter-jdbc')
	implementation('org.seasar.doma.boot:doma-spring-boot-starter:1.1.1') {
		exclude group: 'org.seasar.doma', module: 'doma'
	}
	implementation('org.seasar.doma:doma:2.19.3')
	runtimeOnly('com.h2database:h2')
}

processResources.destinationDir = compileJava.destinationDir
compileJava.dependsOn processResources

TestTable.java


package sample.springboot.doma2;

import org.seasar.doma.Entity;
import org.seasar.doma.GeneratedValue;
import org.seasar.doma.GenerationType;
import org.seasar.doma.Id;
import org.seasar.doma.Table;

@Table(name = "TEST_TABLE")
@Entity
public class TestTable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;
    public String name;

    @Override
    public String toString() {
        return "TestTable{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

TestTableDao.java


package sample.springboot.doma2;

import org.seasar.doma.Dao;
import org.seasar.doma.Insert;
import org.seasar.doma.Select;
import org.seasar.doma.boot.ConfigAutowireable;

import java.util.List;

@Dao
@ConfigAutowireable
public interface TestTableDao {
    
    @Select
    List<TestTable> findAll();
    
    @Insert
    int insert(TestTable testTable);
}

Doma2Application.java


package sample.springboot.doma2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Doma2Application {

	public static void main(String[] args) {
		try (ConfigurableApplicationContext context = SpringApplication.run(Doma2Application.class, args)) {
			TestTableDao dao = context.getBean(TestTableDao.class);

			System.out.println(dao.findAll());

			TestTable foo = new TestTable();
			foo.name = "foo";
			dao.insert(foo);

			TestTable bar = new TestTable();
			bar.name = "bar";
			dao.insert(bar);

			System.out.println(dao.findAll());
		}
	}
}

Résultat d'exécution

2018-12-03 22:32:25.979  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2220] ENTER  :classe=[sample.springboot.doma2.TestTableDaoImpl],Méthode=[findAll]
2018-12-03 22:32:26.038  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]Journal SQL:Fichier SQL=[META-INF/sample/springboot/doma2/TestTableDao/findAll.sql],
SELECT *
  FROM TEST_TABLE
2018-12-03 22:32:26.049  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2221] EXIT   :classe=[sample.springboot.doma2.TestTableDaoImpl],Méthode=[findAll]
[]
2018-12-03 22:32:26.049  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2220] ENTER  :classe=[sample.springboot.doma2.TestTableDaoImpl],Méthode=[insert]
2018-12-03 22:32:26.068  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]Journal SQL:Fichier SQL=[null],
insert into TEST_TABLE (id, name) values (null, 'foo')
2018-12-03 22:32:26.071  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2221] EXIT   :classe=[sample.springboot.doma2.TestTableDaoImpl],Méthode=[insert]
2018-12-03 22:32:26.072  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2220] ENTER  :classe=[sample.springboot.doma2.TestTableDaoImpl],Méthode=[insert]
2018-12-03 22:32:26.072  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]Journal SQL:Fichier SQL=[null],
insert into TEST_TABLE (id, name) values (null, 'bar')
2018-12-03 22:32:26.072  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2221] EXIT   :classe=[sample.springboot.doma2.TestTableDaoImpl],Méthode=[insert]
2018-12-03 22:32:26.072  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2220] ENTER  :classe=[sample.springboot.doma2.TestTableDaoImpl],Méthode=[findAll]
2018-12-03 22:32:26.073  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]Journal SQL:Fichier SQL=[META-INF/sample/springboot/doma2/TestTableDao/findAll.sql],
SELECT *
  FROM TEST_TABLE
2018-12-03 22:32:26.075  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2221] EXIT   :classe=[sample.springboot.doma2.TestTableDaoImpl],Méthode=[findAll]
[TestTable{id=1, name='foo'}, TestTable{id=2, name='bar'}]

Par défaut, il existe de nombreux journaux sur Doma2 au niveau INFO. Puisqu'il n'est pas possible de le déplacer en production tel quel, sortez-le au niveau DEBUG et contrôlez diverses choses.

Mécanisme de sortie du journal Doma2

doma2.jpg

AbstractJdbcLogger.java


package org.seasar.doma.jdbc;

...

public abstract class AbstractJdbcLogger<LEVEL> implements JdbcLogger {

    /**Niveau de journal par défaut*/
    protected LEVEL defaultLevel;

    protected AbstractJdbcLogger(LEVEL level) {
        if (level == null) {
            throw new DomaNullPointerException("level");
        }
        this.defaultLevel = level;
    }

    @Override
    public void logDaoMethodEntering(String callerClassName,
            String callerMethodName, Object... args) {
        logDaoMethodEntering(callerClassName, callerMethodName, args,
                defaultLevel, () -> Message.DOMA2220.getMessage( //★ Passer le niveau de journalisation du champ d'instance
                        callerClassName, callerMethodName));
    }

    protected void logDaoMethodEntering(String callerClassName,
            String callerMethodName, Object args[], LEVEL level,
            Supplier<String> messageSupplier) {
        log(level, callerClassName, callerMethodName, null, messageSupplier);
    }

...

--Par exemple, logDaoMethodEntering () imprime le journal lorsque la méthode de Dao est lancée.

UtilLoggingJdbcLogger.java


package org.seasar.doma.jdbc;

...

public class UtilLoggingJdbcLogger extends AbstractJdbcLogger<Level> {

    /**L'enregistreur utilisé dans ce cas.*/
    protected final Logger logger;

    ...
    public UtilLoggingJdbcLogger() {
        this(Level.INFO); //★ niveau INFO lorsqu'il est généré par le constructeur par défaut
    }

    ...
    public UtilLoggingJdbcLogger(Level level) {
        this(level, Logger.getLogger(UtilLoggingJdbcLogger.class.getName()));
    }

    ...

--Si ʻUtilLoggingJdbcLoggerest généré avec le constructeur par défaut, le niveau de journalisation sera INFO. --Si vous ne spécifiez pas explicitement une instance deJdbcLogger dans les paramètres Doma2, ʻUtilLoggingJdbcLogger est généré par le constructeur par défaut, ce qui fait que tous les niveaux de sortie du journal sont INFO.

Modifier le niveau de sortie du journal par défaut

Si vous utilisez doma-spring-boot, vous pouvez configurer Doma2 en utilisant DomaConfigBuilder.

Doma2Application.java


package sample.springboot.doma2;

import org.seasar.doma.boot.autoconfigure.DomaConfigBuilder;
import org.seasar.doma.jdbc.JdbcLogger;
import org.seasar.doma.jdbc.UtilLoggingJdbcLogger;
...
import org.springframework.context.annotation.Bean;

import java.util.logging.Level;

@SpringBootApplication
public class Doma2Application {

	public static void main(String[] args) {
		try (ConfigurableApplicationContext context = SpringApplication.run(Doma2Application.class, args)) {
			...
		}
	}
	
	@Bean
	public JdbcLogger jdbcLogger() {
		return new UtilLoggingJdbcLogger(Level.FINE); //★ Généré avec le niveau de journal défini sur FINE
	}

	@Bean
	public DomaConfigBuilder domaConfigBuilder() {
		DomaConfigBuilder builder = new DomaConfigBuilder();
		builder.jdbcLogger(jdbcLogger()); //★ Réglez jdbcLogger
		return builder;
	}
}

Résultat d'exécution


[]
[TestTable{id=1, name='foo'}, TestTable{id=2, name='bar'}]

--Formé en définissant le niveau de journalisation sur FINE dans l'argument du constructeur de ʻUtilLoggingJdbcLogger et en le définissant sur jdbcLogger () ʻof DomaConfigBuilder.

Changer le niveau de sortie du journal pour chaque méthode

Si vous souhaitez afficher uniquement un journal spécifique à un niveau différent du niveau de journal par défaut, tel que "Je veux sortir uniquement la sortie SQL au niveau INFO", je fais probablement ce qui suit.

MyJdbcLogger.java


package sample.springboot.doma2;

import org.seasar.doma.jdbc.Sql;
import org.seasar.doma.jdbc.UtilLoggingJdbcLogger;

import java.util.function.Supplier;
import java.util.logging.Level;

//★ Créez votre propre enregistreur en héritant de UtilLoggingJdbcLogger
public class MyJdbcLogger extends UtilLoggingJdbcLogger {
    
    public MyJdbcLogger() {
        super(Level.FINE); //★ Le niveau de journalisation par défaut est FINE
    }

    //★ Remplacez la méthode de journalisation qui génère SQL
    @Override
    protected void logSql(String callerClassName, String callerMethodName, Sql<?> sql, Level level, Supplier<String> messageSupplier) {
        //★ Niveau d'argumentation(Niveau de journal par défaut)Ignorer et remplacer de force par INFO
        super.logSql(callerClassName, callerMethodName, sql, Level.INFO, messageSupplier);
    }
}

Doma2Application.java


package sample.springboot.doma2;

...

@SpringBootApplication
public class Doma2Application {

	public static void main(String[] args) {
		try (ConfigurableApplicationContext context = SpringApplication.run(Doma2Application.class, args)) {
			...
		}
	}
	
	@Bean
	public JdbcLogger jdbcLogger() {
		return new MyJdbcLogger(); //★ Utilisez votre propre enregistreur
	}

	@Bean
	public DomaConfigBuilder domaConfigBuilder() {
		DomaConfigBuilder builder = new DomaConfigBuilder();
		builder.jdbcLogger(jdbcLogger());
		return builder;
	}
}

Résultat d'exécution


2018-12-03 23:09:34.627  INFO 18180 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]Journal SQL:Fichier SQL=[META-INF/sample/springboot/doma2/TestTableDao/findAll.sql],
SELECT *
  FROM TEST_TABLE
[]
2018-12-03 23:09:34.656  INFO 18180 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]Journal SQL:Fichier SQL=[null],
insert into TEST_TABLE (id, name) values (null, 'foo')
2018-12-03 23:09:34.660  INFO 18180 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]Journal SQL:Fichier SQL=[null],
insert into TEST_TABLE (id, name) values (null, 'bar')
2018-12-03 23:09:34.661  INFO 18180 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]Journal SQL:Fichier SQL=[META-INF/sample/springboot/doma2/TestTableDao/findAll.sql],
SELECT *
  FROM TEST_TABLE
[TestTable{id=1, name='foo'}, TestTable{id=2, name='bar'}]

référence


C'est tout pour le calendrier de l'avent Java de demain, nul.
</ del> Quelqu'un! écrire! !! !! !! </ del>

La charge de demain sera @orekyuu.

Recommended Posts

Contrôle de la sortie du journal avec Doma2
Remplacement de la sortie du journal Tomcat 8.5 par Log4j2.8 ou version ultérieure
À propos de la sortie du journal Java
Construire Doma1 avec Ant
Sortie FizzBuzz avec flux
Journal de sortie vers un fichier externe avec slf4j + logback avec Maven
Sortie de fichier csv avec csv ouvert
Journaliser la sortie au format Json en utilisant lograge / lograge-sql avec RubyOnRails
Gestion des versions Java avec SDKMAN
Sortie CSV par Apache Commons CSV
Gestion des versions Java avec jenv
Exemple de sortie de journal standard Java
Gérer la version de CocoaPods avec Docker
Sortie "Izumi Oishi" avec dokojava
Sortie d'Excel avec des formules avec XlsMapper
Caractères de sortie comme une conversation avec JavaFX
Liaison de base de données avec doma2 (Spring boot)
Enregistrer la sortie dans un fichier en Java
[SRE / Docker] Démarrer le contrôle avec Dockerize
Sortie PDF et TIFF avec Java 8
Sortie du journal de la requête / réponse WebServiceTemplate
Sortie du journal Spring Data JPA SQL