UnsupportedCharsetException cp65001 [Question]
I've been trying to update the elasticsearch docker file to use es-5.5.1 Unfortunately some change to log4j is tripping over the windows codepage (see below). log4j 2.8.1 should have a fix but I see es-5.5 use 2.8.2. I've tried many things with both windowscore and nanoserver but to no avail.
I'm hoping that someone will "just know" what the magic incantation might be?
Thanks in advance
2017-07-29 19:36:23,185 main ERROR Unable to inject fields into builder class for plugin type class org.apache.logging.l
og4j.core.appender.ConsoleAppender, element Console. java.nio.charset.UnsupportedCharsetException: cp65001
at java.nio.charset.Charset.forName(Charset.java:531)
at org.apache.logging.log4j.util.PropertiesUtil.getCharsetProperty(PropertiesUtil.java:146)
at org.apache.logging.log4j.util.PropertiesUtil.getCharsetProperty(PropertiesUtil.java:134)
at org.apache.logging.log4j.core.appender.ConsoleAppender$Target.getCharset(ConsoleAppender.java:85)
at org.apache.logging.log4j.core.appender.ConsoleAppender$Target$1.getDefaultCharset(ConsoleAppender.java:71)
at org.apache.logging.log4j.core.appender.ConsoleAppender$Builder.build(ConsoleAppender.java:218)
at org.apache.logging.log4j.core.appender.ConsoleAppender$Builder.build(ConsoleAppender.java:185)
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:952)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:892
)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:884
)
at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:508)
at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:232)
at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:244)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:545)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:261)
at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:166)
at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:122)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:316)
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:123)
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:114)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:67)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:122)
at org.elasticsearch.cli.Command.main(Command.java:88)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84)
2017-07-29 19:36:23,200 main ERROR Unable to invoke factory method in class class org.apache.logging.log4j.core.appender
.ConsoleAppender for element Console. java.lang.IllegalStateException: No factory method found for class org.apache.logg
ing.log4j.core.appender.ConsoleAppender
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.findFactoryMethod(PluginBuilder.java:224)
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:130)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:952)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:892
)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:884
)
at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:508)
at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:232)
at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:244)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:545)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:261)
at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:166)
at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:122)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:316)
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:123)
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:114)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:67)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:122)
at org.elasticsearch.cli.Command.main(Command.java:88)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84)
2017-07-29 19:36:23,200 main ERROR Null object returned for Console in Appenders.
2017-07-29 19:36:23,200 main ERROR Unable to locate appender "STDOUT" for logger config "root"
I just bumped on the exact same issue.
It seems the codepage returned by CMD is not supported by log4j: https://issues.apache.org/jira/browse/LOG4J2-1888
This is a different problem than the one described here: https://stackoverflow.com/questions/42435814/why-is-log4j2-throwing-an-error-in-windows-bash-console (which is indeed fixed in 2.8.1)
Changing the codepage via chcp doesn't work.
I'm trying now to set the character set via the log4j.properties file.
Adding these two lines to the jvm.options file will do the trick:
Add-Content 'c:\elasticsearch\config\jvm.options' "`n-Dsun.stdout.encoding=UTF-8" ; \
Add-Content 'c:\elasticsearch\config\jvm.options' "`n-Dsun.err.encoding=UTF-8" ; \
Thanks @ffosselle. Can you capture that in the log4j file, or does it need to be in the JVM config?
@ffosselle splendid, thank you. I can confirm that works nicely for me.
Had a closer look at elasticsearch.bat. I can also confirm that adding
ENV ES_JAVA_OPTS="-Dsun.stdout.encoding=UTF-8 -Dsun.err.encoding=UTF-8"
works too.
The contents of the jvm.options file are concatenated into this var. Using the ENV line just gives it an initial value.
Choose which ever method floats your boat :)
666