Как показать заголовок в Выйти из журнала? - PullRequest
0 голосов
/ 30 августа 2018

Мне нужно показать версию проекта вверху, а затем журналы проекта в выводе журнала.

вот так,

0.0.1-SNAPSHOT
18:02:33.407 [main] DEBUG c.j.e.l.App - Starting debugging
18:02:33.410 [main] INFO  c.j.e.l.b.Message - The message is: Hello World!
18:02:33.410 [main] INFO  c.j.e.l.b.Message - The message is: Hello World!
18:02:33.412 [main] DEBUG c.j.e.l.App - Ending debugging

Но я не смог сделать эту часть заголовка.

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

Это мой logback.xml контент

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

    <!-- Send debug messages to System.out -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- By default, encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->

        <encoder>
        <pattern >%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.javacodegeeks.examples.logbackmavenexample.beans" level="INFO">
        <appender-ref ref="STDOUT" />
    </logger>

    <!-- By default, the level of the root level is set to DEBUG -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

А это мой pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javacodegeeks.examples</groupId>
    <artifactId>logbackmavenexample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>logbackmavenexample</name>
    <url>http://maven.apache.org</url>

    <properties>
        <junit.version>4.11</junit.version>
        <logback.version>1.1.2</logback.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <slf4j-api.version>1.7.7</slf4j-api.version>
    </properties>

    <dependencies>
        <!-- SLF4J - API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j-api.version}</version>
        </dependency>

        <!-- logback -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${logback.version}</version>
        </dependency>

        <!-- JUnit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                    <include>*</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Пожалуйста, предоставьте мне возможность показать версию проекта в верхней части моего журнала

1 Ответ

0 голосов
/ 30 августа 2018

Я обновил свой ответ.

Используйте maven-jar-plugin, чтобы поместить ваш project.version в MANIFEST.MF встроенного фляги. Поэтому поместите эти строки в плагины Maven:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                </manifest>
            </archive>
        </configuration>
    </plugin>

Это приведет (помимо прочего) к следующей записи в Манифесте:

Implementation-Version: 0.0.1-SNAPSHOT

Вы можете прочитать его с помощью следующего кода:

package com.javacodegeeks.examples.logbackmavenexample.beans;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyBean {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyBean.class);

    public static String getManifestInfo() {

        try {
            // reading all MANIFEST.MF from the classpath: from every jar/META-INF/MANIFEST.MF and every folder/META-INF/MANIFEST.MF and search for ours
            Enumeration<URL> resEnum = Thread.currentThread().getContextClassLoader()
                    .getResources(JarFile.MANIFEST_NAME);
            while (resEnum.hasMoreElements()) {
                try {
                    URL url = resEnum.nextElement();
                    InputStream is = url.openStream();
                    if (is != null) {
                        Manifest manifest = new Manifest(is);
                        Attributes mainAttribs = manifest.getMainAttributes();
                        // artifactId will be mapped to Implementation-Title
                        // so we can use it to identify our manifest file
                        if (!"logbackmavenexample".equals(mainAttribs.getValue("Implementation-Title"))) {
                            continue;
                        }
                        // found! return the version
                        String version = mainAttribs.getValue("Implementation-Version");
                        if (version != null) {
                            return version;
                        }
                    }
                } catch (Exception e) {
                    // Silently ignore wrong manifests on classpath?
                }
            }
        } catch (IOException e1) {
            // Silently ignore wrong manifests on classpath?
        }
        return null;
    }

    public static void main(String[] args) {
        LOGGER.info("{} started", MyBean.class.getName());
        // to print out the version ONLY without timestamp, classname, etc. I suggest to use sysout
        System.out.println(getManifestInfo());
        // however I would use this form:
        LOGGER.info("Version: {}", getManifestInfo());
    }
}

Я немного изменил ваш logback.xml (я добавил additivity = "false" , чтобы предотвратить дублирование строк журнала, когда этот регистратор и корневой регистратор активны одновременно):

<logger name="com.javacodegeeks.examples.logbackmavenexample.beans" level="INFO" additivity="false">
    <appender-ref ref="STDOUT" />
</logger>

Еще одна вещь, которую я заметил, что вы указали здесь более высокий уровень журнала (INFO), чем в корневом логгере (там вы указали DEBUG). Это привело к тому, что моя первая попытка ничего не регистрировала, потому что я использовал уровень DEBUG при вызове указанного регистратора в MyBean. Обычно это настраивается в обратном порядке, мы хотим, чтобы все регистрировалось только в INFO, а некоторые конкретные (в стадии разработки / критические части) пакеты - это журналы с DEBUG / TRACE и т. Д.

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