Page 1 of 1

How do I turn off logging for AbstractMessageWriter

PostPosted: Mon Apr 19, 2021 3:38 am
by VMSZealot
My apologies - it's another (I'm sure) stupid question (I'm still a Java noob). As before https://www.docx4java.org/forums/docx-java-f6/converting-docx-to-html-using-intellij-and-maven-t2978.html?sid=50d296c922fc798a947a6e3ec26538b0, this is IntelliJ and Maven.

The conversion works well (thank you) with the following code - except that there's an error message embedded in the output "TO HIDE THESE MESSAGES, TURN OFF debug level logging for org.docx4j.convert.out.common.writer.AbstractMessageWriter":

Maven:

Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
    <artifactId>DocumentConverter</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>15</source>
                    <target>15</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
            <version>8.2.9</version>
            <!--  <scope>test</scope>-->
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

        <!--  logging config files; docx4j.properties -->

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/log4j/log4j -->

        <dependency>
            <groupId>com.github.mayconmfl</groupId>
            <artifactId>log4j-configurator</artifactId>
            <version>1.0.0</version>
        </dependency>

    </dependencies>

</project>


Code:
Code: Select all
import org.docx4j.Docx4J;
import org.docx4j.Docx4jProperties;
import org.docx4j.convert.out.HTMLSettings;
import org.docx4j.convert.out.html.AbstractHtmlExporter;
import org.docx4j.convert.out.html.HtmlExporterNG2;
import org.docx4j.fonts.PhysicalFonts;
import org.docx4j.model.fields.FieldUpdater;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.org.apache.poi.util.IOUtils;

import java.io.*;

public class DocXTest {

    public static void docxToHTML(String filename, String outputname) throws FileNotFoundException, Docx4JException {
        String regex=".*(Courier New|Arial|Times New Roman|Comic Sans|Georgia|Impact|Lucida Console|Lucida Sans Unicode|Palatino Linotype|Tahoma|Trebuchet|Verdana|Symbol|Webdings|Wingdings|MS Sans Serif|MS Serif).*";
        PhysicalFonts.setRegex(regex);

        File file = new File(filename);
        FileInputStream inputStream = new FileInputStream(file);
        WordprocessingMLPackage pkg = WordprocessingMLPackage.load(inputStream);

        String root = System.getProperty("user.dir");

        FieldUpdater updater = new FieldUpdater(pkg);
        updater.update(true);

        AbstractHtmlExporter exporter = new HtmlExporterNG2();
        HTMLSettings htmlSettings = Docx4J.createHTMLSettings();
        htmlSettings.setWmlPackage(pkg);

        Docx4jProperties.setProperty("docx4j.Convert.Out.HTML.OutputMethodXML", true);

        OutputStream os = new FileOutputStream(root + "/" + outputname + ".html");
        Docx4J.toHTML(htmlSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
        IOUtils.closeQuietly(os);

        if (pkg.getMainDocumentPart().getFontTablePart() != null) {
            pkg.getMainDocumentPart().getFontTablePart()
                    .deleteEmbeddedFontTempFiles();
        }
        htmlSettings = null;
        pkg = null;
    }

    public static void main(String[] args) throws Exception {
        String parameter;
        if (args.length < 1) {
            System.out.println("No parameter supplied");
            System.exit(1);
        }
        parameter = args[0];

        docxToHTML(parameter, "testa");
    }
}


Configuration - which is in /src/main/configuration, and which I ripped from Github (without properly understanding it I'm afraid). I've set the configuration folder to be marked as 'sources' as suggested in a stack overflow answer, because I think that adds it to the class path and makes it available.
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

    <Appenders>


        <Console name="console">
            <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss} *%-5p* %c{1}: %m (%F, line %L)%n"/>
        </Console>

        <!-- error.log -->
        <File name="OFF" fileName="logs/docx4j.log" >
            <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss} *%-5p* %c{1}: %m (%F, line %L)%n"/>
        </File>

    </Appenders>

    <Loggers>

        <Logger name="org.apache.commons" level="OFF"/>
        <Logger name="org.apache.fop" level="OFF"/>

        <!--  docx4j loggers -->
        <Logger name="org.docx4j" level="OFF"/>


        <Logger name="org.docx4j.Docx4J" level="OFF"/>


        <Logger name="org.docx4j.TraversalUtil" level="OFF"/>


        <Logger name="org.docx4j.XmlUtils" level="OFF"/>


        <Logger name="org.docx4j.utils.ResourceUtils" level="OFF"/>


        <Logger name="org.docx4j.convert.in" level="OFF"/>


        <Logger name="org.docx4j.convert.in.xhtml" level="OFF"/>


        <Logger name="org.docx4j.convert.in.xhtml.ListHelper" level="OFF"/>


        <Logger name="org.docx4j.convert.out" level="OFF"/>


        <Logger name="org.docx4j.convert.out.common.AbstractConversionContext" level="OFF"/>


        <Logger name="org.docx4j.convert.out.common.Preprocess" level="OFF"/>


        <Logger name="org.docx4j.convert.out.common.preprocess" level="OFF"/>


        <Logger name="org.docx4j.convert.out.common.preprocess.FieldsCombiner" level="OFF"/>

        <!-- PDF output via XSL FO: change this to warn to hide messages -->
        <Logger name="org.docx4j.convert.out.common.writer.AbstractMessageWriter" level="OFF"/>


        <Logger name="org.docx4j.convert.out.fo" level="OFF"/>


        <Logger name="org.docx4j.convert.out.html.ListsToContentControls" level="OFF"/>


        <Logger name="org.docx4j.diff" level="OFF"/>


        <Logger name="com.topologi" level="OFF"/>


        <Logger name="org.docx4j.fonts" level="OFF"/>


        <Logger name="org.docx4j.fonts.PhysicalFonts" level="OFF"/>


        <Logger name="org.docx4j.fonts.RunFontSelector" level="OFF"/>


        <Logger name="org.docx4j.jaxb" level="OFF"/>


        <Logger name="org.docx4j.model" level="OFF"/>


        <Logger name="org.docx4j.model.fields" level="OFF"/>


        <Logger name="org.docx4j.model.listnumbering" level="OFF"/>


        <Logger name="org.docx4j.model.PropertyResolver" level="OFF"/>


        <Logger name="org.docx4j.model.structure" level="OFF"/>


        <Logger name="org.docx4j.model.styles" level="OFF"/>


        <Logger name="org.docx4j.model.table" level="OFF"/>


        <Logger name="org.docx4j.openpackaging" level="OFF"/>

        <Logger name="org.docx4j.convert.out.pdf.viaXSLFO" level="OFF"/>

        <Logger name="org.docx4j.openpackaging.io3" level="OFF"/>


        <Logger name="org.docx4j.openpackaging.packages" level="OFF"/>


        <Logger name="org.docx4j.openpackaging.parts" level="OFF"/>


        <Logger name="org.docx4j.openpackaging.parts.Parts" level="OFF"/>


        <Logger name="org.docx4j.openpackaging.parts.ThemePart" level="OFF"/>


        <Logger name="org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage" level="OFF"/>


        <Logger name="org.docx4j.openpackaging.parts.WordprocessingML.ObfuscatedFontPart" level="OFF"/>


        <Logger name="org.docx4j.services.client" level="debug"/>


        <Logger name="org.docx4j.toc" level="debug"/>


        <Logger name="org.docx4j.wml" level="OFF"/>


        <Logger name="org.docx4j.utils.XPathFactoryUtil" level="OFF"/>

        <Logger name="org.docx4j.org.xhtmlrenderer" level="OFF"/>

        <Logger name="org.pptx4j" level="OFF"/>


        <!--  OpenDoPE functionality loggers -->

        <Logger name="org.docx4j.model.datastorage" level="OFF"/>


        <Logger name="org.docx4j.model.datastorage.OpenDoPEHandlerComponents" level="OFF"/>


        <Logger name="org.docx4j.openpackaging.parts.CustomXmlDataStoragePart" level="OFF"/>


        <Logger name="org.docx4j.openpackaging.parts.XmlPart" level="OFF"/>


        <Logger name="org.opendope.conditions.Xpathref" level="OFF"/>


        <Logger name="org.opendope" level="OFF"/>



        <!--  Enterprise edition loggers -->

        <Logger name="com.plutext.merge" level="OFF"/>


        <Logger name="com.plutext.merge.CustomXmlPartHandler" level="OFF"/>


        <Logger name="com.plutext.merge.altchunk" level="OFF"/>


        <Logger name="com.plutext.merge.pptx" level="OFF"/>


        <Logger name="com.plutext.cmis" level="OFF"/>


        <Logger name="org.apache.jcp.xml.dsig.internal.dom" level="OFF"/>


        <Logger name="com.plutext.crypt.dsig" level="OFF"/>


        <Logger name="org.docx4j.openpackaging.parts.digitalsignature.XmlSignaturePart" level="OFF"/>


        <Logger name="com.plutext.demo.diagnostics" level="debug"/>

        <!--  Root logger -->
        <Root level="OFF">
            <AppenderRef ref="console"/>
        </Root>

    </Loggers>

</Configuration>


I've looked at the answers on this site (including their counterparts in places like Stack Overflow), and tried everything - and only succeeded in making a mess. I've tried subclassing log4j, I've tried configuration files - this is the closest that I've found to a solution that might be right - but it still doesn't work.

Ideally, I'd like a solution which allows me to turn on or off the level of logging using a parameter - but, failing that, I'd like to know what configuration I need to turn off logging.

Thank you in advance for any help that you can provide.

Re: How do I turn off logging for AbstractMessageWriter

PostPosted: Mon Apr 19, 2021 5:35 pm
by jason
You are using logback:

Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
 
Parsed in 0.001 seconds, using GeSHi 1.0.8.4


So you need the logback configuration XML: https://github.com/plutext/docx4j/blob/ ... ck.xml#L48 (this link points at the line you need to alter)

(Your post contains the log4j XML, which is only useful if you use log4j as the logging implementation)

Putting logback.xml in src/main/configuration ought to work....

Re: How do I turn off logging for AbstractMessageWriter

PostPosted: Mon Apr 19, 2021 7:14 pm
by VMSZealot
Thank you very much! That's great - and it fixed my noob problem. I think that's it all working now, thanks to your software and your help.