简体   繁体   English

从Docker容器将Log4j2日志写入远程服务器会出错

[英]Writing Log4j2 logs to remote server from Docker container gives error

I am using the Socket Appender of Log4j2 to write logs to a remote server. 我正在使用Log4j2的Socket Appender将日志写入远程服务器。 It was working fine when I was writing from a spring boot application. 当我从Spring Boot应用程序编写时,它运行良好。 After I containerized this app with docker and run as a docker container, it gives the following errors. 在使用docker容器化此应用程序并作为docker容器运行后,它出现以下错误。 What is the proper was to write to a remote server from a docker container? 从Docker容器写入远程服务器的正确方法是什么?

Errors 失误

kabilesh@kabilesh-Latitude-E6540:~/IdeaProjects/SpringResearch$ docker run -p 8080:8080 springappnew
2019-06-21 10:39:50,796 main ERROR TcpSocketManager (TCP:127.0.0.1:8000) java.net.ConnectException: Connection refused (Connection refused) java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at org.apache.logging.log4j.core.net.TcpSocketManager$TcpSocketManagerFactory.createSocket(TcpSocketManager.java:423)
        at org.apache.logging.log4j.core.net.TcpSocketManager$TcpSocketManagerFactory.createManager(TcpSocketManager.java:404)
        at org.apache.logging.log4j.core.net.TcpSocketManager$TcpSocketManagerFactory.createManager(TcpSocketManager.java:387)
        at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:112)
        at org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:114)
        at org.apache.logging.log4j.core.net.TcpSocketManager.getSocketManager(TcpSocketManager.java:201)
        at org.apache.logging.log4j.core.appender.SocketAppender.createSocketManager(SocketAppender.java:430)
        at org.apache.logging.log4j.core.appender.SocketAppender$Builder.build(SocketAppender.java:215)
        at org.apache.logging.log4j.core.appender.SocketAppender$Builder.build(SocketAppender.java:190)
        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.reconfigure(LoggerContext.java:617)
        at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:634)
        at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:229)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:152)
        at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
        at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
        at org.apache.commons.logging.LogFactory$Log4jLog.<clinit>(LogFactory.java:199)
        at org.apache.commons.logging.LogFactory$Log4jDelegate.createLog(LogFactory.java:166)
        at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:109)
        at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:99)
        at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:189)
        at com.springResearch.SpringRoot.main(SpringRoot.java:9)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)

2019-06-21 10:39:51,396 Log4j2-TF-1-AsyncLoggerConfig-1 ERROR Unable to write to stream TCP:127.0.0.1:8000 for appender socket: org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to TCP:127.0.0.1:8000 socket not available
2019-06-21 10:39:51,398 Log4j2-TF-1-AsyncLoggerConfig-1 ERROR An exception occurred processing Appender socket org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to TCP:127.0.0.1:8000 socket not available
        at org.apache.logging.log4j.core.net.TcpSocketManager.write(TcpSocketManager.java:213)
        at org.apache.logging.log4j.core.appender.OutputStreamManager.write(OutputStreamManager.java:201)
        at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.writeByteArrayToManager(AbstractOutputStreamAppender.java:186)
        at org.apache.logging.log4j.core.appender.SocketAppender.directEncodeEvent(SocketAppender.java:446)
        at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:170)
        at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:161)
        at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
        at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:448)
        at org.apache.logging.log4j.core.async.AsyncLoggerConfig.asyncCallAppenders(AsyncLoggerConfig.java:115)
        at org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigDisruptor.java:112)
        at org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigDisruptor.java:98)
        at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:129)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.6.RELEASE)

2019-06-21 10:39:51,616 Log4j2-TF-1-AsyncLoggerConfig-1 ERROR Unable to write to stream TCP:127.0.0.1:8000 for appender socket: org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to TCP:127.0.0.1:8000 socket not available
2019-06-21 10:39:51,617 Log4j2-TF-1-AsyncLoggerConfig-1 ERROR An exception occurred processing Appender socket org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to TCP:127.0.0.1:8000 socket not available
        at org.apache.logging.log4j.core.net.TcpSocketManager.write(TcpSocketManager.java:213)
        at org.apache.logging.log4j.core.appender.OutputStreamManager.write(OutputStreamManager.java:201)
        at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.writeByteArrayToManager(AbstractOutputStreamAppender.java:186)
        at org.apache.logging.log4j.core.appender.SocketAppender.directEncodeEvent(SocketAppender.java:446)
        at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:170)
        at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:161)
        at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
        at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:448)
        at org.apache.logging.log4j.core.async.AsyncLoggerConfig.asyncCallAppenders(AsyncLoggerConfig.java:115)
        at org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigDisruptor.java:112)
        at org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor$Log4jEventWrapperHandler.onEvent(AsyncLoggerConfigDisruptor.java:98)
        at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:129)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

2019-06-21 10:39:53.884  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-06-21 10:39:53.886  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.34
2019-06-21 10:39:53.905  INFO 1 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib]
2019-06-21 10:39:54.013  INFO 1 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext

In Client app 在客户端应用中

log4j2.xml (log4j2 configurations) log4j2.xml(log4j2配置)

<Configuration status="warn" name="SpringResearch" packages="com.springResearch">
    <Appenders>
        <Socket name="socket" host="127.0.0.1" port="8000">
            <SerializedLayout />
        </Socket>
    </Appenders>

    <Loggers>
        <AsyncRoot level="info">
            <AppenderRef ref="socket"/>
        </AsyncRoot>
    </Loggers>
</Configuration>

Dockerfile Docker文件

FROM java:8
EXPOSE 8080
ADD /target/SpringResearch-1.0-SNAPSHOT.jar SpringResearch-1.0-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "SpringResearch-1.0-SNAPSHOT.jar"]

I run the docker container as 我将docker容器运行为

docker run -p 8080:8080 springappnew

I use this - https://github.com/piruin/log4j2-socket-server as the app that listens to the socket appender. 我使用它-https://github.com/piruin/log4j2-socket-server作为侦听套接字追加程序的应用程序。 This is listening on localhost : port 8000 这正在localhost上侦听:端口8000

In log server app 在日志服务器应用程序中

log4j2.xml log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="SocketServerLog" monitorInterval="30">
  <Appenders>
    <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/info.log"
                 filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd-HH}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
        <SizeBasedTriggeringPolicy size="25 MB"/>
      </Policies>
    </RollingRandomAccessFile>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="RollingRandomAccessFile"/>
    </Root>
  </Loggers>
</Configuration>

Normally, you don't run the server in the same docker container as the application. 通常,您不会在与应用程序相同的Docker容器中运行服务器。 Therefore I assume that 127.0.0.1 is not correct, since this is the local docker container. 因此我认为127.0.0.1是不正确的,因为这是本地docker容器。 You have to put the correct name or ip, probably the name of the docker host. 您必须输入正确的名称或ip,可能是docker主机的名称。

As @jokster mentioned localhost (127.0.0.1) should be replaced with the IP of the host known inside the container. 正如@jokster提到的那样,应将本地主机(127.0.0.1)替换为容器内已知主机的IP。 You could use the following on the host to get it: 您可以在主机上使用以下命令获取它:

 ip r s 0/0 | awk '{print $3}

Then pass the IP as an environment variable to the container and use it in the log4j.xml configuration file. 然后将IP作为环境变量传递给容器,并在log4j.xml配置文件中使用它。 Refer to Environment Lookup in log4j docs 请参阅log4j 文档中的环境查找

As of Docker v18.03+ it seems that one can use host.docker.internal hostname 从Docker v18.03 +开始,似乎可以使用host.docker.internal主机名

More info: 更多信息:

Get Your Docker Host's IP Address from in a Container 从容器中获取Docker主机的IP地址

How to get the IP address of the docker host from inside a docker container 如何从Docker容器内部获取Docker主机的IP地址

Connect to a Database Running on Your Docker Host 连接到在Docker主机上运行的数据库

Hope that helps. 希望能有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM