[JAVA] Steuerprotokollausgabe mit Doma2

Es ist [null] verantwortlich für den 4. Tag (https://qiita.com/YujiSoftware/items/2dc002977e730a3293fd#%E3%81%BE%E3%81%A8%E3%82%81).

Standardmäßig werden viele Protokolle auf INFO-Ebene ausgegeben. Kontrollieren Sie dies.

Umgebung

Java

openjdk 11.0.1 2018-10-16

Doma2

2.19.3

doma-spring-boot

1.1.1

Spring Boot

2.1.1

Quelle (Teil)

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());
		}
	}
}

Ausführungsergebnis

2018-12-03 22:32:25.979  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2220] ENTER  :Klasse=[sample.springboot.doma2.TestTableDaoImpl],Methode=[findAll]
2018-12-03 22:32:26.038  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]SQL-Protokoll:SQL-Datei=[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   :Klasse=[sample.springboot.doma2.TestTableDaoImpl],Methode=[findAll]
[]
2018-12-03 22:32:26.049  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2220] ENTER  :Klasse=[sample.springboot.doma2.TestTableDaoImpl],Methode=[insert]
2018-12-03 22:32:26.068  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]SQL-Protokoll:SQL-Datei=[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   :Klasse=[sample.springboot.doma2.TestTableDaoImpl],Methode=[insert]
2018-12-03 22:32:26.072  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2220] ENTER  :Klasse=[sample.springboot.doma2.TestTableDaoImpl],Methode=[insert]
2018-12-03 22:32:26.072  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]SQL-Protokoll:SQL-Datei=[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   :Klasse=[sample.springboot.doma2.TestTableDaoImpl],Methode=[insert]
2018-12-03 22:32:26.072  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2220] ENTER  :Klasse=[sample.springboot.doma2.TestTableDaoImpl],Methode=[findAll]
2018-12-03 22:32:26.073  INFO 24784 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]SQL-Protokoll:SQL-Datei=[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   :Klasse=[sample.springboot.doma2.TestTableDaoImpl],Methode=[findAll]
[TestTable{id=1, name='foo'}, TestTable{id=2, name='bar'}]

Standardmäßig gibt es auf INFO-Ebene viele Protokolle zu Doma2. Da es nicht möglich ist, es in der Produktion so zu verschieben, wie es ist, geben Sie es auf die DEBUG-Ebene aus und steuern Sie verschiedene Dinge.

Doma2-Protokollausgabemechanismus

doma2.jpg

--Doma2-Protokollausgabe erfolgt über die JdbcLogger-Schnittstelle

AbstractJdbcLogger.java


package org.seasar.doma.jdbc;

...

public abstract class AbstractJdbcLogger<LEVEL> implements JdbcLogger {

    /**Standardprotokollstufe*/
    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( //★ Übergeben der Protokollebene des Instanzfelds
                        callerClassName, callerMethodName));
    }

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

...

UtilLoggingJdbcLogger.java


package org.seasar.doma.jdbc;

...

public class UtilLoggingJdbcLogger extends AbstractJdbcLogger<Level> {

    /**Der in dieser Instanz verwendete Logger.*/
    protected final Logger logger;

    ...
    public UtilLoggingJdbcLogger() {
        this(Level.INFO); //★ INFO-Ebene, wenn vom Standardkonstruktor generiert
    }

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

    ...

Ändern Sie den Standard-Protokollausgangspegel

Wenn Sie doma-spring-boot verwenden, können Sie Doma2 mit DomaConfigBuilder konfigurieren.

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); //★ Wird mit der Protokollstufe FINE generiert
	}

	@Bean
	public DomaConfigBuilder domaConfigBuilder() {
		DomaConfigBuilder builder = new DomaConfigBuilder();
		builder.jdbcLogger(jdbcLogger()); //★ Stellen Sie jdbcLogger ein
		return builder;
	}
}

Ausführungsergebnis


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

Ändern Sie die Protokollausgabepegel für jede Methode

Wenn Sie nur ein bestimmtes Protokoll auf einer anderen Ebene als der Standardprotokollebene ausgeben möchten, z. B. "Ich möchte nur SQL-Ausgabe auf der INFO-Ebene ausgeben", gehe ich wahrscheinlich wie folgt vor.

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;

//★ Erstellen Sie Ihren eigenen Logger, indem Sie UtilLoggingJdbcLogger erben
public class MyJdbcLogger extends UtilLoggingJdbcLogger {
    
    public MyJdbcLogger() {
        super(Level.FINE); //★ Die Standardprotokollstufe ist FEIN
    }

    //★ Überschreiben Sie die Protokollierungsmethode, die SQL ausgibt
    @Override
    protected void logSql(String callerClassName, String callerMethodName, Sql<?> sql, Level level, Supplier<String> messageSupplier) {
        //★ Argumentstufe(Standardprotokollstufe)Ignorieren und zwangsweise durch INFO ersetzen
        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(); //★ Verwenden Sie Ihren eigenen Logger
	}

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

Ausführungsergebnis


2018-12-03 23:09:34.627  INFO 18180 --- [           main] o.s.doma.jdbc.UtilLoggingJdbcLogger      : [DOMA2076]SQL-Protokoll:SQL-Datei=[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]SQL-Protokoll:SQL-Datei=[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]SQL-Protokoll:SQL-Datei=[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]SQL-Protokoll:SQL-Datei=[META-INF/sample/springboot/doma2/TestTableDao/findAll.sql],
SELECT *
  FROM TEST_TABLE
[TestTable{id=1, name='foo'}, TestTable{id=2, name='bar'}]

--Erstellen Sie Ihren eigenen Logger, indem Sie "UtilLoggingJdbcLogger" erben --Und Sie überschreiben die Protokollierungsmethode (protected), mit der Sie die Protokollebene ändern möchten, und ersetzen sie durch die Ebene, auf der Sie die Protokollebene ändern möchten.

Referenz


Das ist alles für den morgigen Java-Adventskalender, null.
</ del> Jemand! schreiben! !! !! !! </ del>

Die Gebühr für morgen beträgt @orekyuu.

Recommended Posts

Steuerprotokollausgabe mit Doma2
Die Tomcat 8.5-Protokollausgabe wurde durch Log4j2.8 oder höher ersetzt
Informationen zur Java-Protokollausgabe
Baue Doma1 mit Ant
FizzBuzz mit Stream ausgeben
Protokoll mit slf4j + Logback mit Maven in externe Datei ausgeben
Ausgabe einer CSV-Datei mit offener CSV
Protokollausgabe im Json-Format mit lograge / lograge-sql mit RubyOnRails
Java-Versionsverwaltung mit SDKMAN
Java-Versionsverwaltung mit jenv
Beispiel für eine Java-Standardprotokollausgabe
Verwalten Sie die CocoaPods-Version mit Docker
Ausgabe "Izumi Oishi" mit Dokojava
Excel mit Formeln mit XlsMapper ausgeben
Ausgabezeichen wie Konversation mit JavaFX
Datenbankverknüpfung mit doma2 (Spring Boot)
Protokollausgabe in Datei in Java
[SRE / Docker] Starten Sie die Steuerung mit Dockerize
PDF und TIFF mit Java 8 ausgeben
Protokollausgabe der WebServiceTemplate-Anforderung / Antwort
Spring Data JPA SQL-Protokollausgabe